본문 바로가기

기술 학습

백엔드 개발자를 위한 REST API 설계 원칙과 베스트 프랙티스

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 예제 (사용자 인증 시스템)

json
복사편집
# 회원 가입 요청 POST /users { "email": "user@example.com", "password": "securePassword123", "name": "John Doe" } # 로그인 요청 (JWT 발급) POST /auth/login { "email": "user@example.com", "password": "securePassword123" } # 특정 사용자 조회 (인증 필요) GET /users/1 Authorization: Bearer <JWT_TOKEN>

📌 실무 경험 Tip:

  • 모든 API 요청에 Bearer <JWT_TOKEN>을 포함하도록 설정
  • 비밀번호는 절대 평문 저장하지 말고 bcrypt 등의 해싱 알고리즘을 사용
  • 로그인 실패 시, 응답 메시지에 "이메일 또는 비밀번호가 잘못되었습니다."라고 표기해 공격자가 특정 정보를 추측하지 못하도록 해야 함

5. 결론

REST API 설계는 단순한 데이터 교환 이상의 의미를 갖습니다.
✅ 올바른 URI 구조HTTP 메서드 활용
✅ 적절한 HTTP 상태 코드 반환
✅ 강력한 보안 및 인증 처리
이러한 요소를 고려하면 확장성 있고 유지보수하기 쉬운 API를 만들 수 있습니다.

더 깊이 있는 API 설계 가이드를 원한다면, 다음 글에서 "GraphQL과 비교한 REST API의 한계점"을 다뤄보겠습니다.