자원의 이름(HTTP URI)을 통해 자원을 구분하여 해당 자원의 상태를 주고 받는 기술

REST 3요소

구성요소 내용 표현방법
자원(Resource) 자원 HTTP URI /member/1
행위(Verb) 자원에 대한 행위 HTTP Method GET, POST, PUT, PATCH, DELETE
표현(Representation) 행위의 내용 JSON, XML 등 {id: “1”, name: “europa”}

HTTP Method

  1. GET : 조회(Read)
  2. POST : 생성(Create)
  3. PUT : 수정(Update) - 전체수정
      PATCH :수정(Update) - 일부수정
  4. DELETE : 삭제(Delete)
CRUD HTTP Method URI
resource 리스트 표시 GET /resources
resource 하나의 세부내용 표시 GET /resources/23
resource 생성 POST /resources
resource 수정 PUT /resources/23
resource 삭제 DELETE /resources/23

REST 특징

  • 웹 표준 HTTP 프로토콜을 그대로 사용하므로 기존의 인프라를 그대로 활용가능
    • HTTP를 따르는 모든 플랫폼에 사용 가능

1. Server-Client 구조

  • 자원을 갖고 있는 쪽 : Server
    • API를 제공하고 비즈니스로직을 처리하며 DB에 데이터를 저장한다
  • 자원을 요청하는 쪽 : Client
    • 사용자 인증이나 context(세션, 로그인정보) 등을 직접 관리한다
  • 서로 간의 의존성이 줄어든다

2. Stateless (무상태)

  • 상태정보(State)를 따로 저장하고 관리하지 않는다
  • 해당 요청만으로 단순 처리가 가능하여 확장성을 갖는다

3. Cacheable (캐시 처리가능)

  • HTTP 프로토콜의 Last-Modified, E-Tag 등을 통한 캐싱 구현 가능
  • 캐시를 통해 응답속도가 빨라진다

4. Hierachy (계층구조)

  • REST Server를 다중 계층으로 구성 가능하여 로드밸런싱, 보안, 게이트웨이 등 구조를 유연하게 변경가능
  • Client는 REST API Server만 호출함

5. Uniform Interface (인터페이스 일관성)

  • URI로 지정한 Resource에 대한 조작이 일관되고 한정적인 인터페이스를 수행
  • 인터페이스의 일관성으로 HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용 가능

  • 조건 4가지
    1. Identification of resources : Resource는 URI로 식별가능
    2. Manipulation of resources through representation : 표현을 통해 리소스가 조작
    3. Self-Descriptiove Message : 메시지만 보고 해석이 가능
    4. Hypermedia As The Engine Of Application State(HATEOAS) : 현재 상태에서 전이 가능한 하이퍼미디어를 제공

REST API

  • 도큐먼트 : 객체 인스턴스나 데이터 (단수명사)
    • ex) /members/100, /files/star.jpg, /sports/soccer, /sports/soccer/players/13
  • 컬렉션 : 서버에서 관리하는 리소스 디렉토리 (복수명사)
    • ex) /members, /sports, /sports/soccer/players
  • 스토어 : 클라이언트에서 관리하는 리소스 디렉토리 (복수명사)
    • ex) /files

URI 규칙

  1. URI는 명사, 소문자 사용 -> 동사사용 금지
  2. URI에 HTTP Method가 포함되서는 안됨
  3. URI에 _(언더스코어) 사용 금지, -(하이폰)은 가독성을 위해 사용 가능
  4. 확장자 포함금지
  5. URI는 복수명사/ID 가 표준   ex) products/1 
  6. URI 마지막에 /(슬래시)로 끝내지 않음

설계 규칙

  1. HTTP헤더에 데이터 포맷을 포함
    • Request : Content-Type
    • Response : Accept
  2. GET이나 쿼리 파라미터를 통한 수정 금지
    • 적절한 HTTP Method를 사용해야 한다
  3. HTTP 응답 코드 사용
  4. JSON은 카멜 표기법 사용
  5. 검색, 정렬, 필터링, 페이징 규칙 사용
    • 검색 : ?search=digital
    • 정렬 : ?sort=rank_asc
    • 필터 : ?category=banking&location=asia
    • 페이징 : ?page=2
  6. API 버전 관리
    • v + 정수로 표현
      1. URI에 포함 : /v2/member/1
      2. 쿼리 파라미터에 포함 : ?version=2
      3. HTTP 헤더에 포함 : Custom-Header: api-version=2
  7. 에러 응답처리
    • 일관된 에러 객체를 통해 오류메시지를 반환하는 것을 권장한다
{
   code: "M01"
   message: "Not Found Member"
   description: "해당 멤버를 찾을 수 없습니다"
}