교재를 보면서 실습을 따라하는데, 실습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가 필드 간의 바인딩을 관리하고, 오류 발생 시 오류 메시지를 표시하며, 기존 입력 값을 유지할 수 있게 합니다. |
'DEVELOPMENT > Spring' 카테고리의 다른 글
| [스프링부트 완전정복] 7. 파일 업로드 처리 (0) | 2025.11.10 |
|---|---|
| [스프링부트 완전정복] 6. 폼 태그 (0) | 2025.11.03 |
| [스프링부트 완전정복] 5. 요청 처리 메서드의 파아미터 유형 (0) | 2025.11.03 |
| #1 트러블 슈팅 [스프링부트 완전정복] 5장 실습1 (0) | 2025.11.02 |
| [스프링부트 완전정복] 4. 컨트롤러 구현 (1) | 2025.10.08 |