DEVELOPMENT/Spring

#2 트러블 슈팅 [스프링부트 완전정복] 6장 실습2

Tiny Commit 2025. 11. 3. 16:46

교재를 보면서 실습을 따라하는데, 실습1에서 오류가 발생했다 ㅜㅜㅜ

 

 

 

 

400 Bad Request 오류의 원인

원인:

BookController.java의 submitAddNewBook 메서드는 바인딩 대상인 @ModelAttribute Book book만 받고, 오류를 처리할 BindingResult 파라미터가 없었습니다.

 

 

1. BookController.java 수정 (오류 검사 및 모델 속성 추가)

BookController의 POST 메서드를 수정하여 BindingResult를 추가하고, 오류가 발생했을 때 400 에러 대신 폼 페이지(addBook.html)로 다시 포워딩하도록 했습니다.

@GetMapping("/add")
public String requestAddBookForm(Model model) { 
    Book book = new Book();
    model.addAttribute("newBook", book); // ① 빈 객체 모델 추가 (필수)
    return "addBook"; 
}

@PostMapping("/add")
public String submitAddNewBook(@ModelAttribute("newBook") Book book, BindingResult result) {
    if (result.hasErrors()) { // ② BindingResult로 오류 검사
        return "addBook";     // ③ 오류 시 폼으로 복귀 (400 에러 방지)
    }
    // ... (정상 처리)
    bookService.setNewBook(book);
    return "redirect:/books"; 
}

 

 

 

 

 

 

 

2. addBook.html 수정 (Thymeleaf 바인딩 적용)

BindingResult가 정상적으로 동작하려면, Thymeleaf에게 어떤 폼 필드가 어떤 객체의 필드에 바인딩되는지 명시적으로 알려주어야 합니다.

요소 수정 내용 이유
<form> 태그 <form ... th:object="${newBook}"> 추가 폼이 Book 객체(newBook)와 연결됨을 선언합니다.
<input> 태그 name을 th:field="*{필드명}"으로 변경 Thymeleaf가 필드 간의 바인딩을 관리하고, 오류 발생 시 오류 메시지를 표시하며, 기존 입력 값을 유지할 수 있게 합니다.