Foundry
네트워크
기초
핵심

REST API 설계

리소스 중심, 무상태, HTTP 메서드 활용

REST API 설계

REpresentational State Transfer. 리소스 중심으로 HTTP를 활용한 API 설계 원칙.

REST의 핵심 원칙

1. 리소스 기반 URL (명사)
   /users, /posts, /orders

2. HTTP 메서드로 행위 표현
   GET, POST, PUT, DELETE

3. 무상태 (Stateless)
   각 요청은 독립적, 서버에 상태 없음

4. 표현(Representation)
   JSON, XML 등으로 리소스 표현

URL 설계 규칙

규칙좋은 예나쁜 예
명사 사용/users/getUsers
복수형/users/user
소문자/user-profiles/UserProfiles
계층 관계/users/1/posts/getUserPosts
동사 금지DELETE /users/1/deleteUser/1

CRUD 매핑

리소스: /users

POST   /users         → 생성 (201)
GET    /users         → 목록 (200)
GET    /users/1       → 상세 (200)
PUT    /users/1       → 전체 수정 (200)
PATCH  /users/1       → 부분 수정 (200)
DELETE /users/1       → 삭제 (204)

중첩 리소스

/users/1/posts       → 유저 1의 게시글
/users/1/posts/5     → 유저 1의 게시글 5
/posts/5/comments    → 게시글 5의 댓글

2단계까지만 중첩 권장
3단계 이상 → 쿼리 파라미터 사용

필터/정렬/페이징

용도요청 예
필터GET /users?role=admin&status=active
정렬GET /users?sort=created_at&order=desc
페이징GET /users?page=2&limit=20
검색GET /users?q=kim
필드 선택GET /users?fields=id,name,email

응답 형식

// 성공 (목록)
{
  "data": [...],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 150
  }
}

// 성공 (단일)
{
  "data": { "id": 1, "name": "Kim" }
}

// 에러
{
  "error": {
    "code": "NOT_FOUND",
    "message": "User not found"
  }
}

버전 관리

URL 방식:  /api/v1/users (가장 일반적)
헤더 방식: Accept: application/vnd.api+v1

실무 체크리스트

항목설명
일관된 응답 형식data/error 래퍼 통일
적절한 상태 코드200/201/204/400/404
페이지네이션대량 데이터 필수
Rate Limiting429 + Retry-After
인증Authorization 헤더
HATEOAS(선택) 링크 포함
면접에서 이렇게 나옵니다

Q.RESTful API의 핵심 원칙을 설명해주세요.

원칙
자원 중심URL 은 명사로 자원을 가리킨다. 동작은 메서드로
무상태서버가 요청 사이의 클라이언트 상태를 갖지 않는다
통일된 인터페이스같은 규칙으로 접근한다. 표준 메서드와 상태 코드
표현 분리자원과 그 표현(JSON, XML)을 구분한다
캐시 가능응답이 캐시 가능한지 명시한다
계층 구조중간에 프록시나 게이트웨이를 둘 수 있다

무상태가 주는 실익이 큽니다. 어느 서버로 가도 처리되므로 자유롭게 늘리고 줄일 수 있습니다.

흔한 실수: REST 를 URL 규칙으로만 이해하는 것. 경로를 명사로 쓰는 것은 일부이고, 무상태와 통일된 인터페이스가 본질입니다. 그리고 실무에서는 순수 REST 를 100% 지키기보다 팀 안에서 일관되게 쓰는 것이 더 중요합니다.

Q.REST API URL 설계 시 지켜야 할 규칙은?

규칙
명사 복수형으로 자원/orders, /users
동사는 경로에 넣지 않는다POST /orders (createOrder 아님)
계층은 경로로/users/1/orders
필터와 정렬은 쿼리로/orders?status=paid&sort=created_at
소문자와 하이픈/order-items
파일 확장자를 넣지 않는다Accept 헤더로 표현을 고른다
마지막 슬래시를 통일한다있거나 없거나 하나로

계층은 두 단계까지가 읽기 좋습니다. /users/1/orders/2/items/3 처럼 깊어지면 /order-items/3 으로 평평하게 만드는 편이 낫습니다.

흔한 실수: 자원으로 표현하기 어려운 동작에 억지 경로를 만드는 것. 검색이나 일괄 처리, 상태 전이는 하위 자원(/orders/1/cancel)이나 상태 필드 변경으로 표현하고 문서로 보완합니다.

Q.페이지네이션을 어떻게 구현하나요?

화면 성격에 따라 두 방식 중에 고릅니다.

방식요청강점약점
오프셋page 와 limit특정 페이지로 점프, 총 페이지 수 표시깊어질수록 느리고, 삽입 시 중복과 누락
커서마지막 항목 위치와 limit깊이와 무관하게 일정, 삽입에 안정적임의 페이지 점프가 어렵다
화면고를 방식
무한 스크롤, 피드, 알림커서
관리자 표, 페이지 번호가 필요한 화면오프셋

커서를 쓸 때는 정렬 키가 유일해야 합니다. created_at 만 쓰면 같은 시각의 항목이 페이지 경계에서 잘리므로 id 를 함께 넣습니다.

응답에는 다음 커서와 더 있는지 여부를 담습니다. 총 개수는 비싸므로 필요할 때만 별도로 제공합니다.

흔한 실수: 무한 스크롤에 오프셋을 쓰는 것. 새 글이 올라오면 이미 본 글이 다시 나오고 어떤 글은 건너뜁니다.

Q.REST API에서 버전 관리는 어떻게 하나요?

방식특징
경로/v1/users명확하고 캐시와 라우팅이 쉽다. 가장 흔하다
헤더Accept 에 버전 명시URL 이 깔끔하다. 테스트와 디버깅이 번거롭다
쿼리?version=2간단하지만 캐시 키가 지저분해진다

더 중요한 것은 언제 버전을 올리는가입니다.

변경버전 필요
필드 추가아니오. 모르는 필드는 무시된다
선택 파라미터 추가아니오
열거값 추가대개 아니오. 문서에 미리 명시해 둔다
필드 삭제나 이름 변경
필수 파라미터 추가
응답 구조 변경

버전을 올리면 유지 비용이 계속 듭니다. 그래서 필드 추가로 풀 수 있으면 그쪽이 낫고, 버전을 낼 때는 옛 버전 호출량 계측과 종료 계획을 함께 세웁니다.

흔한 실수: 버전을 냈는데 계측이 없어 옛 버전을 영원히 유지하는 것.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

네트워크 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.