1. REST API란?
REST(Representational State Transfer)는 웹 서비스 설계를 위한 아키텍처 스타일입니다. REST API는 HTTP 프로토콜을 기반으로 클라이언트와 서버 간 데이터를 주고받는 방식으로, 현재 웹 및 모바일 애플리케이션의 백엔드에서 가장 널리 사용됩니다.
✅ REST API를 올바르게 설계해야 하는 이유
많은 초보 개발자들은 REST API를 단순한 데이터 통신 방식으로 생각하지만, 잘못된 API 설계는 유지보수성과 확장성 문제를 유발할 수 있습니다.
- 일관되지 않은 URI 구조 → 새로운 기능 추가 시 복잡도가 증가
- 잘못된 HTTP 메서드 사용 → 클라이언트 개발자가 API를 이해하는 데 혼란 초래
- 비효율적인 응답 구조 → 성능 저하 및 불필요한 데이터 전송
이러한 문제를 방지하려면, RESTful 원칙을 준수하면서도 실무에 적합한 API 설계 방법을 적용해야 합니다.
2. REST API 설계 원칙 (Best Practices)
🔹 2.1 리소스(Resource)와 엔드포인트 설계
REST API의 핵심은 **리소스(자원)**를 어떻게 정의하고 엔드포인트(URL)를 설계하는지에 달려 있습니다.
리소스는 일반적으로 명사로 표현되며, 계층적 구조를 따르는 것이 좋습니다.
✅ 올바른 URI 설계 예시 (실무 적용 가능)
리소스올바른 URL잘못된 URL
사용자 목록 조회 | GET /users | GET /getUsers |
특정 사용자 조회 | GET /users/{id} | GET /users?id=1 |
사용자 추가 | POST /users | POST /addUser |
사용자 정보 수정 | PUT /users/{id} | POST /updateUser |
사용자 삭제 | DELETE /users/{id} | POST /deleteUser |
📌 실무 경험 Tip:
1️⃣ 리소스에는 동작(Verb)을 넣지 않는다. (/getUsers ❌ → /users ✅)
2️⃣ 쿼리 스트링 대신 RESTful URI를 활용한다. (/users?id=1 ❌ → /users/1 ✅)
3️⃣ 컬렉션과 개별 리소스를 구분한다.
- 모든 사용자 조회: GET /users
- 특정 사용자 조회: GET /users/{id}
🔹 2.2 HTTP 메서드 활용하기
REST API에서는 HTTP 메서드를 올바르게 사용하는 것이 중요합니다.
이 원칙을 어기면, API 사용자는 불필요한 혼란을 겪게 됩니다.
HTTP 메서드역할예시특징
GET | 리소스 조회 | GET /users/1 | 바디 없음, 캐싱 가능 |
POST | 리소스 생성 | POST /users | 멱등성 없음(중복 데이터 가능) |
PUT | 리소스 전체 수정 | PUT /users/1 | 기존 데이터 전체 교체 |
PATCH | 리소스 일부 수정 | PATCH /users/1 | 변경할 필드만 업데이트 |
DELETE | 리소스 삭제 | DELETE /users/1 | 응답으로 204 No Content 권장 |
📌 실무 경험 Tip:
- PUT과 PATCH의 차이를 명확히 구분해야 한다.
- PUT은 기존 데이터를 완전히 교체하는 용도
- PATCH는 일부 필드만 변경하는 용도
- DELETE 요청 후 보통 204 No Content를 응답하지만, 데이터 복구가 가능하도록 논리적 삭제(soft delete)를 고려할 것.
- DELETE /users/1 → update users set deleted_at = now() where id = 1;
🔹 2.3 HTTP 상태 코드(Status Code) 사용
적절한 HTTP 상태 코드를 사용하면 클라이언트가 요청 결과를 명확하게 이해할 수 있습니다.
상태 코드의미예시
200 OK | 요청 성공 | GET /users/1 |
201 Created | 리소스 생성 성공 | POST /users |
204 No Content | 삭제 성공 | DELETE /users/1 |
400 Bad Request | 잘못된 요청 | 필수 데이터 누락 |
401 Unauthorized | 인증 실패 | JWT 토큰 없음 |
403 Forbidden | 접근 권한 없음 | 관리자가 아닌 경우 |
404 Not Found | 리소스 없음 | GET /users/999 |
409 Conflict | 데이터 충돌 | 중복 이메일 가입 |
500 Internal Server Error | 서버 에러 | 예기치 않은 오류 발생 |
📌 실무 경험 Tip:
- 500 Internal Server Error는 가능한 한 피해야 한다.
- 내부적으로 발생한 예외를 400, 404, 409 등으로 세분화
- 401 Unauthorized와 403 Forbidden을 혼동하지 말 것.
- 401: 인증되지 않은 사용자
- 403: 인증은 되었지만 권한이 없음
3. REST API 보안 베스트 프랙티스
🔹 3.1 인증(Authentication)과 권한 관리(Authorization)
REST API 보안을 위해 보통 JWT(Json Web Token) 또는 OAuth 2.0을 사용합니다.
📌 실무 경험 Tip:
- JWT를 사용할 경우, 액세스 토큰(access token)과 리프레시 토큰(refresh token)을 분리할 것.
- API 요청마다 데이터베이스에서 권한을 조회하면 성능이 저하될 수 있으므로, Redis 등을 이용한 캐싱을 고려해야 한다.
4. 실무에서의 REST API 설계 사례
📌 잘 설계된 REST API 예제 (사용자 인증 시스템)
📌 실무 경험 Tip:
- 모든 API 요청에 Bearer <JWT_TOKEN>을 포함하도록 설정
- 비밀번호는 절대 평문 저장하지 말고 bcrypt 등의 해싱 알고리즘을 사용
- 로그인 실패 시, 응답 메시지에 "이메일 또는 비밀번호가 잘못되었습니다."라고 표기해 공격자가 특정 정보를 추측하지 못하도록 해야 함
5. 결론
REST API 설계는 단순한 데이터 교환 이상의 의미를 갖습니다.
✅ 올바른 URI 구조와 HTTP 메서드 활용
✅ 적절한 HTTP 상태 코드 반환
✅ 강력한 보안 및 인증 처리
이러한 요소를 고려하면 확장성 있고 유지보수하기 쉬운 API를 만들 수 있습니다.
더 깊이 있는 API 설계 가이드를 원한다면, 다음 글에서 "GraphQL과 비교한 REST API의 한계점"을 다뤄보겠습니다.
'기술 학습' 카테고리의 다른 글
JAVA 컬렉션 프레임워크 (Collection Framework) (1) | 2025.02.10 |
---|---|
JAVA 기초 개념과 실습 예제 (0) | 2025.02.09 |
AI 코딩 비서, 어디까지 써봤니? 개발자의 AI 활용 일기 (1) | 2025.02.08 |
Spring Boot에서 REST API 설계 및 구현 (1) | 2025.02.07 |
Spring Boot에서 JWT를 활용한 인증 구현 (1) | 2025.02.05 |