햄찌개

REST 본문

웹기반어플리케이션

REST

햄찌개 2021. 1. 8. 11:30

REST 란 ?

REST 란 “Representational State Transfer” 의 약자이다. 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다.

REST란, “웹에 존재하는 모든 자원(이미지, 동영상, DB 자원)에 고유한 URI를 부여해 활용하는 것으로, 자원을 정의하고 자원에 대한 주소를 지정하는 방법론을 의미한다고 한다.

이런 REST의 형식을 따른 시스템을 RESTful 이라고 부른다.

HTTP URI 를 통해 자원을 명시하고 HTTP Method를 통해 해당 자원의 대한 CRUD Operation을 적용한다.

CRUD Operation , HTTP Method

  1. Create : POST (자원 생성)
  2. Read : GET (자원의 정보 조회)
  3. Update : PUT (자원의 정보 업데이트)
  4. Delete : DELETE (자원 삭제)

REST 구성요소

  1. 자원(Resource) , URI
    모든 자원은 고유한 ID를 가지고 ID는 서버에 존재하고 클라이언트는 각 자원의 상태를 조작하기 위해 요청을 보낸다. HTTP에서 이러한 자원을 구별하는 ID는 ‘Students/1’ 같은 HTTP URI 이다.
  2. 행위(Verb) , Method
    클라이언트는 URI를 이용해 자원을 지정하고 자원을 조작하기 위해 Method를 사용한다. HTTP 프로토콜에서는 GET , POST , PUT , DELETE 같은 Method를 제공한다.
  3. 표현(Representation)
    클라이언트가 서버로 요청을 보냈을 때 서버가 응답으로 보내주는 자원의 상태를 Representation이라고 한다. REST에서 하나의 자원은 JSON , XML , TEXT , RSS 등 여러형태의 Representation으로 나타낼수 있다.

REST 의 특징

  1. 클라이언트 / 서버 구조 (Client-Server)
    자원이 있는 Server , 자원을 요청하는 Client의 구조를 가진다.
  2. 무상태 (Stateless)
    HTTP는 Stateless 프로토콜 이므로 REST 역시 무상태성을 가진다. 클라이언트의 Context 를 서버에 저장하지 않는다.
  3. 캐시 처리 가능 (Cachealble)
    웹 표준 HTTP 프로토콜을 그대로 사용하므로 , 웹에서 사용하는 기존의 인프라를 그대로 활용 가능하다.
  4. 계층화
    API 서버는 순수 비즈니스 로직을 수행하고 그 앞단에 사용자 인증 , 암호화 , 로드밸런싱 등을 하는 계층을 추가하여 구조상의 유연성을 줄 수 있다.
  5. 인터페이스 일관성(Uniform Interface)
    URI로 지정한 자원에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다. HTTP 표준에만 따른다면 모든 플랫폼에 사용이 가능하다.
  6. 자체 표현 구조
    동사(Method) + 명사(URI) 로 이루어져있어 어떤 메서드에 무슨 행위를 하는지 알 수 있으며 REST API 자체가 매우 쉬워서 API 메세지 자체만 보고도 API를 이해할 수 있다

REST의 장단점

장점

  1. 쉬운 사용
    HTTP 프로토콜 인프라를 그대로 사용하므로 별도의 인프라를 구축할 필요가 없다.
  2. 클라이언트-서버 역할의 명확한 분리
    클라이언트는 REST API를 통해 서버와 정보를 주고받는다. REST의 특징인 Stateless에 따라 서버는 클라이언트의 Context를 유지할 필요가 없다.
  3. 특정 데이터 표현을 사용가능
    REST API는 헤더 부분에 URI 처리 메소드를 명시하고 필요한 실제 데이터를 ‘body’에 표현할 수 있도록 분리시켰다. JSON , XML 등 원하는 Representation 언어로 사용 가능하다.

단점

  1. 메소드의 한계
    REST는 HTTP 메소드를 이용하여 URI를 표현한다. 이러한 표현은 쉬운 사용이 가능하다는 장점이 있지만 반대로 메소드 형태가 제한적인 단점이 있다.
  2. 표준이 없음
    REST는 설계 가이드 일 뿐이지 표준이 아니다. 명확한 표준이 없다.
  3.  

REST란 Representational State Transfer의 약자로, MDN에 따르면 효과적이고 신뢰를 주고 측정가능한 분산시스템을 위한 소프트웨어 설계 제약 사항입니다. 즉, 자원을 정의하고 그 주소를 지정하는 전반의 방법을 말하는 것입니다.

REST의 기본 개념은 상태와 관계가 잘 정의되고 표준화한 포맷으로 document같은 리소스를 전송하는 것입니다. 이 방식을 잘 적용한 설계를 RESTful 이라고 합니다.

 

1. REST API 기본규칙

  1. URI는 정보의 자원을 표현해야 한다.

    1. resource는 동사보다는 명사를, 대문자보다는 소문자를 사용한다.
    2. resource의 스토어 이름으로는 복수 명사를 사용해야 한다.
  2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)으로 표현한다.

    1. HTTP Method나 동사표현이 URI에 들어가면 안됩니다.
    2. :id와 같이 변하는 값은 하나의 특정 resource를 나타내는 고유값이어야 합니다.

흔히 하는 실수는 URI에 자원에 대한 행위를 넣는 것입니다.

// 잘못된 사례 GET /chatrooms/get/:id POST /chatrooms/create GET /chatrooms/delete/:id POST /chatrooms/update/:id

위 잘못된 사례는 아래와 같이 고칠 수 있습니다.

// 올바른 사례 GET /chatrooms/:id POST /chatrooms DELETE /chatrooms/:id PUT /chatrooms/:id

 

  1. HTTP Method
  • 주로 쓰는 Method
    • GET: 조회 (받겠다)
    • POST: 리소스 생성 (보내겠다)
    • PUT: 리소스 전체 갱신(놓겠다/넣겠다)
    • PATCH: 리소스 부분 갱신(붙이겠다)
    • DELETE: 리소스 삭제 (지정한 서버의 파일을 삭제하겠다)
  • 나머지 Method
    • HEAD: GET과 유사하나 HTTP 메시지 헤더만 반송하고 데이터 내용을 돌려보내지 않음(헤더만 보겠다)
    • OPTION: 통신 옵션을 통지/조사
    • TRACE: 리퀘스트 라인과 헤더를 그대로 클라이언트에 반송(리퀘스트 치환상태를 조사할 때 사용)
    • CONNECT: 암호화된 메시지를 프록시로 전송
  1. 설계 예시   

    CRUD

    HTTP

    URI

    전체 리소스 조회

    GET

    /resources

    특정 리소스 조회

    GET

    /resources/:id

    리소스 생성

    POST

    /resources

    리소스 전체 수정

    PUT

    /resources/:id

    리소스 일부 수정

    PATCH

    /resources/:id

    특정 리소스 삭제

    DELETE

    /resources/:id

2. Rest API 세부규칙

  1. 슬래시(/)는 계층 관계를 나타냅니다.

http://www.example.com/fruits/banana

 

  1. URI의 마지막엔 슬래시(/)를 포함하지 않습니다.

http://www.example.com/fruits/banana/ (X)

 

  1. 가독성을 높이기 위해 하이픈(-)을 사용할 수 있으나 언더바(_)를 사용하진 않는다.

http://www.example.com/tropical_fruits/banana/ (X) http://www.example.com/tropical-fruits/banana/ (O)

 

  1. URI 경로에는 소문자를 씁니다.

http://api.example.restapi.org/my-folder/my-doc HTTP://API.EXAMPLE.RESTAPI.ORG/my-folder/my-doc 위의 두 URI는 같은 URI입니다. 호스트에서는 대소문자를 구별하지 않기 때문이지요. http://api.example.restapi.org/my-folder/my-doc http://api.example.restapi.org/My-Folder/my-doc 하지만 위의 두 URI는 다른 URI입니다. 뒤에 붙는 path가 대소문자로 구분되기 때문입니다.

RFC 3986에 따르면 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정한다고 합니다. 따라서 전부 소문자이거나 전부 대문자이면 괜찮지만, 일반적으로 대문자는 잘 쓰지 않기 때문에 소문자로 쓰는 것을 권합니다.

예시출처: RESTful API를 설계하기 위한 디자인 팁(https://spoqa.github.io/2013/06/11/more-restful-interface.html)

 

  1. 파일 확장자는 URI에 포함하지 않고 Accept header을 사용합니다
  2. 리소스간 연관관계가 있는 경우
  • /리소스명/리소스ID/관계있는 다른 리소스명(일반적으로 소유has의 관계)

    GET /users/

'웹기반어플리케이션' 카테고리의 다른 글

[Spring] Spring Security  (2) 2021.01.11
[Spring] AOP  (0) 2021.01.11
[Spring] Annotation 활성화  (0) 2021.01.07
[Java] Call by value와 Call by reference  (0) 2021.01.06
[Spring] DI(Dependency Injection) 의 정의와 사용  (0) 2021.01.06