REST는 "이렇게 하면 좋은 설계다"는 원칙이고,
RESTful은 "그 원칙을 잘 지켜 만든 API"를 말합니다.
| 구분 | REST | RESTful |
|---|---|---|
| 의미 | 아키텍처 스타일 (설계 원칙) | REST를 잘 지킨 API 구현 방식 |
| 성격 | 개념 (철학, 이론) | 구현 (적용 수준) |
| 역할 | 어떤 방식으로 시스템을 설계해야 하는가 | 그 설계 원칙을 실천한 API를 어떻게 만들었는가 |
| 주체 | 이론적 정의 (Roy Fielding 논문) | 개발자가 실제로 만든 API 설계 |
| 예시 | 클라이언트-서버, Stateless, URI 기반 리소스 식별 | /users, /users/1 같은 REST 기반 API 설계 |
즉, REST는 철학이고, RESTful은 실천입니다.
Roy Fielding이 정의한 REST의 핵심 제약 조건들:
| 조건 | 좋은 예시 | 나쁜 예시 |
|---|---|---|
| 리소스는 URI로 표현 | /users, /posts/1 | /getUserById |
| HTTP 메서드는 행위를 표현 | GET, POST, PUT, DELETE | 모든 요청에 POST 사용 |
| URI에는 동사 대신 명사 사용 | /users ✅ | /getUser ❌ |
| 계층 구조 표현 | /users/1/posts/5 | /user-post-5 |
| 상태 코드 적절히 활용 | 200, 201, 404, 500 | 항상 200 반환 |
| 일관된 네이밍 규칙 | kebab-case 또는 camelCase 통일 | 혼재 사용 |
| 리소스는 복수형 명사 사용 | /users, /users/1 | /user, /user/1 (컬렉션 의미가 불분명) |
/users, /posts/1 등/getUserById (행위가 포함됨)/users, /orders/123/getUser, /createOrder 등/users/1/posts/5 (1번 유저의 5번 게시글)/user-post-5200 OK, 201 Created400 Bad Request, 404 Not Found, 500 Internal Server Error 등200 OK만 반환/user-profile, getUserInfo (혼용) /users → 사용자 목록, /users/1 → 1번 사용자/user, /user/1 (컬렉션 의미가 불분명)GET /getUser?id=1
POST /updateUser?id=1
GET /getUserPosts?userId=1
POST /deleteUser?id=1
DELETE /user/delete/1
PUT /users/1/activate
GET /users/1
PUT /users/1
GET /users/1/posts
DELETE /users/1
PATCH /users/1 (상태 변경은 body에서)
// GET /users/1
{
"id": 1,
"name": "김개발",
"email": "dev@example.com",
"created_at": "2024-01-01T00:00:00Z"
}
// GET /users
{
"data": [
{
"id": 1,
"name": "김개발",
"email": "dev@example.com"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 50
}
}
// 404 Not Found
{
"error": {
"code": "USER_NOT_FOUND",
"message": "사용자를 찾을 수 없습니다",
"details": {
"user_id": 999
}
}
}