REST란?
REST는 웹에서 데이터를 주고받는 "규칙"이라고 생각하면 된다.
식당에서 메뉴를 보고 주문하는 것으로 비유하자면, REST에서는 특정 규칙에 따라 서버에게 원하는 데이터를 요청하고, 서버는 그 요청에 맞는 데이터를 제공한다.
REST의 구성 요소
- 자원(Resource): URI(Uniform Resource Identifier)로 식별.
- 행위(Verb): HTTP 메서드를 통해 자원에 대한 작업 정의.
- 표현(Representation): JSON, XML 등으로 자원의 상태를 표현.
식당의 주문 시스템을 통한 비유
- 자원(Resource): 식당의 메뉴에 있는 요리들. 예를 들어, "피자", "파스타" 같은 것들이 자원이다. REST에서는 이런 자원을 URI(예: /pizza, /pasta)로 표시한다.
- 행위(Verb): 손님이 메뉴를 보고 행동하는 방식. 예를 들어, "피자를 주문하기", "파스타를 확인하기", "피자를 취소하기" 등이 있다. REST에서는 이 행동을 HTTP 메서드(GET, POST, PUT, DELETE 등)로 표현한다.
- 표현(Representation): 요리가 어떻게 나오는지에 대한 정보. 예를 들어, 피자가 어떤 재료로 만들어졌는지 설명하거나 사진을 보여주는 것처럼, REST에서는 JSON이나 XML 같은 형식으로 데이터를 표현한다.
REST의 특징
- 무상태성 (Stateless): 각 요청은 독립적으로 처리되며 서버는 이전 요청의 상태를 저장하지 않음.
- 캐시 가능성 (Cacheable): 응답 데이터를 캐싱하여 성능 향상 가능.
- 계층화 시스템 (Layered System): 클라이언트와 서버 사이에 중간 계층을 둘 수 있음.
- 일관된 인터페이스 (Uniform Interface): 표준화된 방식으로 자원에 접근 가능.
RESTful API란?
RESTful API는 위 식당 시스템(REST 원칙)을 컴퓨터가 이해할 수 있도록 만든 규칙이다.
클라이언트(손님)가 서버(식당)에게 특정 요청을 보내면, 서버는 그 요청에 맞는 정보를 제공한다.
HTTP 메서드와 CRUD 매핑
- POST: 데이터 생성(Create)
- GET: 데이터 조회(Read)
- PUT/PATCH: 데이터 수정(Update)
- DELETE: 데이터 삭제(Delete)
손님과 서버의 대화를 통한 비유
- 손님: "피자 메뉴 좀 보여주세요!"
- 클라이언트가 서버에게 GET 요청을 보낸다.
- 서버는 피자 정보를 JSON 형식으로 전달한다.
- 손님: "새로운 피자를 추가해주세요!"
- 클라이언트가 서버에게 POST 요청을 보낸다.
- 서버는 새로운 피자를 메뉴에 추가한다.
- 손님: "피자 토핑을 바꿔주세요!"
- 클라이언트가 서버에게 PUT 요청을 보낸다.
- 서버는 피자의 정보를 업데이트한다.
- 손님: "이 피자 삭제해주세요!"
- 클라이언트가 서버에게 DELETE 요청을 보낸다.
- 서버는 해당 피자를 메뉴에서 삭제한다.
RESTful API 설계 규칙
식당 메뉴판을 만들 때도 규칙이 있듯이, RESTful API를 설계할 때도 몇 가지 규칙이 있다.
- URI는 명사를 사용하고 소문자로 작성.
- 예: /users (✅), /GetUsers (❌)
- 마지막 슬래시(/)를 포함하지 않음.
- 예: /users (✅), /users/ (❌)
- 언더스코어 대신 하이픈(-) 사용.
- 예: /user-profile (✅), /user_profile (❌)
- 파일 확장자를 포함하지 않음.
- 예: /photos (✅), /photos.jpg (❌)
장점
- HTTP 표준을 활용하여 별도의 인프라 없이 사용 가능.
- 다양한 플랫폼에서 범용적으로 사용 가능. (웹 브라우저, 모바일 앱 등)
- 서버와 클라이언트의 역할이 명확히 분리됨.
단점
- 표준이 엄격히 정의되지 않아 설계 방식에 따라 품질 차이가 발생할 수 있음. (설계가 제대로 되지 않으면 사용하기 어려움)
- HTTP 메서드가 제한적이며, 복잡한 작업에는 적합하지 않을 수 있음.
'Dev > Backend' 카테고리의 다른 글
| GraphQL이란? (3) | 2025.07.03 |
|---|---|
| [Springboot] Spring IoC 컨테이너 쉽게 이해하기 (2) | 2025.04.06 |
| [Spring] 이메일 전송 로직 구현하기 (0) | 2025.01.24 |
| [Node.js / TypeScript] 발생한 문제와 해결 방법들 (2) | 2024.08.26 |
| [Node.js / TypeScript] 프로젝트 회고와 소회 그 사이 (1) | 2024.08.26 |