본문 바로가기
개발/개념

REST API

by BENGGRI 2022. 10. 21.
반응형

REST(Representational State Transfer)

  • REST는 Representational State Transfer라는 용어의 약자로서 2000년도에 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개되었습니다
  • 로이 필딩은 HTTP의 주요 저자 중 한 사람으로 그 당시 웹(HTTP) 설계의 우수성에 비해 제대로 사용되어지지 못하는 모습에 안타까워하며 웹의 장점을 최대한 활용할 수 있는 아키텍처로써 REST를 발표했다고 합니다

REST 구성

  • 자원(RESOURCE) - URI
  • 행위(Verb) - HTTP METHOD
  • 표현(Representations)

REST 의 특징

Uniform (유니폼 인터페이스)

  • Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다

Stateless (무상태성)

  • REST는 무상태성 성격을 갖습니다
  • 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다
  • 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다
  • 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해집니다

Cacheable (캐시 가능)

  • REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다
  • 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다
  • HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다

Self-descriptiveness (자체 표현 구조)

  • REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것입니다

Client - Server 구조

  • REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다

계층형 구조

  • REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다

REST API 디자인 가이드

  • URI는 정보의 자원을 표현해야 한다
  • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다

REST API 중심 규칙

URI는 정보의 자원을 표현해야 한다. (리소스명은 동사보다는 명사를 사용)

GET /members/delete/1
  • 위와 같은 방식은 REST를 제대로 적용하지 않은 URI입니다
  • URI는 자원을 표현하는데 중점을 두어야 합니다
  • delete와 같은 행위에 대한 표현이 들어가서는 안됩니다

자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현

DELETE /members/1
  • 위의 잘못 된 URI를 HTTP Method를 통해 수정하였습니다
  • 회원정보를 가져올 때는 GET, 회원 추가 시의 행위를 표현하고자 할 때는 POST METHOD를 사용하여 표현합니다
회원 정보 조회
GET /members/show/1     (x)
GET /members/1          (o)

회원 추가
GET /members/insert/2 (x)  - GET 메서드는 리소스 생성에 맞지 않습니다.
POST /members/2       (o)

HTTP METHOD 별 역할

METHOD  역할
GET 해당 리소스를 조회합니다
리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다
POST 해당 URI를 요청하면 리소스를 생성
PUT 해당 리소스를 수정
DELETE 리소스를 삭제

URI 설계 시 주의할 점

슬래시 구분자(/)는 계층 관계를 나타내는 데 사용

<http://study.example.com/classes/members>
<http://study.example.com/classes/members/books>

URI 마지막 문자로 슬래시(/)를 포함하지 않는다

  • URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 합니다
  • REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않습니다
<http://study.example.com/classes/members/books/> (X)
<http://study.example.com/classes/members/books>  (O)

하이픈(-)은 URI 가독성을 높이는데 사용

  • URI를 쉽게 읽고 해석하기 위해, 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높일 수 있습니다

밑줄(_)은 URI에 사용하지 않는다

  • 글꼴에 따라 다르긴 하지만 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 합니다
  • 이런 문제를 피하기 위해 밑줄 대신 하이픈(-)을 사용하는 것이 좋습니다(가독성)

URI 경로에는 소문자가 적합하다

  • URI 경로에 대문자 사용은 피하도록 해야 합니다
  • 대소문자에 따라 다른 리소스로 인식하게 되기 때문입니다
  • RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문이지요
RFC 3986 is the URI (Unified Resource Identifier) Syntax document

파일 확장자는 URI에 포함시키지 않는다

<http://study.example.com/classes/members/banjang/photo.jpg> (X)
  • REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않습니다
  • Accept header를 사용하도록 합시다
GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg

리소스 간의 관계를 표현하는 방법

  • REST 리소스 간에는 연관 관계가 있을 수 있고, 이런 경우 다음과 같은 표현방법으로 사용합니다
/리소스명/리소스 ID/관계가 있는 다른 리소스명
ex)
GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)
  • 만약에 관계명이 복잡하다면 이를 서브 리소스에 명시적으로 표현하는 방법이 있습니다
  • 예를 들어 사용자가 ‘좋아하는’ 디바이스 목록을 표현해야 할 경우 다음과 같은 형태로 사용될 수 있습니다
GET : /users/{userid}/likes/devices (관계명이 애매하거나 구체적 표현이 필요할 때)

자원을 표현하는 Colllection과 Document

  • Collection과 Document에 대해 알면 URI 설계가 한 층 더 쉬워집니다
  • DOCUMENT는 단순히 문서로 이해해도 되고, 한 객체라고 이해하셔도 될 것 같습니다
  • 컬렉션은 문서들의 집합, 객체들의 집합이라고 생각하시면 이해하시는데 좀더 편하실 것 같습니다
  • 컬렉션과 도큐먼트는 모두 리소스라고 표현할 수 있으며 URI에 표현됩니다
  • 예를 살펴보도록 하겠습니다
http://study.example.com/classes/number
  • 위 URI를 보시면 sports라는 컬렉션과 soccer라는 도큐먼트로 표현되고 있다고 생각하면 됩니다. 좀 더 예를 들어보자면
http://study.example.com/classes/members/banjang/99
  • sports, players 컬렉션과 soccer, 13(13번인 선수)를 의미하는 도큐먼트로 URI가 이루어지게 됩니다
  • 여기서 중요한 점은 컬렉션은 복수로 사용하고 있다는 점입니다
  • 좀 더 직관적인 REST API를 위해서는 컬렉션과 도큐먼트를 사용할 때 단수 복수도 지켜준다면 좀 더 이해하기 쉬운 URI를 설계할 수 있습니다

 

 

 

 

 

반응형

'개발 > 개념' 카테고리의 다른 글

인증/인가  (0) 2023.01.12
CORS  (0) 2022.10.27
일급 객체  (0) 2022.10.21
Web Server, WAS  (2) 2022.10.07
[가상화, 클라우드] 가상화와 클라우드  (0) 2021.02.23

댓글