
- REST (Representational State Transfer)는 웹 서비스의 아키텍처 스타일 중 하나로, 웹에서 사용되는 자원을 효율적이고 안정적으로 사용할 수 있게 하는 기법입니다.
- RESTful 웹 서비스는 HTTP를 기반으로 자원에 접근하는 방식을 정의합니다.
- REST API는 웹에서 데이터를 주고받기 위한 아키텍처 스타일이며, 규칙(약속) 을 의미합니다.
- 클라이언트와 서버 간의 통신을 단순화하고, 독립적인 시스템 간 상호 운용성을 높이는 핵심 기술입니다.
| 구성 요소 | 설명 |
|---|---|
| Resource (자원) | URI로 식별되는 대상 (예: /users/1) |
| Method (행위) | HTTP 메서드를 통해 자원을 조작 (GET, POST, PUT, DELETE) |
| Representation (표현) | 자원의 상태를 JSON, XML 등으로 표현 |
| Stateless (무상태성) | 각 요청은 독립적으로 처리되며, 서버는 이전 요청 정보를 저장하지 않음 |
| 메서드 | 설명 | 예시 |
|---|---|---|
| GET | 자원 조회 | /users → 모든 유저 조회 |
| POST | 자원 생성 | /users → 새 유저 등록 |
| PUT | 자원 전체 수정 | /users/1 → ID 1 유저 정보 전체 수정 |
| PATCH | 자원 일부 수정 | /users/1 → 이름만 수정 |
| DELETE | 자원 삭제 | /users/1 → ID 1 유저 삭제 |
| 구성 요소 | 설명 |
|---|---|
| Client-Server 구조 | 클라이언트와 서버는 서로 독립된 요소로 구성되어 있으며, 각각의 역할에 집중함으로써 클라이언트와 서버 간의 개발 및 확장성이 증가하고, 서로 간의 종속성이 줄어듦. (예: /users/1) |
| Stateless (무상태성) | 각 요청은 서버에게 모든 필요한 정보를 포함해야 하며, 서버는 클라이언트의 이전 요청에 대한 상태 정보를 저장하지 않음. 이로 인해 서버의 복잡성이 감소하고, 확장성이 향상됨. |
| Cacheable (캐시 처리 가능) | 클라이언트는 서버로부터 전달받은 응답을 캐시할 수 있어야 함. 캐싱을 통해 클라이언트와 서버 간의 통신 횟수가 줄어들며, 전체 시스템의 성능과 효율성이 향상됨. |
| Uniform Interface (일관된 인터페이스) | REST는 일관된 인터페이스를 정의함으로써 상호작용의 단순화와 코드의 재사용성을 제공함. 유니폼 인터페이스의 원칙에는 리소스 식별, 자기 설명적 메시지, 하이퍼미디어를 통한 애플리케이션 상태 변경 등이 포함됨. |
| Layered System (계층화 시스템) | 시스템은 여러 계층으로 구성될 수 있으며, 각 계층은 독립적인 기능을 수행함. 이러한 구조를 통해 시스템의 유연성이 증가하며, 각 계층 간의 결합도가 낮아짐. |
| Code on Demand (선택적 코드 실행) | 필요한 경우 서버는 클라이언트에게 실행 가능한 코드를 제공할 수 있음. 이를 통해 클라이언트의 기능이 확장되며, 애플리케이션 로직의 일부를 서버에서 클라이언트로 이동할 수 있음. 하지만 이 원칙은 선택적이며, 모든 RESTful 시스템에서 적용되지는 않음. |
/getAllUsers → ❌ (행위를 URI에 포함) /users (GET 요청 사용) → ✅ Spring Boot REST Controller 예시
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.findById(id));
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.ok(userService.save(user));
}
}
| 항목 | REST | SOAP |
|---|---|---|
| 데이터 포맷 | JSON, XML | XML |
| 상태 유지 | Stateless | Stateful 가능 |
| 전송 프로토콜 | HTTP 중심 | HTTP, SMTP 등 다양 |
| 학습 난이도 | 쉬움 | 복잡함 |
| 속도/유연성 | 빠르고 유연 | 느리고 무거움 |
| 항목 | REST API | GraphQL |
|---|---|---|
| 데이터 요청 방식 | 여러 엔드포인트에서 각각 요청 | 단일 엔드포인트에서 원하는 데이터만 요청 |
| Overfetching 문제 | 필요 이상 데이터 수신 가능 | 필요한 필드만 선택적으로 조회 |
| Underfetching 문제 | 여러 요청으로 데이터 조합 필요 | 한 번의 요청으로 복수 자원 조회 가능 |
| 전송 프로토콜 | HTTP 기반 (GET, POST 등) | HTTP 기반, 주로 POST 사용 |
| 응답 포맷 | JSON, XML 등 다양 | JSON 중심 |
| 버전 관리 | /api/v1/... 형태 필요 | 스키마 확장으로 버전 불필요 |
| 캐싱 | HTTP 캐시 용이 | 별도 캐시 로직 필요 |
| 도입 난이도 | 쉬움, 표준화됨 | 복잡함, 스키마 설계 필요 |
GET /api/users/1
GET /api/users/1/posts
query {
user(id: 1) {
name
posts {
title
likes
}
}
}
➡️ 한 번의 요청으로 유저 정보 + 게시글 데이터를 동시에 조회 가능
/graphql 단일 엔드포인트로 통신 단순화 /getUser ❌ → /users ✅)/api/v1/users 형태로 버전 구분| 범위 | 의미 | 주요 코드 |
|---|---|---|
| 1xx (정보) | 요청 진행 중, 임시 응답 | 100 Continue |
| 2xx (성공) | 요청이 성공적으로 처리됨 | 200 OK, 201 Created, 204 No Content |
| 3xx (리다이렉션) | 요청을 다른 위치로 이동 | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx (클라이언트 오류) | 클라이언트의 요청이 잘못됨 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx (서버 오류) | 서버 처리 중 오류 발생 | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |