1. REST API란?
1.1 REST란?
- REST(Representational State Transfer)는 웹 서비스 설계 아키텍처 스타일로, 자원을 정의하고 자원에 대한 작업을 HTTP 프로토콜을 통해 처리합니다.
- 2000년, 로이 필딩(Roy Fielding)의 박사 학위 논문에서 소개되었습니다.
1.2 REST API란?
- REST API는 REST 아키텍처 스타일을 따르는 응용 프로그램 인터페이스(API)입니다.
- 웹에서 클라이언트-서버 간 데이터를 주고받기 위해 설계됩니다.
2. REST의 핵심 원칙
REST는 다음 6가지 아키텍처 제약을 따릅니다:
2.1 클라이언트-서버 (Client-Server)
- 클라이언트는 사용자 인터페이스(UI)를 담당하고, 서버는 데이터 저장 및 비즈니스 로직을 담당.
- 두 컴포넌트는 서로 독립적으로 발전 가능.
2.2 상태 없음 (Stateless)
- 각 요청은 독립적이고, 서버는 클라이언트의 상태를 저장하지 않습니다.
- 요청에는 필요한 모든 정보가 포함되어야 합니다(예: 인증 토큰).
2.3 캐시 가능 (Cacheable)
- 응답은 캐시 가능해야 하며, 클라이언트는 서버로의 요청을 줄일 수 있습니다.
2.4 계층화 시스템 (Layered System)
- 클라이언트는 서버가 직접 처리하는지, 또는 다른 중간 계층이 요청을 처리하는지 알 필요가 없습니다.
2.5 인터페이스의 일관성 (Uniform Interface)
- 자원(URL) 및 행동(HTTP 메서드)의 정의가 명확해야 합니다.
2.6 필요 시 코드로 전송 (Code on Demand, 선택적)
- 서버가 클라이언트로 코드를 전송하고 실행할 수 있도록 허용합니다(예: 자바스크립트).
3. REST API의 구성 요소
3.1 자원 (Resource)
- REST API의 핵심은 자원이며, 각각의 자원은 고유한 URI(Uniform Resource Identifier)로 식별됩니다.
- 예: /users, /products, /orders
3.2 HTTP 메서드
- 자원에 대한 작업은 HTTP 메서드를 사용하여 표현됩니다.
HTTP 메서드 |
설명 |
예시 |
GET |
자원을 조회 |
GET /users/1 |
POST |
자원을 생성 |
POST /users |
PUT |
자원을 업데이트(전체 수정) |
PUT /users/1 |
PATCH |
자원을 업데이트(부분 수정) |
PATCH /users/1 |
DELETE |
자원을 삭제 |
DELETE /users/1 |
3.3 상태 코드 (Status Code)
- 응답 상태를 나타내는 HTTP 상태 코드를 사용합니다.
상태 코드 |
설명 |
200 OK |
요청 성공 |
201 Created |
자원 생성 성공 |
400 Bad Request |
잘못된 요청 |
401 Unauthorized |
인증 실패 |
404 Not Found |
자원 찾을 수 없음 |
500 Internal Server Error |
서버 오류 |
4. RESTful API의 장점
- 간결하고 일관된 인터페이스:
- HTTP 메서드와 URI 설계만으로 API의 동작을 이해할 수 있음.
- 확장성:
- 클라이언트-서버 간 분리로 독립적 확장이 가능.
- 캐시 활용:
- 네트워크 성능을 향상시키고 서버 부하를 줄일 수 있음.
- 다양한 포맷 지원:
- JSON, XML 등 다양한 데이터 포맷으로 응답 가능.
5. RESTful API 설계 예제
5.1 URI 설계
- 자원 기반으로 URI를 설계해야 합니다.
- 자원은 복수형 명사로 표현합니다.
- 잘못된 URI: /getUser, /updateProduct
- 좋은 URI: /users, /products
예시
기능 |
HTTP 메서드 |
URI |
사용자 목록 조회 |
GET |
/users |
특정 사용자 조회 |
GET |
/users/{id} |
사용자 생성 |
POST |
/users |
사용자 수정 |
PUT |
/users/{id} |
사용자 삭제 |
DELETE |
/users/{id} |
6. RESTful API 개발 예제
6.1 Spring Boot REST Controller
Controller 예제
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private List<String> users = new ArrayList<>();
@GetMapping
public List<String> getUsers() {
return users;
}
@PostMapping
public String createUser(@RequestBody String user) {
users.add(user);
return "User created";
}
@GetMapping("/{id}")
public String getUser(@PathVariable int id) {
return users.get(id);
}
@PutMapping("/{id}")
public String updateUser(@PathVariable int id, @RequestBody String user) {
users.set(id, user);
return "User updated";
}
@DeleteMapping("/{id}")
public String deleteUser(@PathVariable int id) {
users.remove(id);
return "User deleted";
}
}
7. RESTful API와 기타 아키텍처 비교
특징 |
REST |
SOAP |
프로토콜 |
HTTP |
HTTP, SMTP, TCP 등 |
데이터 포맷 |
JSON, XML |
XML |
설계 복잡도 |
단순 |
복잡 |
확장성 |
뛰어남 |
낮음 |
표준화 |
비공식 표준 |
공식 표준 |
8. 학습 자료
REST API 테스트 도구
- Postman: API 호출 및 테스트 도구.
- Swagger: API 문서화 및 테스트 도구.