웹 애플리케이션을 개발하다 보면, 클라이언트와 서버 간에 데이터를 주고받기 위해 RESTful API를 구현해야 할 때가 많습니다.
이 글에서는 Dart를 사용하여 RESTful API를 설계하고, CRUD 작업(Create, Read, Update, Delete)을 수행하기 위한 기본 API 엔드포인트를 어떻게 설계하는지 쉽게 설명해보겠습니다.
1. RESTful API란?
RESTful API는 Representational State Transfer (REST) 원칙을 따르는 API입니다. REST는 웹에서 자원을 처리하는 방식으로, HTTP 프로토콜을 사용하여 클라이언트와 서버 간의 통신을 정의합니다.
RESTful API의 기본 원칙은 다음과 같습니다
- Stateless: 각 요청은 독립적이어야 하며, 서버는 요청을 처리하는 데 필요한 모든 정보를 요청 자체에서 제공받아야 합니다.
- Client-Server Architecture: 클라이언트와 서버는 독립적이며, 클라이언트는 사용자 인터페이스를 담당하고 서버는 데이터 처리와 저장을 담당합니다.
- Uniform Interface: 클라이언트와 서버 간의 통신을 통일된 방식으로 처리하여 간단하게 만듭니다.
- Resource-Based: 자원은 URI를 통해 식별됩니다.
2. CRUD 작업이란?
CRUD는 데이터베이스에서 기본적으로 수행할 수 있는 네 가지 작업을 의미합니다:
- Create (생성): 새로운 데이터를 추가합니다.
- Read (조회): 기존 데이터를 조회합니다.
- Update (수정): 기존 데이터를 수정합니다.
- Delete (삭제): 기존 데이터를 삭제합니다.
이 네 가지 작업을 RESTful API를 통해 수행하면 클라이언트와 서버 간에 데이터를 효율적으로 주고받을 수 있습니다.
3. CRUD 작업을 위한 API 엔드포인트 설계
각 CRUD 작업에 대한 API 엔드포인트를 설계할 때는 다음과 같은 방식으로 URI와 HTTP 메서드를 정의합니다:
3.1 Create (생성)
- 메서드: POST
- URI: /users
- 설명: 새로운 사용자를 생성합니다.
- 요청 본문: 생성할 사용자 데이터 (예: 이름, 이메일 등)
POST /users
Content-Type: application/json
{
"name": "Alice",
"email": "alice@example.com"
}
응답
- 상태 코드: 201 Created
- 본문: 생성된 사용자의 정보 및 생성된 자원의 URI
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
3.2 Read (조회)
- 메서드: GET
- URI:
- /users (모든 사용자 조회)
- /users/{id} (특정 사용자 조회)
- 설명: 사용자 정보를 조회합니다.
예시
- 모든 사용자 조회
GET /users
- 특정 사용자 조회
GET /users/1
응답
- 상태 코드: 200 OK
- 본문: 사용자 정보
예시
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Alice",
"email": "alice@example.com"
}
3.3 Update (수정)
- 메서드: PUT
- URI: /users/{id}
- 설명: 기존 사용자의 정보를 수정합니다.
- 요청 본문: 수정할 사용자 데이터
예시
PUT /users/1
Content-Type: application/json
{
"name": "Alice Smith",
"email": "alice.smith@example.com"
}
응답
- 상태 코드: 200 OK
- 본문: 수정된 사용자 정보
예시
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 1,
"name": "Alice Smith",
"email": "alice.smith@example.com"
}
3.4 Delete (삭제)
- 메서드: DELETE
- URI: /users/{id}
- 설명: 특정 사용자를 삭제합니다.
예시
DELETE /users/1
응답
- 상태 코드: 204 No Content
- 본문: 없음 (삭제 성공을 나타냅니다)
4. Dart에서 RESTful API 서버 구현하기
Dart에서 RESTful API 서버를 구현하기 위해 shelf 패키지를 사용할 수 있습니다. 간단한 사용자 관리 API 예제를 통해 이를 구현해보겠습니다.
4.1 의존성 추가
pubspec.yaml 파일에 shelf와 shelf_router 패키지를 추가합니다.
dependencies:
shelf: ^1.4.0
shelf_router: ^1.1.0
4.2 서버 구현
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_router/shelf_router.dart';
void main() async {
final router = Router();
// 사용자 목록 조회
router.get('/users', (Request request) {
return Response.ok('{"users": ["Alice", "Bob"]}', headers: {'Content-Type': 'application/json'});
});
// 특정 사용자 조회
router.get('/users/<id>', (Request request, String id) {
return Response.ok('{"user": "$id"}', headers: {'Content-Type': 'application/json'});
});
// 사용자 생성
router.post('/users', (Request request) async {
final payload = await request.readAsString();
return Response.ok('{"status": "User created", "data": $payload}', headers: {'Content-Type': 'application/json'});
});
// 사용자 수정
router.put('/users/<id>', (Request request, String id) async {
final payload = await request.readAsString();
return Response.ok('{"status": "User updated", "id": "$id", "data": $payload}', headers: {'Content-Type': 'application/json'});
});
// 사용자 삭제
router.delete('/users/<id>', (Request request, String id) {
return Response.noContent();
});
// 서버 시작
final server = await io.serve(router.handler, 'localhost', 8080);
print('Server running on http://${server.address.host}:${server.port}');
}
설명
- Router를 사용해 각 엔드포인트를 정의합니다.
- GET, POST, PUT, DELETE 메서드를 통해 CRUD 작업을 수행하는 엔드포인트를 구현합니다.
- 서버는 localhost:8080에서 실행됩니다.
CRUD 작업을 위한 API 엔드포인트 설계는 웹 애플리케이션에서 데이터를 효과적으로 처리하기 위한 핵심 요소입니다.
각 작업에 대해 적절한 HTTP 메서드와 URI를 정의하여 RESTful API를 설계하면 클라이언트와 서버 간의 데이터 교환이 원활해집니다.
이 글을 통해 Dart에서 RESTful API를 설계하고 구현하는 기본 개념을 이해하시길 바랍니다!
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Dart > Dart Server' 카테고리의 다른 글
[중급] Dart 서버 프레임워크 이해하기/대표적인 Dart 서버 프레임워크 소개 (Aqueduct, Shelf ) (2) | 2024.09.09 |
---|---|
[초급] Dart RESTful API 설계 기초/ 경로 매개변수 및 쿼리 매개변수 처리 (0) | 2024.09.08 |
[초급] Dart RESTful API 설계 기초/RESTful API의 기본 원칙과 설계 (0) | 2024.09.08 |
[초급] Dart Server JSON 처리 및 데이터 직렬화/ 간단한 API 서버 구축하기: JSON 데이터 반환 및 처리 (0) | 2024.09.06 |
[초급] Dart Server JSON 처리 및 데이터 직렬화/ dart:convert 라이브러리를 사용한 JSON 인코딩/디코딩 (0) | 2024.09.06 |