REST API

한눈에 보기

REST는 HTTP의 설계 의도를 활용해 자원을 URI로 식별하고 메서드로 행위를 표현하는 아키텍처 스타일이다. 여섯 가지 제약 조건과 URI 설계 원칙, 버전 관리, GraphQL과 gRPC와의 비교를 정리한다.

최종 업데이트 2026.09.17

REST(Representational State Transfer)는 HTTP의 설계 의도를 그대로 활용해 분산 시스템을 만드는 아키텍처 스타일이며, REST API는 이 원칙에 따라 자원(Resource)을 URI(Uniform Resource Identifier)로 식별하고 HTTP 메서드로 행위를 표현하는 API를 말한다. 핵심은 무엇을(자원) URI에, 어떻게(행위) 메서드에 나누어 담는 역할 분리이며, 이 규약 덕분에 클라이언트와 서버가 서로의 내부 구현을 몰라도 일관된 방식으로 소통할 수 있다.

REST의 제약 조건

REST는 로이 필딩(Roy Fielding)의 박사 논문에서 정리된 여섯 가지 제약 조건으로 정의된다. 클라이언트-서버 구조는 화면과 데이터 저장의 관심사를 분리해 독립적인 진화를 가능하게 한다. 무상태(Stateless)는 각 요청이 처리에 필요한 정보를 전부 담아야 하고 서버가 클라이언트의 상태를 세션처럼 기억하지 않아야 한다는 제약으로, 어느 서버가 받아도 같은 결과가 나오므로 수평 확장이 쉬워진다. 캐시 가능(Cacheable)은 응답에 캐시 가능 여부를 명시해 중간 계층이 응답을 재사용할 수 있게 한다. 계층화 시스템(Layered System)은 클라이언트가 최종 서버에 직접 붙었는지 프록시를 거쳤는지 알 필요가 없게 한다. 균일한 인터페이스(Uniform Interface)는 자원 식별, 표현을 통한 조작, 자기 서술적 메시지, HATEOAS(Hypermedia as the Engine of Application State)를 포함하는 가장 REST다운 제약이다. 마지막으로 주문형 코드(Code on Demand)는 선택 사항이다. 실무 API 대부분은 HATEOAS까지 지키지 않으므로, 엄밀한 의미의 REST가 아니라 REST 스타일을 따르는 HTTP API라고 부르는 것이 정확하다는 논점도 알아 둘 만하다.

자원 중심 URI와 메서드 설계

REST 설계의 첫 규칙은 URI에 동사가 아니라 명사를 쓰는 것이다. 행위는 메서드가 표현한다.

좋은 설계
GET    /users            사용자 목록 조회
POST   /users            사용자 생성
GET    /users/42         42번 사용자 조회
PATCH  /users/42         42번 사용자 부분 수정
DELETE /users/42         42번 사용자 삭제
GET    /users/42/orders  42번 사용자의 주문 목록

나쁜 설계
GET  /getUserList
POST /deleteUser?id=42

컬렉션은 복수형 명사로, 개별 자원은 식별자를 붙인 경로로 표현하고, 소속 관계는 계층 경로로 나타낸다. 필터링, 정렬, 페이지네이션(Pagination)은 경로가 아니라 쿼리 문자열로 처리한다. 예를 들어 GET /articles?category=web&sort=latest&page=2처럼 쓴다. 상태 변경 결과는 상태 코드로 알린다. 생성엔 201 Created와 Location 헤더, 본문 없는 성공엔 204 No Content, 잘못된 요청엔 400, 권한 문제엔 401과 403을 구분해 쓰는 것이 표준적인 조합이다. 검색처럼 자원 개념에 딱 맞지 않는 행위는 POST /orders/42/cancel처럼 행위를 하위 자원으로 모델링하는 실용적 절충이 흔히 쓰인다.

버전 관리와 문서화, 그리고 실무 관심사

공개 API는 하위 호환을 깨는 변경에 대비해 버전 전략이 필요하다. URI에 버전을 넣는 /v1/users 방식이 가장 흔하고, 헤더로 버전을 협상하는 방식도 있다. 응답 형식은 JSON(JavaScript Object Notation)이 사실상 표준이며, 오류 응답은 상태 코드와 함께 기계가 해석할 수 있는 오류 코드와 사람이 읽을 메시지를 일관된 구조로 담는 것이 좋다. API 명세는 OpenAPI 명세(OpenAPI Specification)로 작성해 문서와 클라이언트 코드 생성, 테스트를 자동화하는 것이 현재 관행이고, 스웨거(Swagger) 도구군이 널리 쓰인다. 이 밖에 무상태 원칙과 짝을 이루는 토큰 기반 인증, 과도한 호출을 제어하는 사용량 제한(Rate Limiting), 브라우저 교차 출처 호출을 위한 CORS(Cross-Origin Resource Sharing) 설정이 실무 설계의 단골 관심사다.

다른 API 스타일과의 비교

구분RESTGraphQLgRPC
요청 단위자원별 엔드포인트단일 엔드포인트에 질의서비스의 프로시저 호출
응답 형태서버가 정한 표현클라이언트가 필드 선택프로토콜 버퍼 직렬화
강점단순함, HTTP 캐시 활용과다 조회와 과소 조회 해소고성능, 스트리밍, 타입 계약
주 용도공개 API, 일반 웹 서비스화면 요구가 다양한 클라이언트내부 마이크로서비스 통신

REST는 단순하고 HTTP 인프라와 궁합이 좋아 기본 선택지로 남아 있고, 화면마다 필요한 데이터 조합이 크게 다르면 GraphQL이, 내부 서비스 간 고성능 통신에는 gRPC가 보완재로 쓰인다.

면접에서 이렇게 물어본다

  • REST의 여섯 가지 제약 조건 중 무상태가 확장성에 주는 이점을 설명해 보라.
  • RESTful한 URI 설계 원칙을 나쁜 예와 대비해 설명해 보라.
  • 실무 API 대부분이 엄밀한 REST가 아니라는 지적의 근거는 무엇인가.
  • API 버전 관리 전략에는 어떤 것이 있고 각각의 장단점은 무엇인가.
  • REST와 GraphQL은 각각 어떤 상황에서 적합한가.
웹 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기