[CS] REST API
개인적으로 공부하면서 기록하는 공간으로
잘못된 정보는 댓글을 통해 알려주시면 감사하겠습니다 :-)
* * * * *
REST
REST란 REpresentational State Transfe의 약자로, 자원을 URI로 표시하고 해당 자원의 상태를 주고 받는 것을 의미한다.
REST의 구성 요소는
- 자원 (Resource) : URI
- 행위 (Verb) : HTTP Method (GET, POST, PUT, DELETE 등)
- 표현 (Representations)
으로 이루어져있다.
REST의 특징
1. Uniform Interface (유니폼 인터페이스)
- HTTP 표준을 따르는 환경이라면, 언어 및 플랫폼에 상관없이 어디서든 사용할 수 있는 인터페이스 스타일이다.
2. Stateless (무상태성)
- REST는 무상태성 성격을 가지며, 상태정보를 따로 저장하고 관리하지 않는다.
- 세션 정보나 쿠키 정보를 별도로 저장하지 않기 때문에, API 서버는 단순히 들어오는 요청만 처리하면 된다.
- 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해진다.
3. Cacheable (캐시 가능)
- 기존 웹표준(HTTP)을 그대로 사용하기 때문에 웹에서 사용하는 기존 인프라를 그대로 활용이 가능하다.
- HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 기능 적용이 가능하다.
4. Self-descriptiveness (자체 표현 구조)
- REST API 메세지만 보고 쉽게 이해할 수 있는 자체 표현 구조로 되어 있다.
5. Client-Server 구조
- REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트 등을 직접 관리하는 구조이다.
- 각각의 역할이 확실히 구분되어 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 의존성이 줄어든다.
6. Layerd System (계층형 구조)
- REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있다.
- PROXY, Gateway 같은 네트워크 기반의 중간 매체를 사용할 수 있게 한다.
RESTful API
RESTful API는 REST 규칙들을 지킨 REST 기반의 API를 뜻한다. REST의 6가지 특징을 지킨 서비스의 API를 보고 'RESTful 하다' 라고 표현할 수 있다. RESTful의 목적은 이해하기 쉽고 사용하기 쉬운 REST API를 만드는 것이다.
REST API 설계 규칙
1. URI는 정보의 자원을 표현해야한다.
- 리소스명은 동사보다는 명사를 사용한다.
- URI는 자원을 표현하는데 중점을 두어야 하기 때문에 행위에 대한 표현이 들어가면 안된다.
GET /users/1
2. 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
※ HTTP METHOD의 역할
METHOD | 역할 |
POST | POST를 통해 해당 URI를 요청하면 리소스를 생성한다. |
GET | GET을 통해 해당 리소스를 조회한다. |
PUT | PUT을 통해 해당 리소스를 수정한다. |
DELET | DELETE를 통해 해당 리소스를 삭제한다. |
GET /users/1
DELETE /users/1
POST /users
URI 설계 시 주의할 점
1. 슬래시 구분자(/)는 계층 관계를 나타내는 데 사용한다.
http://restapi.example.com/houses/apartments
http://restapi.example.com/animals/mammals/whales
2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
http://restapi.example.com/houses/apartments (O)
http://restapi.example.com/houses/apartments/ (X)
- URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야한다.
- URI가 다르다는 것은 리소스가 다르다는 것이고, 역으로 리소스가 다르면 URI도 달라져야한다.
- REST API는 분명한 URI를 만들어 통신을 해야 하기 때문에 URI 경로의 마지막에는 슬래시를 사용하지 않는다.
3. 하이픈(-)은 URI의 가독성을 높이는데 사용한다.
: URI를 쉽게 읽고 해석하기 위해, 불가피하게 긴 URI의 경로를 사용하게 되면 하이픈을 사용해 가독성을 높인다.
4. 밑줄(_)은 URI에 사용하지 않는다.
: 밑줄은 보기 어렵거나 밑줄 때문에 문자가 가려기도 하기 때문에 밑줄 대신 하이픈을 사용한다.
5. URI 경로에는 소문자가 적합하다.
- 대소문자에 따라 다른 리소스로 인식하게 되기 때문에 URI 경로에 대문자 사용은 피하도록 한다.
- RFC3986(URI 문법 형식)은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정한다.
6. 파일 확장자는 URI에 포함시키지 않는다.
http://restapi.example.com/animals/mammals/whales.jpg (X)
- REST API에서는 메세지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI에 포함시키지 않는다.
- Accept header를 사용한다.
GET /members/soccer/345/photo HTTP/1.1 Host: restapi.example.com Accept: image/jpg
리소스 간의 관계를 표현하는 방법
REST 리소스 간에는 연관 관계가 있을 수 있다.
💡 형식) /리소스명/리소스ID/관계가 있는 다른 리소스명
GET /users/{userid}/devies
HTTP 응답 상태 코드
잘 설계된 REST API는 URI만 잘 설계된 것이 아닌 리소스의 응답을 잘 내어주는 것 까지 포함된다.
200대 : 성공
상태코드 | 설명 |
200 | 클라이언트의 요청을 정상적으로 수행 |
201 | 클라이언트가 어떠한 리소스 생성을 요청, 해당 리소스가 성공적으로 생성 |
204 | 요청은 성공 했지만 응답할 콘텐츠가 없음 |
300대 : 리다이렉션
상태코드 | 설명 |
301 | 클라이언트가 요청한 리소스에 대한 URI가 영구적으로 변경되었을 때 사용하는 응답코드 |
302 | 301과 같으나 임시적으로 주소가 바뀌었을 경우 사용하는 응답코드 |
304 | 이전에 방문했을 때의 요청 결과와 다르지 않은 경우 사용. 캐시된 페이지 그대로 사용하는 응답코드 |
307 | 임시 페이지로 리다이렉트 |
400대 : 클라이언트 오류
상태코드 | 설명 |
400 | 클라이언트의 요청이 부적절 할 경우 사용하는 응답코드 |
401 | 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청했을 때 사용하는 응답코드 |
403 | 유저 인증상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때 사용하는 응답코드 |
404 | 찾을 수 없는 페이지. 주소를 잘못 입력했을 때 사용하는 응답코드 |
405 | 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우 사용하는 응답코드 |
408 | 서버 요청 시간이 초과 |
409 | 서버가 요청을 처리하는 과정에서 충돌이 발생한 경우 사용하는 응답코드 |
410 | 영구적으로 사용할 수 없는 페이지 |
500대 : 서버 오류
상태코드 | 설명 |
500 | 서버에서 문제가 발생하였으나 문제의 구체적인 내용을 표시할 수 없음을 의미 |
501 | 해당 요청을 처리하는 기능이 없는 경우 사용하는 응답코드 |
502 | 서버로 가는 요청이 중간에서 유실된 경우 사용하는 응답코드 |
503 | 서버쪽 문제로 서비스가 현재 불가능한 상태 |
504 | 페이지를 로드하려는 웹서버가 정보를 요청한 다른 서버로부터 적시에 응답 받지 못함 |
505 | 브라우저에서 웹페이지를 요청하는 데 사용하는 HTTP 프로토콜 버전을 웹사이트에서 지원하지 않음 |
Reference
✔ https://github.com/JaeYeopHan/Interview_Question_for_Beginner
✔ https://velog.io/@stampid/REST-API와-RESTful-API
✔ https://meetup.toast.com/posts/92
댓글