(* 설계, 개발 개념)
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에 요청
표현(Representation of Resource)
- Client가 자원의 상태에 대한 조작을 요청하면 Server는 이에 대해 응답
- 자원 응답 형태: JSON, XML, TEXT, RSS 등 - 1.6. REST 특징
Server/Client 구조
Stateless (무상태)
- Http Protocol이 Stateless Protocol
- Server는 각각의 요청을 개별적으로 인식하고 처리 - 서버 일관성, 서비스 자유도 향상
- 응답시간 향상
- REST Server 트랜잭션 발생하지 않음
- API Server는 순수 비즈니스 로직을 수행
- 보안성, 확장성 확보 - 앞단에 기타 기능(예: 보안, 로드 밸런싱, 암호화, 사용자 인증 등)을 추가 가능
- Proxy, 게이트웨이 같은 네트워크 기반의 중간 매체 사용 가능
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 |