스프링 프레임워크에서 `@RequestParam`, `@RequestBody`, `@PathVariable` 애노테이션들은 HTTP 요청의 다양한 부분을 핸들링하는 데 사용됩니다. 상품 관련 서비스를 예로 들어 각 애노테이션의 사용법과 어떤 요청에서 주로 사용되는지 설명하겠습니다:
1. **@RequestParam**:
- 주로 HTTP GET 요청에서 사용됩니다.
- 쿼리 파라미터를 컨트롤러 메서드의 인수로 바인딩하는 데 사용됩니다.
- 예시: 상품의 리스트를 페이지 번호에 따라 가져오는 요청에서 `page` 쿼리 파라미터를 받아올 때 사용됩니다.
@GetMapping("/products")
public String listProducts(@RequestParam(name = "page", defaultValue = "1") int page) {
// 상품 리스트 조회 로직
return "productList";
}
2. **@RequestBody**:
- 주로 HTTP POST 요청에서 사용됩니다.
- HTTP 요청의 본문을 Java 객체로 변환하는 데 사용됩니다.
- 예시: 새로운 상품을 추가하는 요청에서 클라이언트가 JSON 형태로 보낸 상품 정보를 Java 객체로 변환하여 사용하기 위해 사용됩니다.
@PostMapping("/products")
public ResponseEntity<Product> addProduct(@RequestBody Product product) {
// 상품 추가 로직
return ResponseEntity.ok(savedProduct);
}
3. **@PathVariable**:
- 주로 HTTP GET, PUT, DELETE 등에서 사용됩니다.
- URI의 일부를 컨트롤러 메서드의 인수로 바인딩하는 데 사용됩니다.
- 예시: 특정 상품의 상세 정보를 조회하거나 수정하거나 삭제할 때, URI에서 상품 ID를 받아올 때 사용됩니다.
@GetMapping("/products/{productId}")
public String getProductDetail(@PathVariable long productId) {
// 상품 상세 정보 조회 로직
return "productDetail";
}
@PutMapping("/products/{productId}")
public ResponseEntity<Product> updateProduct(@PathVariable long productId, @RequestBody Product product) {
// 상품 수정 로직
return ResponseEntity.ok(updatedProduct);
}
@DeleteMapping("/products/{productId}")
public ResponseEntity<Void> deleteProduct(@PathVariable long productId) {
// 상품 삭제 로직
return ResponseEntity.noContent().build();
}
요약하면:
- `@RequestParam`: 주로 GET 요청에서 사용 (예: 상품 리스트 페이지네이션)
- `@RequestBody`: 주로 POST, PUT 요청에서 사용 (예: 상품 추가 및 수정)
- `@PathVariable`: GET, PUT, DELETE 등에서 사용되며, URI의 경로 변수를 추출할 때 사용 (예: 상품 상세 조회, 수정, 삭제)
DELETE 요청에서 RequestBody를 사용하지 않는 이유:
REST API 설계 원칙에 따르면, DELETE 요청은 리소스를 삭제하는 데 사용됩니다. 이때 리소스의 식별자는 일반적으로 URL의 일부로 전달됩니다 (PathVariable 사용). DELETE 요청에서 RequestBody를 사용하는 것은 표준이 아니며, 일부 API 클라이언트나 프록시 서버에서는 DELETE 요청의 바디를 무시하거나 지원하지 않을 수 있습니다. 따라서, 안정적이고 호환성 있는 API를 설계하려면 RequestBody 대신 PathVariable 또는 RequestParam을 사용하는 것이 좋습니다.
'개발' 카테고리의 다른 글
HTTPS (1) | 2024.01.22 |
---|---|
Docker (0) | 2023.10.03 |
초기 Git 설정 + 연동 (0) | 2023.08.14 |
Response Success/Fail (0) | 2023.07.11 |
기초 Git 활용 (0) | 2023.06.25 |