12/10 REST

김성욱·2022년 12월 15일

REST(Representational State Transfer)


1. REST란?

  • Representational State Transfer의 줄임말로 애플리케이션 개발의 아키텍쳐 중 하나이다.
    • 아키텍쳐 : 애플리케이션을 설계, 제작하는데 사용하는 패턴과 기술의 총칭
  • 웹 애플리케이션 상에 존재하는 모든 리소스에 대해 고유의 URI를 부여한다.
    • 리소스는 미디어, DB데이터 등 모두 포함
  • HTTP Method를 이용해 리소스에 대해 CRUD 명령을 적용한다.
  • 즉, 이름이 의미하는 '대표 상태 전송'이란 URI가 부여된 리소스의 상태를 응답으로 전송한다는 의미이다.
    • 여기서 response는 JSON이나 XML 등의 형식으로 나타낸다.
  • HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.

2. REST의 구성 요소

  • 자원(Resource)
    • 서버에 존재하는 데이터의 총칭이다. 모든 자원은 URI(URL)을 가지며, 클라이언트는 이 URI를 지정하여 해당 자원에 대해 CRUD 명령을 수행 할 수 있다.(ex. /resource/1)
  • 행위(Verb)
    • 행위는 클라이언트가 HTTP 메소드를 이용하는 자원을 조직하는 것을 말한다.
  • 표현(Representation)
    • 클라이언트가 HTTP 메소드로 자원을 조작하면 서버가 그에 대한 응답을 보내는것을 의미한다.

3. 특징

  • 서버-클라이언트 구조
    • 서버는 API 제공, 클라이언트는 유저에 대한 처리를 전담하는 구조를 가지기 때문에 서버와 클라이언트의 역할을 분명하게 구분할 수 있다.
      • API : Application Programming Interface라는 용어로, 어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미한다. 어떤 특정 사이트에서 데이터를 공유할 경우 어떠한 방식으로 정보를 요청하고 제공받을건지 규격화 한것을 API라고 한다.
  • 무상태성
    • HTTP를 이용하는 만큼 무상태성의 특징을 가진다.
  • 캐시가능
    • HTTP에서 제공하는 기본 인프라를 사용할 수 있다. 따라서 캐시 기능을 이용해 같은 URI에 대한 반복된 요청을 효율적으로 처리 가능하다.
  • 일관된 인터페이스
    • HTTP를 사용할 수 있는 환경이라면 플랫폼에 상관없이 사용할 수 있으며, 리소스의 타입에 관계없이 같은 형태로 요청이 처리된다.
  • 자체적인 표현 구조
    • JSON, XML 등을 이용하는 메세지 구조로 해당 메세지가 무엇을, 어떤 행위를 의미하는지 직관적으로 이해할 수 있다.
  • 계층 구조
    • 클라이언트는 대상 서버와 직접 통신하는지 아니면 중간 서버와 통신하는지 알 수 없다. 따라서 클라이언트와 서버의 통신 사이에 보안이나 로드 밸런싱등을 위한 중간 계층을 추가할 수 있다.

4. REST API 설계 기본 규칙

  • URI는 정보의 자원을 표현해야 한다.
    • resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
    • resource의 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
    • resource의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
    • resource의 스토어 이름으로는 복수 명사를 사용해야 한다
      • Ex) GET /Member/1 -> GET /members/1
  • 자원에 대한 행위는 HTTP Method(GET, PUT, POST, DELETE 등)로 표현한다.
    • URI에 HTTP Method가 들어가면 안된다.
      • Ex) GET /members/delete/1 -> DELETE /members/1
    • URI에 행위에 대한 동사 표현이 들어가면 안된다.(즉, CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.)
      • Ex) GET /members/show/1 -> GET /members/1
      • Ex) GET /members/insert/2 -> POST /members/2
    • 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.(즉, :id는 하나의 특정 resource를 나타내는 고유값이다.)
      • Ex) student를 생성하는 route: POST /students
      • Ex) id=12인 student를 삭제하는 route: DELETE /students/12
  • 슬래시 구분자(/)는 계층 관계를 나타내는데 사용한다.
  • URI 마지막 문자로 슬래시(/ )를 포함하지 않는다.
    • URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 한다.
    • REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않는다.
    • Ex) http://restapi.example.com/houses/apartments/ (X)
  • 하이픈(- )은 URI 가독성을 높이는데 사용
    • 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높인다.
  • 밑줄(_ )은 URI에 사용하지 않는다.
    • 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 밑줄은 사용하지 않는다.
  • URI 경로에는 소문자가 적합하다.
    • URI 경로에 대문자 사용은 피하도록 한다.
    • RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문
  • 파일확장자는 URI에 포함하지 않는다.
    • REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
    • Accept header를 사용한다.
    • Ex) http://restapi.example.com/members/soccer/345/photo.jpg (X)
    • Ex) GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)
  • 리소스 간에는 연관 관계가 있는 경우
    • /리소스명/리소스 ID/관계가 있는 다른 리소스명
    • Ex) GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)

profile
성욱

0개의 댓글