REST는 Representational State Transfer 줄임말이며, 웹 서비스 아키텍처의 한 형태입니다.
서버의 자원을 정의하고, 자원에 대한 주소를 지정하는 통신 규약입니다.
통신 규약! 즉,일종의 약속입니다.
REST의 기본 원칙
자원 (Resource)
웹 서비스에서 제공하는 모든 것들을 각각의 이름으로 식별합니다. 예를 들어, 사용자 정보 /users
, 제품 정보 /products
등 각각이 자원입니다.
표현 (Representation)
각 자원은 클라이언트가 원하는 형식으로 표현되어야 합니다. 흔히 사용하는 형식은 JSON, XML, 텍스트 등이 있습니다.
상태 없음 (Stateless)
서버는 클라이언트의 상태를 기억하지 않습니다. 각각의 요청은 독립적으로 처리되며, 클라이언트는 모든 정보를 요청에 포함시켜야 합니다. 서버는 각각의 요청을 독립적으로 이해하고 처리합니다. 이를 통해 서버의 확장성과 클라이언트와 서버 간의 느슨한 결합을 지원합니다.
연결 (Uniform Interface)
통일된 방식으로 자원을 조작할 수 있어야 합니다. 자원에 대한 조회, 생성, 수정, 삭제 등의 기능은 각각의 HTTP 메소드(GET, POST, PUT, DELETE)를 사용하여 처리합니다.
요청 메소드
GET ⭐
서버에서 리소스를 조회하기 위해 사용하는 메소드입니다. 요청된 URI의 정보를 가져와서 응답으로 보냅니다. 데이터를 조회하는 용도로 사용되며, 요청에 별도의 데이터를 담지 않습니다.
예시: GET https://example.com/users
(모든 사용자 정보 조회)
POST ⭐
서버에 새로운 자원을 생성하기 위해 사용하는 메소드입니다. 요청에 생성하고자 하는 자원의 데이터를 함께 담아서 보냅니다. 일반적으로 데이터를 서버에 제출하는 용도로 사용됩니다.
예시: POST https://example.com/users
(새로운 사용자 생성)
PUT ⭐
서버의 자원을 수정하기 위해 사용하는 메소드입니다. 요청에 수정하고자 하는 자원의 데이터를 함께 담아서 보냅니다. 기존 자원을 완전히 대체하는 방식으로 동작합니다.
예시: PUT https://example.com/users/123
(ID가 123인 사용자 정보를 수정)
PATCH
서버의 자원을 부분적으로 수정하기 위해 사용하는 메소드입니다. 요청에 수정하고자 하는 자원의 일부 데이터만 담아서 보냅니다. PUT과 달리, 일부 데이터만 업데이트하고 나머지 데이터는 그대로 유지합니다.
예시: PATCH https://example.com/users/123
(ID가 123인 사용자 정보에서 일부 내용 수정)
DELETE ⭐
서버의 자원을 삭제하기 위해 사용하는 메소드입니다. 요청에 삭제하고자 하는 자원의 데이터를 함께 담아서 보냅니다. 해당 자원을 삭제하고 응답으로 성공 여부를 전달합니다.
예시: DELETE https://example.com/users/123
(ID가 123인 사용자 삭제)
HEAD
GET 메소드와 유사하지만, 실제 데이터를 반환하지 않고 응답 헤더만 가져오는 메소드입니다. 주로 자원의 메타데이터를 확인하는 용도로 사용됩니다.
예시: HEAD https://example.com/users
(모든 사용자 정보의 헤더 확인)
OPTIONS
서버가 지원하는 메소드들을 확인하기 위해 사용하는 메소드입니다. 주로 CORS(Cross-Origin Resource Sharing) 요청에서 사용됩니다.
예시: OPTIONS https://example.com/users
(서버가 /users 자원에 지원하는 메소드 확인)
TRACE
테스트 목적으로 사용되며, 클라이언트가 보낸 요청이 서버에 도달하는 경로를 확인하기 위해 사용됩니다. 보안상의 이유로 대부분 비활성화되어 있습니다.
RESTful 웹 서비스
RESTful 웹 서비스는 REST 원칙을 준수하는 웹 서비스를 말합니다.
우리가 만들 웹사이트가 RESTful 서비스가 되려면 아까 위에 있던 REST의 기본 원칙을 잘 준수해야 합니다.
예시 (example)
우리가 블로그 웹 사이트를 만들어본다고 상상해봅시다. 이때 RESTful 웹 서비스를 활용하여 사용자 정보와 블로그 글을 관리하는 방법을 살펴봅시다.
자원 (Resource)
사용자 정보와 블로그 글을 각각 다른 자원으로 생각합니다.
표현 (Representation)
사용자 정보는 JSON 형식으로 표현하고, 블로그 글은 HTML 형식으로 표현합니다.
상태 없음 (Stateless)
각각의 요청은 클라이언트가 필요한 모든 정보를 함께 보내야 합니다. 예를 들어, 새로운 블로그 글을 작성할 때, 작성자 이름과 글 내용을 요청에 함께 담아서 보내야 합니다.
연결 (Uniform Interface)
사용자 정보를 조회할 때는 GET 메소드를 사용합니다.
- 예시:
GET https://example.com/users/123
(123은 사용자 고유의 식별자)
새로운 블로그 글을 작성할 때는 POST 메소드를 사용합니다.
- 예시:
POST https://example.com/blogs
(요청에 작성자 이름과 글 내용을 함께 담아서 보냄)
글을 수정할 때는 PUT 메소드를 사용합니다.
- 예시:
PUT https://example.com/blogs/456
(456은 글의 고유 식별자, 요청에 수정된 글 내용을 함께 담아서 보냄)
글을 삭제할 때는 DELETE 메소드를 사용합니다.
- 예시:
DELETE https://example.com/blogs/456
(456은 삭제할 글의 고유 식별자)
RESTful URI 설계 규칙
RESTful한 웹서비스에서 URI 설계는 중요합니다. RESTful한 웹 서비스를 위해 일관적이고 직관적인 URI 구조를 갖추도록 잘 구성해야 합니다. 아래는 일반적으로 사용되는 RESTful URI 설계 규칙입니다.
명사 사용
자원(리소스)을 나타내는 URI는 명사로 표현합니다. 동사는 자원의 행위(조회, 생성, 수정, 삭제 등)를 나타내는 것이므로 URI에 포함하지 않습니다.
- 올바른 예:
/users, /posts, /products
- 잘못된 예:
/getUsers, /createPost, /deleteProduct
복수형 사용
여러 개의 자원을 나타내는 경우에는 복수형으로 표현합니다.
- 올바른 예:
/users, /posts, /products
- 잘못된 예:
/user, /post, /product
자원 계층 구조
자원의 계층 구조를 적절히 반영하여 URI를 설계합니다. 예를 들어, 사용자와 사용자의 게시글을 나타내는 경우 계층 구조로 표현할 수 있습니다.
- 올바른 예:
/users/{userId}/posts
- 잘못된 예:
/usersAndPosts
동사 사용은 피하기
자원의 행위(동작)는 HTTP 메서드를 사용하여 나타냅니다. URI에는 동사를 사용하지 않습니다.
- 올바른 예:
GET /users
POST /posts
PUT /products/{productId}
- 잘못된 예:
/getUsers, /createPost, /updateProduct/{productId}
소문자 사용
URI는 소문자로 표기하며, 가독성을 위해 하이픈(-)을 사용하여 단어를 구분합니다.
- 올바른 예:
/users, /user-posts, /product-categories
- 잘못된 예:
/Users, /UserPosts, /ProductCategories
URI 파라미터 사용
자원 식별에 필요한 정보는 URI 파라미터로 표현합니다. 예를 들어, 특정 사용자의 정보를 조회하는 경우 사용자 ID를 파라미터로 받습니다.
- 예:
/users/{userId}, /posts/{postId}
가능한 단순한 구조
URI는 가능한 단순하고 직관적인 구조를 가지도록 설계합니다. 너무 복잡하거나 긴 URI는 이해하기 어렵고 유지보수가 어려울 수 있습니다.
- 좋은 예:
/users/{userId}/posts
- 비추천 예:
/users/{userId}/categories/{categoryId}/posts/{postId}/comments
슬래시(/) 사용
계층적인 구조를 표현할 때 슬래시(/)를 사용하여 각각의 계층을 구분합니다.
- 좋은 예:
/users/{userId}/posts/{postId}
- 비추천 예:
/users-{userId}-posts-{postId}
정리
REST는 간단하면서도 확장 가능하며 유지 보수가 쉬운 웹 서비스를 만들기 위한 강력한 아키텍처 스타일입니다.
RESTful 웹 서비스를 구축하면..
클라이언트와 서버 간의 상호작용이 원활! 일관적! 그리고 다양한 플랫폼과 언어에 제약받지 않고 호환성을 보장할 수 있습니다.
'개발 아카이브 > 개발 관련 지식' 카테고리의 다른 글
V8 Liftoff와 웹 어셈블리: 웹 성능을 향상시키는 강력한 조합 (0) | 2023.04.20 |
---|---|
[노션 API] 노션 API 연동으로 데이터베이스 사용하기 (3) | 2023.04.09 |
자바스크립트 엔진인 V8에 대해 알아보자 (1) | 2023.02.26 |
정규식을 이용한 공격 - ReDos (0) | 2022.12.24 |
Postman 대신 사용하는 VS Code API Test Extention - Thunder Client (1) | 2022.11.13 |