맨날 쓰던 어노테이션 이번 기회에 챗지에게 물어 정리
package com.polarbookshop.catalogservice;
import com.polarbookshop.catalogservice.domain.Book;
import com.polarbookshop.catalogservice.domain.BookRepository;
import com.polarbookshop.catalogservice.domain.BookService;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@RestController
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
@GetMapping
public Iterable<Book> get() {
return bookService.viewBookList();
}
// 루트 패스 URI에 추가되는 URI 템플릿 변수("/books/{isbn}")
@GetMapping("{isbn}")
public Book getByIsbn(@PathVariable String isbn) {
return bookService.viewBookDetails(isbn);
}
@PostMapping
// 책이 성공적으로 생성되면 201 상태코드를 반환
@ResponseStatus(HttpStatus.CREATED) // 성공시 201 상태코드 반환
//@RequestBody는 웹 요청의 본문을 메서드 변수로 바인드
public Book post(@RequestBody Book book) {
return bookService.addBookToCatalog(book);
}
@DeleteMapping("{isbn}")
@ResponseStatus(HttpStatus.NO_CONTENT) // 성공시 204 상태코드 반환
public void delete(@PathVariable String isbn) {
bookService.removeBookFromCatalog(isbn);
}
@PutMapping("{isbn}")
public Book put(@PathVariable String isbn, @RequestBody Book book) {
return bookService.editBookDetails(isbn, book);
}
}
1️⃣ @ResponseStatus(HttpStatus.NO_CONTENT)
@ResponseStatus(HttpStatus.NO_CONTENT)
📌 @ResponseStatus란?
- HTTP 응답 상태 코드(HTTP Status Code)를 직접 설정하는 어노테이션입니다.
- 이 경우 HTTP 204 (NO CONTENT) 상태 코드를 반환하도록 지정.
📌 HttpStatus.NO_CONTENT (204)란?
- 204 No Content는 요청이 성공적으로 처리되었지만, 클라이언트에게 보낼 응답 본문이 없을 때 사용합니다.
- 예를 들어 DELETE 요청에서 데이터가 정상적으로 삭제되었지만, 클라이언트에게 반환할 데이터가 없는 경우 204를 사용함.
📌 예제
❌ @ResponseStatus(HttpStatus.NO_CONTENT)가 없는 경우
@DeleteMapping("{isbn}")
public void delete(@PathVariable String isbn) {
bookService.removeBookFromCatalog(isbn);
}
✅ 삭제 요청을 수행한 후, 응답 본문이 없으면 기본적으로 200 OK를 반환.
✅ @ResponseStatus(HttpStatus.NO_CONTENT)가 있는 경우
@DeleteMapping("{isbn}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable String isbn) {
bookService.removeBookFromCatalog(isbn);
}
✅ 삭제 요청을 수행한 후, 응답 본문이 없으면 204 No Content를 반환.
📌 DELETE 요청 후 응답 본문이 필요하지 않다면 204를 사용하는 것이 RESTful API 설계 원칙에 맞음! 🚀
2️⃣ @PathVariable String isbn
@DeleteMapping("{isbn}")
public void delete(@PathVariable String isbn) {
📌 @PathVariable이란?
- URL 경로(Path Variable)에서 데이터를 추출하는 역할을 합니다.
- 여기서 isbn 값은 요청된 URL의 {isbn} 부분에서 추출됩니다.
📌 예제
요청 URL
DELETE /books/12345
매칭되는 메서드
@DeleteMapping("{isbn}")
public void delete(@PathVariable String isbn) {
System.out.println("삭제할 ISBN: " + isbn);
}
✅ 위와 같이 요청하면, isbn = "12345"로 자동 매핑됩니다.
3️⃣ @RequestBody Book book
@RequestBody Book book
📌 @RequestBody란?
- 요청 본문(JSON 형식의 데이터를 Book 객체로 변환)하여 컨트롤러 메서드에 전달합니다.
- Spring이 자동으로 JSON 데이터를 Book 객체로 매핑해 줍니다.
📌 예제
{
"title": "Advanced Java",
"author": "Jane Doe"
}
➡ @RequestBody 덕분에, 위 JSON 데이터를 자동으로 Book 객체로 변환하여 사용 가능.
📌 그러나 일반적으로 DELETE 요청에서는 요청 본문을 사용하지 않으며, 보통 @PathVariable만 사용하여 삭제할 리소스를 지정하는 것이 일반적입니다.
🔥 최종 정리
어노테이션 역할 설명
🔥 최종 정리 (어노테이션 역할 설명)
@ResponseStatus(HttpStatus.NO_CONTENT) | 응답 상태 코드 설정 | DELETE 성공 시 204 No Content 반환 |
@PathVariable String isbn | URL 경로 변수 매핑 | PUT /books/{isbn} 또는 DELETE /books/{isbn} 요청에서 {isbn} 값을 매핑하여 메서드의 매개변수로 전달 |
@RequestBody Book book | HTTP 요청 본문을 객체로 변환 | PUT 또는 POST 요청의 JSON 데이터를 Book 객체로 변환하여 컨트롤러에서 사용 가능 |
'Cloud Native Spring in Action' 카테고리의 다른 글
데이터 유효성 검사 (1) | 2025.02.06 |
---|---|
스프링 MVC를 이용한 REST API 구현, 그리고 Httpie 설치와의 사투 (0) | 2025.02.06 |
스프링 MVC를 이용한 RESTful 애플리케이션 구축(1) (3) | 2025.02.05 |
임베디드 서버로 작업 (0) | 2025.01.08 |
쿠버네티스로 컨테이너 관리 (0) | 2025.01.07 |