IMCAT.DEV
로그인 가입
Dart 중급 네트워크

Dart REST API 연동

Dart REST API 연동 — 중급

REST API 연동

1. 도입 (왜 배워야 하는가)

현대의 애플리케이션 개발에서 REST API는 필수적인 요소입니다. REST API는 서로 다른 시스템 간의 데이터 통신을 가능하게 하며, 클라이언트와 서버 간의 상호작용을 효율적으로 관리합니다. 예를 들어, 모바일 앱이 웹 서버와 데이터(사용자 정보, 상품 목록 등)를 주고받을 때 REST API를 통해 이루어집니다.

이 토픽을 모르면, 다양한 외부 데이터 소스와의 연동이 불가능해져 애플리케이션의 기능이 제한될 수 있습니다. 결국, 고객의 요구를 충족시키지 못하고 경쟁에서 밀릴 수 있습니다.

2. 핵심 개념 설명

REST API

REST(Representational State Transfer) API는 HTTP 프로토콜을 기반으로 하는 아키텍처 스타일입니다. REST는 리소스(데이터)를 URI(Uniform Resource Identifier)로 식별하고, HTTP 메서드(GET, POST, PUT, DELETE 등)를 이용해 리소스를 조작합니다.

HTTP 메서드

메서드설명
GET리소스 조회
POST리소스 생성
PUT리소스 수정
DELETE리소스 삭제

비유하자면, REST API는 식당의 메뉴판과 같습니다. 메뉴판(URI)은 다양한 요리(리소스)를 나타내고, 주문(HTTP 메서드)를 통해 원하는 음식을 요청하는 방식입니다.

3. 기본 코드 예제

아래 코드는 Dart에서 HTTP GET 요청을 통해 데이터를 가져오는 기본 예제입니다.

import 'dart:convert';
import 'package:http/http.dart' as http;

void main() async {
  final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
  
  if (response.statusCode == 200) {
    List posts = json.decode(response.body);
    print(posts);
  } else {
    throw Exception('Failed to load posts');
  }
}

<!-- 실행 결과 -->

[{userId: 1, id: 1, title: '...', body: '...'}, ...]

코드 동작 설명

  1. import 'dart:convert';: JSON 데이터를 다루기 위해 필요한 패키지를 임포트합니다.
  2. import 'package:http/http.dart' as http;: HTTP 요청을 처리하기 위해 http 패키지를 임포트합니다.
  3. void main() async { ... }: 비동기 함수 main을 정의하여 API 요청을 처리합니다.
  4. final response = await http.get(...): GET 요청을 보내고, 응답을 기다립니다.
  5. if (response.statusCode == 200) { ... }: 응답 상태 코드가 200(성공)일 경우 데이터를 처리합니다.
  6. List posts = json.decode(response.body);: JSON 문자열을 Dart의 List로 변환합니다.
  7. print(posts);: 가져온 데이터를 콘솔에 출력합니다.
  8. else { throw Exception('...'); }: 요청 실패 시 예외를 발생시킵니다.
  9. 4. 실전 활용 예제

    1. 쇼핑몰 장바구니 구현

    쇼핑몰 애플리케이션에서 사용자가 선택한 상품을 장바구니에 추가할 때 POST 요청을 사용할 수 있습니다.

    void addToCart(String productId) async {
      final response = await http.post(
        Uri.parse('https://example.com/cart'),
        headers: {'Content-Type': 'application/json'},
        body: json.encode({'productId': productId}),
      );
    
      if (response.statusCode == 200) {
        print('상품이 장바구니에 추가되었습니다.');
      } else {
        print('장바구니 추가 실패: ${response.reasonPhrase}');
      }
    }

    2. 사용자 정보 업데이트

    사용자의 정보를 수정할 때는 PUT 요청을 활용할 수 있습니다.

    void updateUser(String userId, String newName) async {
      final response = await http.put(
        Uri.parse('https://example.com/users/$userId'),
        headers: {'Content-Type': 'application/json'},
        body: json.encode({'name': newName}),
      );
    
      if (response.statusCode == 200) {
        print('사용자 정보가 업데이트 되었습니다.');
      } else {
        print('정보 업데이트 실패: ${response.reasonPhrase}');
      }
    }

    5. 흔한 실수와 주의사항

    1. 상태 코드 체크를 하지 않기

    // 잘못된 코드
    final response = await http.get(Uri.parse('...'));
    // 상태 코드 체크 없음

    올바른 코드

    if (response.statusCode == 200) {
      // 성공 처리
    }

    상태 코드를 체크하지 않으면, 오류 발생 시 적절한 대응을 하지 못할 수 있습니다.

    2. JSON 인코딩/디코딩 실수

    // 잘못된 코드
    final posts = json.decode(response.body); // response.body가 JSON 형식이 아닐 경우

    올바른 코드

    if (response.headers['content-type'] == 'application/json') {
      final posts = json.decode(response.body);
    }

    응답의 Content-Type을 확인하여 JSON 데이터만 처리해야 합니다.

    6. 정리

    • REST API는 클라이언트와 서버 간의 데이터 교환을 효율적으로 처리합니다.
    • HTTP 메서드(GET, POST, PUT, DELETE)를 통해 리소스를 조작합니다.
    • 상태 코드 체크와 JSON 데이터 처리에 주의해야 합니다.

다음에 학습하면 좋은 주제는 Dart의 비동기 처리와 Flutter에서 REST API 활용하기입니다. 이러한 주제를 통해 REST API를 더욱 효율적으로 사용할 수 있는 방법을 배우게 될 것입니다.