공부/springboot

[REST] REST API

ㄱ ㅣ린 2023. 3. 4. 23:44

※ REST ( REpresentational State Transfer )

  • 네트워크상에서 Client와 Server 사이의 통신 방식
  • 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하는 아키텍처 스타일
  • 자원을 이름으로 구분하여 해당 자원 상태(정보)를 주고받는 것
  • HTTP URI( Uniform Resource Identifier )을 통해 자원을 명시, HTTP Method( Post, Get, Put, Delete )를 통해 해당 자원에 대한 CRUD( Create, Read, Update, Delete )를 적용하는 것
  • 장점
    • HTTP 프로토콜의 인프라를 사용하기 때문에 REST API 사용을 위해 별도의 인프라를 구축할 필요없다.
    • Rest API 메시지가 의도하는 바를 쉽게 파악할 수 있다
    • 서버와 클라이언트의 역할을 명확하게 분리한다.
  • 즉, 자원 기반의 구조 설계의 중심에 자원이 있고, HTTP Method를 통해 자원을 처리하도록 설계된 아키텍처
서버 Server 서비스 공급자 클라이언트에게 서비스를 제공
클라이언트 Client 서비스 소비자. 브라우저나 다른 시스템
자원 Resource 모든 정보(이미지, 글, 비디오 등)
Representation 리소스를 표현하는 구체적인 방법. 예를 들면 JSON, XML, HTML 등을 사용해 리소스를 나타낼 수 있다.

 

※ HTTP Method / CRUD Operation

HTTP Method CRUD Operation
POST 생성 CREATE 생성
GET 읽기 READ 읽기
PUT 업데이트 UPDATE 업데이트 
DELETE 삭제 DELETE 삭제

 

※ REST 특징

클라이언트 - 서버
( Client - Server )
- 서버와 클라이언트는 서로 독립적이여야 한다. 
- 클라이언트가 알아야하는 정보는 요청된 리소스의 URI이며, 다른 방법으로 서버 애플리케이션과 상호작용할 수 없다.
- 서버는 HTTP를 통해 요청된 데이터에 전달하는 것 말고는 클라이언트를 수정해서는 안된다

- 의존성이 줄어든다. 자원을 요청하는 클라이언트, 자원을 제공하는 서버
- Client: 사용자 인증이나 context(세션, 로그인 정보) 등을 직접 관리하고 책임진다.
- REST 서버: API를 제공하고 비즈니스 로직 처리 및 저장을 책임
무상태
( Stateless )
- 각 요청에서 이의 처리에 필요한 모든 정보를 포함해야한다.
- 서버측 세션을 필요로 하지 않고, 서버는 클라이언트 요청과 관련된 데이터를 저장할 수 없다.

- HTTP Protocol은 Stateless Protocol이므로 REST 역시 무상태성을 갖는다.
- 클라이언트의 context를 서버에 저장하지 않는다. 세션&쿠키 같은 context 정보를 신경쓰지 않아 구현이 단순
- 서버는 각각의 요청을 별개의 것으로 인식하고 처리한다.
- 각 API 서버는 클라이언트의 요청만 단순 처리한다
인터페이스 일관성
( Uniform Interface)
- 요청이 어디에서 오든지 동일 리소스에 대한 API요청은 동일하게 보여야한다

- HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용이 가능하며, 특정 언어난 기술에 종속되지 않는다.
캐시 기능
( Cacheable )
- HTTP가 가진 캐싱 기능을 적용할 수 있다 (대량의 요청을 효율적으로 처리하기 위해 캐시가 요구된다)
- 캐시 사용을 통해 응답시간이 빨라지고 REST 서버 트랜잭션이 발생하지 않기 때문에 전체 응답시간, 성능, 서버의 자원 이용률을 향상시킬 수 있다.
레이어 시스템
( Layered System )
- REST API는 호출과 응답이 서로 다른 계층을 통과하기 때문에, 중개자와 통신여부를 클라이언트나 서버가 알 수 없도록 설계되어야한다.
- 클라이언트는 서버와 직접적으로 연결되면 안된다.

- REST 서버는 다중 계층으로 구성될 수 있다. 
- API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 보안, 로드밸런싱, 암호화, 사용자 인증 등을 추가하여 구조상의 유연성을 줄 수 있다.

- Proxy, 게이트웨어 같은 네트워크 기반의 중간 매체를 사용할 수 있다.
Code On Demand - Server로부터 스크립트를 받아서 Client에서 실행한다 ( 반드시 충족안해도 됨 )

 

※ REST 구성요소

  • 자원(Resource): URL
    • 모든 자원에 고유 ID가 존재하고, Server에 존재한다.
    • 클라이언트는 URL을 이용해서 자원을 지정하고, 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.
  • 행위(Verb): HTTP Method
    • HTTP 프로토콜의 Method 사용. POST, GET, PUT, DELETE 같은 메서드 제공
  • 표현(Representation of Resource) 
    • client가 자원의 상태(정보)에 대한 조작을 요청하면 server는 이에 응답을 보낸다.
    • 하나의 자원은 JSON, XML 등의 형태의 Representation으로 나타날 수 있고, JSON이나 XML를 통해 데이터를 주고받는다.

 


※ REST API

  •  REST 기반으로 서비스 API를 구현하는 것을 REST API라고 한다.
    • API(Application Programming Interface)
      • 클라이언트가 리소스를 요청할 수 있도록 서버측에서 제공된 인터페이스
      • API로 데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며, 서로 정보를 교환가능하도록 한다.
      • API와 함께 항상 메뉴얼도 제공되어야한다. URI를 모르면 클라이언트는 사용할 수 없다.
  • 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할 수 있다.
  • REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어(델파이 클라이언트 뿐 아니라, 자바 C#, 웹 등)로 클라이언트, 서버를 구현할 수 있다.

 

※ REST API 설계 기본 규칙

  • 참고: 리소스 원형
    • 도큐먼트: 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
    • 컬렉션: 서버에서 관리하는 디렉터리라는 리소스
    • 스토어: 클라이언트에서 관리하는 리소스 저장소
  • " / "는 계층관게를 나타내는데 사용한다
  • URL 마지막 문자로 " / "를 포함하지 않는다
    • URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 하며, URL이 다르면 리소스가 다르다는 뜻이다. 따라서 리소스가 다르면 URL도 달라져야한다
  • 하이픈 " - " 은 가독성을 높이는데 사용한다 (긴 URL 경로를 사용할 시 + 밑줄 "_" 은 사용하지 않는다)
  • URI 경로에는 소문자를 사용한다 (대문자 사용 지양)
  • 파일확장자는 URI에 쓰지않는다 

 

  • 1. URL은 정보를 자원으로 표현해야한다. 
    • 1-1. resource는 동사보다 명사, 대문자보다는 소문자를 사용한다.
    • 1-2. resource의 도큐먼트 이름으로는 단수 명사를 사용해야한다.
    • 1-3. resource의 컬렉션 이름으로는 복수 명사를 사용해야한다
    • 1-4. resource의 스토어 이름으로는 복수 명사를 사용해야한다.
    • ex) GET /members/1
  • 2. 자원에 대한 행위는 HTTP Method(POST, GET, PUT, DELETE )로 표현한다. 
    • 2-1. URL에 HTTP Method가 들어가면 안된다.    ex) GET /members/delete/1   ->  DELETE /members/1
    • 2-2. URL에 행위에 대한 동사 표현이 들어가면 안된다. (CRUD 기능을 나타내는 것은 URL에 사용하지 않는다)
    • 2-3. 경로 부분 중 변화하는 부분은 유일한 값으로 대체한다. (즉, id는 하나의 특정 resource를 나타내는 고유값)
    •  ex) student를 생성하는 루트: POST /students           id가 12인 student를 삭제하는 루트: DELETE /students/12

 

※ REST API 설계 예시

CRUD HTTP verbs Route
resource 생성 POST /resource
resource 목록 표시 GET /resource
resource 하나 내용 표시 GET /resource/:id
resource 수정 PUT /resource/:id
resource 삭제 DELETE /resource/:id

 

응답 상태 코드
100번대 전송 프로토콜 수준의 정보 교환
200번대 클라이언트 요청이 성공적으로 수행됨
300번대 클라이언트 요청을 완료하기 위해 추가적인 행동이 필요
400번대 클라이언트의 잘못된 요청
500번대 서버 오류

 

 

References

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