RESTful API 설계 원칙과 네이밍 컨벤션
1. RESTful API란?
RESTful API는 REST(Representational State Transfer) 아키텍처 스타일을 따르는 API입니다.
HTTP 프로토콜을 기반으로 자원(Resource)을 URI로 식별하고, HTTP 메서드를 통해 자원에 대한 행위(CRUD)를 정의합니다.
REST의 핵심 개념
- 자원(Resource): URI로 식별되는 객체 (예:
/users
) - 행위(Verb): HTTP Method로 표현 (GET, POST, PUT, DELETE)
- 표현(Representation): JSON, XML 등으로 자원의 상태 전달
- 무상태성(Stateless): 요청 간 상태를 서버에 저장하지 않음
2. RESTful API 설계 원칙
2.1 자원은 URI로 고유하게 식별
- URI는 자원의 위치가 아닌 식별자 역할
- 예시:
/users
→ 사용자 컬렉션/users/1
→ 특정 사용자
2.2 HTTP 메서드를 목적에 맞게 사용
메서드 | 목적 | 설명 |
---|---|---|
GET | 조회 (Read) | 자원 조회. 멱등성 O, |
POST | 생성 (Create) | 새 자원 생성. 멱등성 X |
PUT | 전체 수정 (Update) | 자원 전체 수정. 멱등성 O |
PATCH | 부분 수정 | 자원 일부 수정. 멱등성 X |
DELETE | 삭제 (Delete) | 자원 삭제. 멱등성 O |
💡 멱등성: 동일 요청을 여러 번 보내도 결과가 같음
2.3 무상태(Stateless) 구조
- 각 요청은 독립적이어야 함
- 서버는 클라이언트의 이전 상태를 저장하지 않음
- 인증은
Authorization
헤더에 토큰(JWT 등)으로 전달
2.4 일관된 자원 표현 사용
- 주로 JSON 형식을 사용
- 응답 구조는 통일성 있게 유지
- 클라이언트는
Accept
헤더로 원하는 포맷 지정 가능
예시 응답(JSON)
{
"id": 1,
"name": "Seunga",
"email": "seunga@example.com"
}
3. RESTful API 네이밍 컨벤션
3.1 자원명은 명사로 표현
- 자원의 의미가 명확하게 드러나야 함
/getUser
(X) →/users
(O)
3.2 자원은 복수형으로 사용
패턴 | 예시 | 설명 |
---|---|---|
복수 자원 조회 | /users | 사용자 목록 조회 |
단일 자원 접근 | /users/1 | ID가 1인 사용자 조회 |
하위 자원 조회 | /users/1/posts | 사용자 1의 게시글 목록 |
💡셀 수 없는 명사(data, info 등)는 단수 그대로 사용
3.3 소문자 사용
- URI는 모두 소문자로 구성
- (O)
/user-posts
- (X)
/UserPosts
- (O)
3.4 단어 구분은 하이픈(-) 사용
- 가독성과 URI 표준을 위해 하이픈 사용
- (O)
/user-posts
- (X)
/userPosts
,/user_posts
- (O)
3.5 계층 구조로 관계 표현
- 자원 간 포함 관계를 계층 구조로 표현
/users/1/posts/2/comments
3.6 쿼리 파라미터는 필터링, 정렬 등에 사용
GET /users?page=2&limit=20&sort=name
4. 응답 및 상태 코드 규칙
4.1 HTTP 상태 코드
상태 코드 | 의미 |
---|---|
200 OK | 요청 성공 |
201 Created | 자원 생성 성공 |
204 No Content | 요청 성공, 본문 없음 |
400 Bad Request | 잘못된 요청 |
401 Unauthorized | 인증 실패 |
403 Forbidden | 권한 없음 |
404 Not Found | 자원 없음 |
500 Internal Server Error | 서버 내부 오류 |
4.2 에러 응답 포맷 예시
{
"status": 400,
"message": "Invalid request parameter",
"errorCode": "ERR_BAD_REQUEST"
}
5. 결론
RESTful API는 표준 HTTP 프로토콜을 바탕으로 자원 중심의 설계를 통해 API를 일관성 있게, 예측 가능하게, 확장 가능하게 만듭니다.
💡RESTful하게 설계하되, 상황에 따라 유연하게 적용하는 것이 가장 중요합니다.