본문 바로가기

개발

REST란? - REST API, RESTful

(* 설계, 개발 개념)

 

1. REST

1.1. REST 정의

  • Representational State Transfer: 자원(resource)의 표현(representation)에 의한 상태(state) 전달(transfer)
    - 자원: 문서,그림,동영상 등 모든데이터
    - 표현: 예 - DB의 학생 데이터 명칭을 'students'로 표시
    - 상태 전달: 데이터 요청에 대한 상태 응답 (주로 JSON, XML 형태로 응답)
  • 분산 하이퍼미디어 시스템(예: WWW)을 위한 소프트웨어 개발 아키텍처의 한 형식
    - 웹 개발에 적합: 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용
    - Client/Server 통신 방식 중 하나

 

1.2. REST 개념

  • 자원 기반의 구조(ROA: Resource Oriented Architecture) 설계로부터
    자원에 고유한 ID인 Http URI (Uniform Resource Identifier)로 자원을 명시하고
    해당 자원에 CRUD Operation(보통 HTTP method 이용)을 적용하는 것
  • CRUD Operation (by HTTP method)
    - Create: 생성(POST)
    - Read: 조회(GET)
    - Update: 수정(PUT)
    - Delete: 삭제(DELETE)
  • 1.3. REST 장단점
    장점
    - 접근성: HTTP 프로토콜 사용
    - 범용성: HTTP 표준 프로토콜을 따르는 모든 플랫폼에서 사용 가능
    - 가독성: REST API를 통한 명확한 의도 파악
    - 여러 서비스 디자인에서 생길 수 있는 문제 최소화
    - 서버 / 클라이언트 역할 분리
    단점
    - 표준이 없음
    - 사용 가능 메소드가 4개
    - HTTP method 형태가 제한적
    - 브라우저를 통한 테스트 시 URL 보다 Header 값이 어렵게 느껴짐
    - 구형 브라우저에서 지원 못할 수 있음
  • 1.4. REST가 필요한 이유
    - 애플리케이션 분리 및 통합
    - 다양한 클라이언트 등장
    - 멀티 플랫폼 지원
  • 1.5. REST 구성요소
    자원(Resource): 문서,그림,동영상 등 모든데이터
    - Server에 모든 자원에 고유한 ID 존재(=URI - 예: /groups/group_id)
    - Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태에 대한 조작을 Server에 요청
    행위(Verb): Http Method - GET, POST, PUT, DELETE 사용
    표현(Representation of Resource)
    - Client가 자원의 상태에 대한 조작을 요청하면 Server는 이에 대해 응답
    - 자원 응답 형태:  JSON, XML, TEXT, RSS 등
  • 1.6. REST 특징
    Server/Client 구조
    Stateless (무상태)
    - Http Protocol이 Stateless Protocol
    - Server는 각각의 요청을 개별적으로 인식하고 처리 - 서버 일관성, 서비스 자유도 향상
    Cacheable (캐시 처리)
    - 응답시간 향상
    - REST Server 트랜잭션 발생하지 않음
    Layered System (계층화)
    - API Server는 순수 비즈니스 로직을 수행
    - 보안성, 확장성 확보 - 앞단에 기타 기능(예: 보안, 로드 밸런싱, 암호화, 사용자 인증 등)을 추가 가능
    - Proxy, 게이트웨이 같은 네트워크 기반의 중간 매체 사용 가능
    Uniform interface (인터페이스 일관성) - URI 를 통한 Resource 조작

 


 

 

 

2. REST API

2.1. REST API 란?

  • REST 기반으로 서비스 API를 구현한 것

 

2.2. REST API 특징

  • REST 기반으로 시스템을 분산 - 확장성, 재사용성을 높여 유지보수, 운영을 편리하게 수행

 

2.3. REST API 설계 기본 원칙

  • 자원에 대한 행위는 HTTP method로 표현
    - URI에 Http Method가 들어가면 안된다.
      예: GET /members/delete/1 -> DELETE /members/1

    - URI에 행위에 대한 동사 표현이 들어가면 단된다.

      예: GET /members/show/1 -> GET/members/1
      예: GET /members/insert/2 -> POST /members/2

    - URI 중 변하는 부분은 유일한 값으로 대체한다.
      예: student를 생성하는 경로: POST /students
      예: id=12 인 student를 삭제하는 경로: DELETE /students/12

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

      예: http://restapi.example.com/houses/apartments

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

      예: http://restapi.example.com/houses/apartments/ (X)

    - 하이픈(-)은 URI 가독성을 높이는데 사용
    - 밑줄(_)은 URI 에 사용하지 않음
    - URI 경로는 소문자로 기입 - RFC 3986(URI 문법형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정

    - 파일 확장자는 URI에 포함하지 않음 - Accept header 를 사용
      예: http://restapi.example.com/members/soccer/345/photo.jpg (X)
      예: GET / members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg (O)

    - 리소스간에 연관 관계가 있는 경우 '/리소스명/리소스ID/관계가 있는 다른 리소스명' 으로 표시
      예: GET : /users/{userid}/devices    (일반적으로 소유 'has' 의 관계를 표현할 때)
  • REST API 설계 예시
    CRUD Http verbs Reoute
    resource들의 목록을 표시 GET /resource
    resource 하나의 내용을 표시 GET /resource/:id
    resource를 생성 POST /resource
    resource를 수정 PUT /resource/:id
    resource를 삭제 DELETE /resource/:id

 

  • 참고 - 응답상태코드
    1xx : 전송 프로토콜 수준의 정보 교환
    2xx : 클라이언트 요청이 성공적으로 수행됨
    3xx : 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함
    4xx : 클라이언트의 잘못된 요청
    5xx : 서버쪽 오류로 인한 상태코드

 


 

 

 

3. RESTful 

3.1. RESTful 개념

  • ‘REST API’를 제공하는 웹 서비스 = ‘RESTful’하다
  • REST 원리를 따르는 시스템 = RESTful

3.2. RESTful 목적

  • 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것
  • 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것
  • 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없음

3.3. RESTful 하지 못한 경우
  - 예: CRUD 기능을 모두 POST로만 처리하는 API
  - 예: route에 resource, id 외의 정보가 들어가는 경우(/students/updateName)

 

 

 


References
https://www.slipp.net/wiki/pages/viewpage.action?pageId=12878219
http://mygumi.tistory.com/55
https://brainbackdoor.tistory.com/53
http://tech.devgear.co.kr/delphi_news/433404
https://meetup.toast.com/posts/92
https://spoqa.github.io/2012/02/27/rest-introduction.html
https://hackernoon.com/build-restful-api-in-go-and-mongodb-5e7f2ec4be94
https://docs.oracle.com/cd/E76467_01/alloc/pdf/141/html/operations_guide/alloc-og_restful-impl.htm
https://gmlwjd9405.github.io/2018/09/21/rest-and-restful.html

 

 

반응형

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

DevOps업무, CI/CD, 그리고 관련 툴  (0) 2024.11.19
[Cloud] AWS 주요 서비스  (3) 2024.11.12
MSA 란?  (0) 2021.11.21
DevOps란? CI/CD란?  (0) 2021.06.11
정규표현식 정리 + 사례 연구  (0) 2020.11.02