Cloud Native Spring in Action

스프링 MVC를 이용한 RESTful 애플리케이션 구축(2)

기록해연 2025. 2. 5. 16:09

맨날 쓰던 어노테이션 이번 기회에 챗지에게 물어 정리

 

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 객체로 변환하여 컨트롤러에서 사용 가능