본문 바로가기
Java/Spring

[Spring]REST API

by 전재경 2022. 11. 27.

REST

 

REST는 "Representational State Transfer" 의 약어

하나의 URI는 하나의 고유한 리소스(resource)를 대표하도록 설계 된다는 개념

스마트폰과 태블릿 등 서버에 접근하는 디바이스 종류가 다양해지고 있기에 디바이스 종류에 상관없이

공통으로 데이터를 처리할 수 있도록 하는 방식을 REST라고 한다

 

REST API는 사용자가 어떠한 요청을 했을 때 화면을 리턴하지 않고,

사용자가 필요로 하는 결과(데이터)만을 리턴해주는 방식이다.

 

HTTP Method : Create, Read, Update, Delete

 

API

 

API는 "Application Programming Interface"의 약어

응용프로그램에서 사용할 수 있도록 다른 응용 프로그램을 제어할 수 있게 만든 인터페이스를 뜻함

API를 사용하면 내부 구현 로직을 알지 못해도 정의되어 있는 기능을 쉽게 사용할 수 있음

 

인터페이스(Interface)란 어떤 장치간 정보를 교환하기 위한 수단이나 방법을 의미

대표적 인터페이스로는 마우스, 키보드 등이 있음

 

REST API

 

REST 아키텍처의 조건을 준수하는 어플리케이션 프로그래밍 인터페이스를 뜻함

최근 많은 API가 REST API로 제공되고 있음

일반적으로 REST 아키텍처를 구현하는 웹 서비스를 RESTful 하다고 표현

 


 

URI

URI는 특정 리소스를 식별하는 통합 자원 식별자(Uniform Resource Identifier)를 의미한다. 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자열 시퀀스다.

URL

URL은 흔히 웹 주소라고도 하며, 컴퓨터 네트워크 상에서 리소스가 어디 있는지 알려주기 위한 규약이다. URI의 서브셋이다.

 


 

 

REST 구성

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

 

REST 의 특징

 

1) Uniform (유니폼 인터페이스)

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

2) Stateless (무상태성)

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

3) Cacheable (캐시 가능)

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

4) Self-descriptiveness (자체 표현 구조)

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

5) Client - Server 구조

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

6) 계층형 구조

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

7) Code on Demand (Optional)

요청을 받으면 서버에서 클라이언트로 코드 또는 스크립트(로직)을 전달하여 클라이언트 기능 확장

 

장점

HTTP 표준 프로토콜을 사용하는 모든 플랫폼에서 호환 가능

서버와 클라이언트의 역할을 명확하게 분리

여러 서비스 설계에서 생길 수 있는 문제를 최소화

 

REST API 디자인 가이드

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

 

 

put과 patch의 차이는 무엇일까 ?

 

put method는 put를 통해 해당 리소스를 수정 및 업데이트

patch method는 나중에 따로 만들어진 스펙

 

특성(property) 측면에서 PUT 메소드는 'safe 하지는 않지만 idempotent' 합니다.

즉, 리소스의 변경을 일으키지만 여러번 실행되어도 1번 실행된것과 동일한 결과를 가져야 한다(더 어려운 말로 멱등성)입니다.

patch는 'safe 하지 않고 idempotent 하지도 않는 method'라고 가정되어 있습니다. 그래서 여러번 실행되면 결과가 계속 달라질 가능성을 가정합니다. 그래서 신경쓸 부분이 상대적으로 많아집니다. 

patch method를 사용하려면 Etag의 조합과 더불어 MUST, MUST NOT, SHOULD NOT 시리즈의 제약 내용들이 펼쳐집니다.

이런 저런 스펙내용을 떠나 기본적으로 리소스의 부분수정이라 충돌에 대한 상황이 고려되어야 하는 것도 필연적입니다.

 

HTTP PATCH 메소드를 사용하고 Message Body로 JSON 을 사용한다고 해서 반드시 JavaScript Object Notation (JSON) Patch 나 JSON Merge Patch 등을 구현해야 한다는 뜻은 아닙니다. 

 

restful API 를 사용할 때 UPDATE 하는 부분에서 PUT or PATCH 를 사용한다.

 

  • PUT : 자원 전체 교체 (자원의 모든 필드 필요)
  • PATCH : 자원의 부분 교체 (자원의 일부 필드 필요)

 

Update 할 때 PUT 을 사용하기 위해서는 자원 내의 모든 필드가 필요하다고 했다.
하지만! 자원 내의 필드 중 하나라도 빠지면 null 값이 들어가게 된다.

# Good!
PUT /users/1
{
	"name" : "choi",
	"email" : "success@naver.com"
}

# result
GET /users/1
{
	"name" : "choi",
	"email" : "success@naver.com"
}

 

# Bad...
PUT /users/1
{
	"name" : "choi",
}

# result
GET /users/1
{
	"name" : "choi",
	"email" : null
}

 

여기서 PUT 과 PATCH 의 차이점이 나온다.
Update 할 때 PATCH 을 사용하기 위해서는 자원 내의 일부 필드만 있어도 된다고 했다.
따라서 결과는 아래와 같이 나오게 된다.

 

# Good!
PATCH /users/1
{
	"name" : "choi",
}

# result
GET /users/1
{
	"name" : "choi",
	"email" : "test@naver.com"
}

하지만 PATCH는 우리가 사용하는 대부분의 웹서버 및 브라우저에서 지원하지 않는다고 한다..

 

 

참고

 

REST API 제대로 알고 사용하기 : NHN Cloud Meetup

REST API 제대로 알고 사용하기

meetup.toast.com

 

댓글