REST(REpresentational State Transfer) 기본
REST의 요소
REST: 웹 (HTTP)의 장점을 활용한 아키텍쳐
Method
| Method | 의미 | Idempotent |
|---|---|---|
| POST | Create | No(매번 새로운 리소스를 생성할 수 있다) |
| GET | Select | Yes(리소스를 조회만 하므로 상태 변화 없음) |
| PUT | Update | Yes(같은 데이터를 여러 번 업데이트해도 결과는 동일) |
| DELETE | Delete | Yes(여러 번 삭제 요청해도 결국 리소스는 “없는 상태”) |
Idempotent(멱등성):같은 요청을 여러 번 보내더라도 결과가 같다면 그 메서드는 멱등하다
즉, 요청을 1번 보내든 100번 보내든, 서버의 상태가 변하지 않으면 멱등한 메서드이다.
멱등성은 어떻게 활용될 수 있나요? 🤔
모종의 이유로 전송 커넥션이 끊어졌을 때, 멱등성은 클라이언트가 다시 같은 요청을 해도 되는가에 대한 판단 근거가 될 수 있습니다. 멱등하다면 요청을 재시도할 때 같은 서버의 상태를 보장하기 때문에 문제가 없습니다.
반면, 멱등하지 않다면 재시도 요청시 중복 요청을 보내 문제를 발생 시킬 수 있습니다. 예를 들어, 사용자가 결제하는 시점에 타임아웃으로 인해 정상 응답을 못받는 상황을 생각해 볼 수 있습니다. 해당 경우에서 멱등하지 않은 결제 API 경우에는 결제가 성공했는지 수동으로 확인하고 재요청해야합니다. 반면, 멱등한 결제 API의 경우에는 안심하고 여러 번 요청할 수 있으며 중복 요청으로 발생하는 문제(중복 결제)를 방지할 수 있습니다.
Resource
- http://myweb/users와 같은 URI
- 모든 것을 Resource로 표현하고, 세부 Resource에는 id를 붙인다.
Message
메세지 포맷이 존재: JSON,XML과 같은 형태가 있음
HTTP POST, http://myweb/users/
{
"users" : {
"name" : "hsh"
}
}
REST 특징
1. Uniform Interface
👉 개념 요약
서로 다른 시스템끼리 통신할 때, “하나의 방식(일관된 인터페이스)”만 따르면 문제없이 작동하도록 한다는 원칙입니다.
REST에서는 HTTP 프로토콜 + URI(자원 경로) + 표준 메서드(GET, POST, PUT 등) + 표준 포맷(JSON, XML 등) 만 맞추면 클라이언트가 어떤 기술이든 상관없이 서버랑 통신할 수 있다.
EX) REST API 정의를 HTTP + JSON로 하였다면, C,Java,Python,IOS 플랫폼 등 특정 언어나 기술에 종속 받지 않고, 모든 플랫폼에 사용이 가능한 Lossley Coupling(느슨한 결합)구조
📎 포함되는 요소들
- Self-Descriptive Messages
→ 메시지만 보고도 어떤 행위를 하는지 직관적으로 알 수 있음 (예:
GET /users/1) - HATEOAS (Hypermedia As The Engine Of Application State)
→ 클라이언트가 다음에 취할 수 있는 상태를 서버가 하이퍼링크로 제공
→ 응답에
"links": [ { "rel": "next", "href": "/orders/2" } ]같은 형태로 제공됨 - Resource Identification in Requests
→ 리소스는 URI로 명확히 식별되어야 함 (ex.
/users/1) - Resource Manipulation Through Representations → 리소스는 JSON, XML 등으로 표현되며, 이를 통해 수정 가능
2. Statelessness
- 서버는 클라이언트의 상태를 저장하지 않음 (세션, 컨텍스트 없음)
- 클라이언트는 요청 시 모든 필요한 정보를 포함해야 함
- 구현이 단순해지고, 확장성(Scalability) 향상
📌 예외: 일부 상태 정보를 유지할 필요가 있는 POST 요청에서는, 트랜잭션 복구를 위한 처리 필요
3. Resource-Oriented Architecture (ROA)
- 리소스 중심 설계 원칙
- URI는 자원을 명사 형태(복수형)로 표현 (예:
/users,/products/1) - 행위는 HTTP Method로 구분 (
GET,POST,PUT,DELETE등)
4. Client-Server Architecture
클라이언트와 서버는 명확히 역할이 분리됨
클라이언트: 사용자 인터페이스, 사용자 경험 처리
서버: 데이터 처리, 저장, 비즈니스 로직
이 구조는 독립적인 개발과 배포 가능
5. Cacheability
- HTTP의 캐시 기능을 활용해 응답 데이터를 클라이언트나 중간 서버가 재사용 가능
- 서버는 응답에
Cache-Control같은 헤더를 포함하여 캐시 여부를 제어 - 성능 향상 + 트래픽 절감
6. Layered System
- 클라이언트는 중간 서버(프록시, 게이트웨이, 로드밸런서 등)를 통해 요청 가능
- 각 계층은 독립적으로 확장 가능하며, 보안, 로드 분산, 캐시 등을 담당할 수 있음
7. Code on Demand
- 서버가 클라이언트에게 코드(JavaScript 등)를 전달하여 실행하게 할 수 있음
- 사용성 확장 가능하지만, 제한적으로 사용됨 (REST에서 필수는 아님)
📌 정리 요약표
| 특성 | 설명 |
|---|---|
| Uniform Interface | 기술 독립적인 인터페이스 구성 (HTTP + URI + JSON 등) |
| Stateless | 요청 간 서버에 상태 저장 X → 확장성 ↑ |
| ROA | 자원 중심의 아키텍처 (복수형 명사, URI로 리소스 식별) |
| Client-Server | 역할 분리로 독립적 개발 가능 |
| Cacheability | 응답을 캐시하여 성능 개선 |
| Layered System | 중간 서버를 통한 확장 가능 |
| Code on Demand | 서버 → 클라이언트 코드 전달 (선택적 기능) |
Start the conversation