REST(Representational State Transfer)란?
REST의 정의
REST(Represtational State Transfer)은 자원을 정의하고 자원의 주소를 지정하는 방법의 전반을 말 하는데 자원의 상태(정보)를 주고 받는 모든 것을 의미한다고 보면 된다.
즉, 자원(resource)의 표현(representation)에 의한 상태 전달을 의미한다.
✅ 자원 : 해당 소프트웨어가 관리하는 모든 것 ( 문서, 그림, 데이터, 해당 소프트웨어 자체 등 )
✅ 표현 : 그 자원을 표현하기 위한 이름 ( DB의 resource가 회원정보이면, 'member'를 자원의 표현으로 정함 )
✅ 상태 전달 : 데이터가 요청되는 시점에 자원의 상태를 전달한다. ( JSON 혹은 XML을 통해 데이터를 주고 받는 것이 일반적 )
웹의 장점을 최대한 활용 가능한 아키텍처 스타일로 REST는 네트워크 상에서 Client와 Server 사이의 통신 방식 중 하나입니다.
✨ 아키텍처 스타일 : 아키텍처 설계에서 반복해 나타나는 문제를 해결하고 아키텍처가 만족 시켜야 하는 시스템 품질 속성을 달성할 수 있는 방법을 정리한 문서
REST의 개념
클라이언트와 서버 사이의 통신에서 클라이언트는 서버에게 특정 자원에 대한 CRUD 연산을 요청한다. 요청 방식은 HTTP 매서드인 GET, POST, PUT, DELETE 등을 사용한다. 이 요청은 특정한 형태(표현)로 이루어 지는데 이때 자원의 위치나 이름은 URI나 URL로 식별된다.
✨ URI 와 URL의 차이점?
URI(Uniform Resource Identifier)는 인터넷 상의 자원을 식별하는 문자열로, URL은 그 중에서도 특히 자원의 위치를 나타내는 것을 의미한다. 즉, 모든 URL은 URI지만 모든 URI가 URL은 아니다.
REST의 구성 요소
자원(Resource) - URI
- 모든 것은 자원으로 간주된다.
- 자원은 서버에서 고유하게 식별가능하다. (고유한 ID가 존재)
- 자원을 구별하는 ID는 /members/{member-id} 같은 HTTP URI
- Client는 URI를 이용해 자원을 지정하고 해당 자원의 상태(정보)에 대한 조작을 Server에 요청한다.
HTTP 메서드 (Methods)
- 표준 HTTP 메서드 사용( CRUD )
표현 ( Representation )
- 클라이언트와 서버 간에 데이터를 교환할 때 사용되는 정보의 형태로 JSON, XML, TEXT, RSS 등
- JSON, XML이 RESTful 서비스에서 자주 사용되는 데이터 형식
상태코드 (Status Codes)
HTTP 응답에서 사용되는 표준 코드로, 요청의 성공, 실패 및 기타 상황을 나타낸다.
🔗 상태코드
REST의 특징
REST API
API란?
API(Application Programming Interface)는 소프트웨어 간의 상호 작용을 가능하게 하는 인터페이스이다.
REST API의 정의
- REST 원칙을 기반으로 만든 API로, URI를 통해 자원을 표현하고 HTTP 메소드를 이용해 해당 자원에 대한 작업을 지정한다.
- OpenAPI(누구나 사용할 수 있도록 공개된 API: 구글 맵, 공공 데이터 등)
- 마이크로 서비스(하나의 큰 어플리케이션을 여러 개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 기업
REST API의 특징
- 요청의 목적과 동작을 요청 자체에서 직관적으로 알 수 있다.
REST API 디자인 가이드
- URI는 표현하려는 자원을 반영한다.
- 자원에 대한 동작은 HTTP 메소드(GET, POST, PUT, PATCH, DELETE)를 통해 표현하며, URI에는 메서드를 포함시키지 않는다.
REST API의 설계 규칙
REST API 설계 규칙을 지켜 설계하여 API를 일관성 있게 만들고 사용자가 API를 쉽게 이해하고 사용할 수 있도록 한다.
- URI는 명사를 사용한다.
- 리소스의 식별을 위해, URI는 해당 리소스를 대표하는 명사를 사용
- 동작에 관한 정보는 HTTP 메소드를 통해 표현
- /getAllUsers (X)
- /users
- 슬래시( / )로 계층 관계를 표현한다.
- ‘/member/3/mypage/edit’ 와 같은 형태로 표현하여 회원아이디 3번 회원의 마이페이지 편집을 나타낸다.
- URI 마지막 문자로 슬래시 ( / )를 포함하지 않는다.
- URI의 마지막에 불필요한 슬래시를 포함하지 않는다.
- 밑줄( _ )을 사용하지 않고, 하이픈( - )을 사용한다.
- URI에서 띄어쓰기를 표현할 때 밑줄 대신 하이픈
- URI는 소문자로만 구성한다.
- URI는 대소문자를 구분하기 때문에 일관성을 위해 소문자만 사용하는 것이 권장된다.
- HTTP 응답 상태 코드 사용한다.
- 클라이언트에게 요청의 성공, 실패, 잘못된 요청 등에 대한 정보를 제공하기 위해 상태 코드를 사용한다.
- 파일확장자는 URI에 포함하지 않는다.
- 리소스의 표현 형식은 HTTP 헤더를 통해 지정되며, URI 자체에 파일 확장자를 포함시키지 않는다.
- http://example.com/user/3/mypage/photo.jpg (X)
RESTful
RESTful의 정의
- RESTful은 REST라는 아키텍처를 구현하는 웹 서비스를 지칭하는 용어이다.
- ‘REST API’를 제공하는 웹 서비스를 ‘RESTful’하다고 할 수 있다.
- RESTful은 REST를 REST답게 쓰기 위한 방법으로 REST 아키텍처 스타일을 올바르게 준수하고 있으면 해당 웹 서비스를 'RESTful'하다고 한다. (공식화된 정의는 아님)
RESTful의 목적
RESTful하지 못한 사례
- 한 가지 HTTP 메서드만 사용하여 여러 작업을 수행하는 경우
- URI에 동사나 액션을 포함시키는 경우
- 리소스 대신 CRUD 작업을 중심으로 설계하는 경우
REST API와 RESTful API의 차이
✨ 모든 REST API가 RESTful하다고 할 수 없다. REST API 중에 REST 원칙을 부분적으로만 따를 수 있기 때문이다.
예시
온라인 서점에서 RESTful한 API를 구현
1. 책 리스트 요청
요청 URL: https://onlinebookstore.com/books
⇒ 서점에 등록된 모든 책의 목록을 반환
{
"results": [
{"id": 1, "title": "해리 포터", "author": "J.K. 롤링"},
{"id": 2, "title": "백년 동안의 고독", "author": "가브리엘 가르시아 마르퀘즈"},
...
]
}
2. 특정 책의 정보 요청
요청 URL: https://onlinebookstore.com/books/1
⇒ ID가 1인 책의 상세 정보를 반환
{
"id": 1,
"title": "해리 포터",
"author": "J.K. 롤링",
"description": "마법 세계의 소년 해리 포터의 모험...",
...
}
3. 특정 저자의 책 리스트 요청
요청 URL: https://onlinebookstore.com/authors/1/books
⇒ ID가 1인 저자가 쓴 모든 책의 목록을 반환
4. 장르별 책 리스트 요청
요청 URL: https://onlinebookstore.com/books?genre=fantasy
⇒ 장르가 'fantasy'인 책들의 목록을 반환
5. 책 검색 요청
요청 URL: https://onlinebookstore.com/books?search=해리
⇒ 제목이나 내용에 '해리'가 포함된 책들의 목록을 반환
즉, RESTful한 API는 요청 URL만 보고도 어떤 자원을 요청하는지 쉽게 이해할 수 있다. 이런 구조는 일관적이기 때문에 사용자나 개발자가 API를 쉽게 이용하고 사용할 수 있도록 해준다.
✨ 성능 최적화나 특별한 요구사항이 있는 경우에는 항상 RESTful한 설계를 따르지 않아도 된다.
예상 면접 질문
🤔 1. REST API란 무엇인가요?
💬 REST API는 Representational State Transfer의 약자로, 웹의 설계 아키텍처 중 하나입니다. 웹의 장점을 최대한 활용할 수 있는 아키텍처로써, REST는 자원(Resource) 기반의 구조로 설계되며, 각 자원은 URL로 표현됩니다. HTTP 표준에 따라, 각 자원에 대한 CRUD(Create, Read, Update, Delete) 연산은 표준 HTTP 메소드를 통해 수행합니다.
🤔 2. RESTful하게 API를 설계한다는 것이 무엇인가요?
💬 RESTful하게 API를 설계한다는 것은 REST 원칙을 최대한 따르면서 API를 설계하는 것을 의미합니다.
- 자원은 URI로 표현되며, 명사 사용
- 자원의 상태 변화는 HTTP 메서드 사용
- URI는 계층 구조를 갖도록 설계
- URI에는 소문자 사용, 구분은 하이픈을 사용하며 띄어쓰기는 사용 불가
- 파일 확장자는 URI에 포함하지 않음
🤔 3. HTTP 메서드에는 무엇이 있나요?
HTTP 메서드는 클라이언트가 웹 서버에게 어떠한 동작을 요청하는지를 나타내는 방식입니다. GET은 리소스를 조회할 때, POST는 리소스를 생성할 때, PUT은 리소스를 수정할 때, DELETE는 리소스를 삭제할 때 사용됩니다. 이외에도 PATCH, OPTIONS 등이 있습니다.
🤔 4. HTTP 상태코드 N00번대가 의미하는 것은?
💬 HTTP 상태코드는 3자리 숫자로 구성되며, 그 첫 번째 숫자에 따라 의미의 카테고리가 나뉩니다.
- 1xx (정보): 요청을 받았으며, 프로세스를 계속 진행합니다.
- 2xx (성공): 요청을 성공적으로 받았으며, 인식하였고, 수용하였습니다.
- 3xx (리다이렉션): 요청을 완료하기 위해서는 추가 동작이 필요합니다.
- 4xx (클라이언트 오류): 요청의 문법이 잘못되었거나 요청을 처리할 수 없습니다.
- 5xx (서버 오류): 서버가 명백히 유효한 요청에 대해 충족을 실패했습니다.
📖 참고자료
REST API , RESTful API
🔗 https://dev-coco.tistory.com/97
🔗 https://ko.wikipedia.org/wiki/REST
🔗 https://developer.mozilla.org/ko/docs/Web/HTTP/Status
면접질문
'KNOWLEDGE' 카테고리의 다른 글
[OS] 페이징, PTBR, TLB(Translation Lookaside Buffer, 변환색인 버퍼) 란 무엇인가? (0) | 2023.12.14 |
---|---|
[OS] 시스템 호출(System call) & 운영체제 - 커널모드(Kernerl Mode)와 사용자 모드(User Mode) (0) | 2023.11.17 |
[OS] CPU 스케줄링 알고리즘 / 프로그램 vs 프로세스 vs 스레드 (2) | 2023.11.08 |
[NETWORK] TCP 의 연결 및 해제 과정 (3-Way Handshake / 3-Way Handshake) (1) | 2023.10.30 |
[NETWORK] 대역폭(Bandwidth)이란? (0) | 2023.10.25 |