RESTful API (Representational State Transfer)
웹을 이용할 때 제약조건들을 정의하는 소프트웨어 아키텍처 스타일
HTTP URL을 통하여 자원을 명시하고 HTTP Method(GET,POST,PUT,DELETE,PATCH 등)를 통해 해당 자원에 대한 CRUD를 적용하는 것을 의미
한마디로 HTTP의 장점을 살리고자 하는 통신 규약
※ Representational
웹 페이지들의 네트워크를 가상의 상태머신으로 두고 사용자가 링크를 선택해서 애플리케이션을 진행시키면 상태 전이가 발생하여 다음 페이지로 이동하게 되는 것
즉, 표현의 의미로 이해하면 된다
정보를 뜻하는 자원과 표현하는 양식(Representational)을 분리한 개념
REST의 특징
- Uniform (유니폼 인터페이스)
URI로 지정한 리소스에 대한 조작을 통일되고 한정된 인터페이스로 수행한다
- Stateless (무 상태성)
각 요청간 클라이언트의 context(세션, 로그인 정보)와 같은 상태 정보를 서버에 저장하지 않는다
서버의 응답이 클라이언트와의 세션 상태와 독립적이다
HTTP는 비연결성 (클라이언트가 요청을 보내고 서버가 응답하면 바로 연결을 끊는 성질)을 가지는데,
이러한 특성에 맞춰 REST API에서도 서버와 클라이언트는 클라이언트의 이전 요청에 대해 잊어버리게 된다
때문에 동일한 데이터를 원한다면 다시 서버와 연결하여 동일한 요청을 시도해야만 한다
- Cacheable (캐시 가능)
클라이언트는 응답을 캐싱할 수 있어야 한다
- Self - Descriptiveness (자체 표현 구조)
REST API 메시지만 보고도 자원과 작업을 쉽게 이해할 수 있다
- Client - Server 구조
서버는 API 제공, 클라이언트는 사용자 인증이나 context(세션, 로그인 정보) 등을 직접 관리하는 구조
아키텍처를 단순화 시키고 작은단위로 분리함으로써 클라이언트와 서버가 독립적으로 구분되고 서로 간의 의존성을 줄인다
- 계층형 구조
클라이언트는 대상 서버에 직접 연결 되었는지, 프록시를 통해 간접적으로 연결 되었는지 알 수 없다
REST 서버는 로드 밸런싱, 암호화 계층을 추가하는 등 다중 계층으로 구성될 수 있으며
프록시, 게이트웨이와 같은 중간 매체를 사용할 수 있다
- Code on demand
자바 애플릿이나 자바스크립트 제공을 통해 서버가 클라이언트를 실행시킬 수 있는 로직을 전송하여 기능을 확장 시킬 수 있다
REST 구성요소
- 자원 (URI)
모든 자원에 고유한 ID가 존재하고 이 자원은 서버에 존재하는데,
클라이언트는 URI를 이용하여 자원을 지정하고 자원의 상태 조작을 서버에 요청한다
- 자원에 대한 행위 (HTTP Method)
GET, POST, PUT, DELETE, PATCH
- 자원에 대한 표현 (Representation)
※ URI (Uniform Resource Identifier)
통합 자원 식별자의 의미로, 네트워크 상의 리소스 자체를 식별하는 고유한 문자열 시퀀스
※ URL (Uniform Resource Locator)
네트워크 상의 통합 자원의 위치를 나타내기 위한 규약
자원 식별 자와 위치를 동시에 보여줌 (`웹 사이트 주소 + 네트워크 상의 자원`)
특정 웹 페이지에 접속하기 위해서는 주소 뿐만 아니라 프로토콜 (https, http, sftp 등)을 함께 알아야 하는데
이들을 모두 나타내는 것이 URL
=> URI가 더 포괄적인 개념이며, URL은 URI의 하위 개념
REST API URL 규칙
- 소문자를 사용한다
http://2mukeeBlog.com/articleList X
http://2mukeeblog.com/articlelist O
- 언더바 대신 하이픈을 사용한다
http://2mukee_blog.com/articles X
http://2mukee-blog.com/articles O
- 마지막에 슬래시를 포함하지 않는다 (URI 내의 모든 문자는 리소스의 고유 ID에 포함되기 때문)
http://2mukeeblog.com/articles/1/ X
http://2mukeeblog.com/articles/1 O
- 행위를 포함하지 않는다 (행위는 method로 표현한다)
http://2mukee-blog.com/get-articles X
GET http://2mukee-blog.com/articles O
- 파일 확장자는 URL에 포함시키지 않는다 (URI 대신 Content-Type 헤더를 통해 미디어 타입을 사용하여 body 콘텐츠를 처리하는 방법을 결정해야한다)
http://2mukee-blog.com/gallery/jjal.jpg X
http://2mukee-blog.com/gallery/jjal
HTTP/1.1 Host: 2mukee-blog.com Accept: image/jpg O
- 전달하고자 하는 명사를 사용하되, 컨트롤 자원을 의미하는 경우 예외적으로 동사를 사용한다
http://2mukee-blog.com/notice/writing X
http://2mukee-blog.com/notice/write O
- URI에 작성되는 영어를 복수형으로 작성한다 (하나의 인스턴스를 복수형으로 표시하는게 부적절해 보일 수 있지만 일반적으로 복수형으로 많이 사용한다)
http://2mukee-blog.com/notice/article X
http://2mukee-blog.com/notice/articles O
Reference
'Development > Development' 카테고리의 다른 글
AOP (Aspect Oriented Programming, 관점지향 프로그래밍) 이란? (0) | 2024.09.28 |
---|---|
The browser (or proxy) sent a request that this server could not understand (0) | 2024.08.20 |
헤드리스 데이터 아키텍처 (0) | 2024.08.17 |
프론트엔드 성능 최적화 기법 (0) | 2024.08.17 |
Claude AI로 코드 리뷰 경험 개선하기 (0) | 2024.08.17 |