코딩딩코 2022. 10. 31. 20:01

REST는 다음과 같은 구성으로 이루어져 있습니다.

자원(Resource) -> URI
행위 -> HTTP Method
표현 -> 어떻게 표현할지

 

 

URI와 URL의 차이

URL -> 전체 주소 https://naver.com/index/test
URI -> 도메인을 포함하지 않고 뒤의 요청 메시지 index/test -> 자원이라고 표현

 

 

HTTP Method 중에서 자주 사용되는 것들

POST -> Create를 의미합니다.

GET -> Select를 의미합니다.

PUT -> Update를 의미합니다.

DELETE -> Delete를 의미합니다.

 

 

REST의 특징


Uniform (유니폼 인터페이스)

Uniform Interface는 URI로 지정한 Resource에 대한 조작을 명시하고 HTTP Method를 통해서 해당 Resource에 대한 CRUD를 적용하는 것을 말합니다.

 

CRUD란?

Create : 생성(POST)
Read : 조회(GET)
Update : 수정(PUT)
Delete : 삭제(DELETE)

 


Stateless (무상태성)

Client의 상태 정보를 Server에 따로 저장하고 관리하지 않습니다.

세션이나 쿠키를 별도로 저장하고 관리하지 않기 때문에 구현이 단순해집니다.

API 서버는 들어오는 Client의 요청만을 단순히 처리하면 됩니다.

때문에 서비스의 자유도가 높아집니다.

이전 Client의 요청이 다음 요청의 처리에 연관되어서는 안 됩니다.

물론 이전 요청이 DB를 수정하여 DB에 의해 바뀌는 것은 허용합니다.

 


Cacheable (캐시 가능)

REST의 가장 큰 특징 중 하나는 HTTP라는 기존 웹 표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다.

따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다.

HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.

캐시 사용을 통해 응답 시간이 빨라지고 REST Server 트랜잭션이 발생하지 않기 때문에 전체 응답 시간, 성능, 서버의 자원 이용률을 향상시킬 수 있습니다.

 

 

캐시란?
클라이언트가 요청을 날리는데 동일하게 계속 같은 요청을 하는 상황이 온다면 불필요한 서버에 요청을 하게 되는데

응답받을 데이터가 변동이 많이 없다면 캐시 저장소에 저장을 해두었다가

같은 요청이 온다면 서버까지 가지 않고 캐시 저장소에서 데이터를 가져와서 응답을 줍니다.

 


Self-descriptiveness (자체 표현 구조)

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

그렇기 때문에 API 주소를 작성을 잘하여야 합니다.


Client - Server 구조

Server가 자원을 가지고 있고, 그 자원을 요청하는 쪽이 Client가 됩니다.

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


계층형 구조

Client는 REST API Server만 호출합니다.
REST Server는 다중 계층으로 구성될 수 있습니다.
API Server는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하여 구조상의 유연성을 줄 수 있습니다.
또한 로드밸런싱, 공유 캐시 등을 통해 확장성과 보안성을 향상시킬 수 있습니다.
PROXY, 게이트웨이 같은 네트워크 기반의 중간 매체를 사용할 수 있습니다.

 

 

REST API

 

API(Application Programming Interface)란?

API는 정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘입니다

간단히 말하자면 정보를 서로 교환 가능하도록 하는 것입니다.


REST API의 정의
REST 기반으로 서비스 API를 구현한 것입니다.

 

 

REST API의 설계 규칙

 

도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
컬렉션 : 서버에서 관리하는 디렉터리라는 리소스
스토어 : 클라이언트에서 관리하는 리소스 저장소

  1. URI는 정보의 자원을 표현해야 합니다.
    • resource는 동사보다는 명사를, 대문자보다는 소문자를 사용합니다.
    • resource의 도큐먼트 이름으로는 단수 명사를 사용해야 합니다.
    • resource의 컬렉션 이름으로는 복수 명사를 사용해야 합니다.
    • resource의 스토어 이름으로는 복수 명사를 사용해야 합니다.
      • Ex) GET /Member/1 -> GET /members/1
  2. 자원에 대한 행위는 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
  3. 슬래시 구분자(/ )는 계층 관계를 나타내는 데 사용합니다.
  4. URI 마지막 문자로 슬래시(/ )를 포함하지 않습니다.
    • .URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며 URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야 합니다.
    • REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 혼동을 주지 않도록 URI 경로의 마지막에는 슬래시(/)를 사용하지 않습니다.
    • Ex) http://restapi.example.com/houses/apartments/ (X) 
  5. 하이픈(- )은 URI 가독성을 높이는 데 사용합니다.
    • 불가피하게 긴 URI경로를 사용하게 된다면 하이픈을 사용해 가독성을 높입니다.
  6. 밑줄(_ )은 URI에 사용하지 않습니다.
    • 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려지기도 하므로 가독성을 위해 밑줄은 사용하지 않습니다.
  7. URI 경로에는 소문자가 적합합니다.
    • URI 경로에 대문자 사용은 피하도록 합니다.
    • RFC 3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문
  8. 파일 확장자는 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)
  9. 리소스 간에는 연관 관계가 있는 경우
    • /리소스명/리소스 ID/관계가 있는 다른 리소스명
    • Ex) GET : /users/{userid}/devices (일반적으로 소유 ‘has’의 관계를 표현할 때)

 

RESTful이란?
REST API를 적용하고 제공되는 웹 서비스를 RESTful 하다고 합니다.
RESTful은 정해져 있는 것이 아닌 REST 원리를 따르는 시스템은 RESTful하다고 합니다.

 

 

 

 

REST에 관한 정보는 깔끔하고 정확한 정보를 전달드리기 어려울 것 같아 참조를 많이 하면서

조금 수정을 하였습니다.

 

참조

https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

 

감사합니다.