게시판 CRUD를 구현하기 위해 타임 리프를 사용하면서, 스프링의 Bean Validation을 적용하고자 하고있었다.
DTO도 만들고, 구글링 해가며 object도 넣어주고, th:errors 등등 찾아 넣어가며 열심히 구현하고 실행한 결과..
열심히 구현한 페이지에 들어가자 마자 방대한 오류를 뱉어내고 에러 페이지로 연결되었다. 오류 메세지는
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'questionDTO' available as request attribute...
questionDTO... BindingResult.. 이런 키워드가 나와 Valid 부분 컨트롤러도 보고, 엔티티도 보고, 타임리프도 썼다 지웠다 반복했지만!!!! 문제는 다른 곳에 있었다.
@GetMapping("/question/create")
public String create(){
return "question/create";
}
원래 게시글 생성부분의 매핑은 이렇게 되어있었다!Get 방식으로 들어간 것이기 때문에 딱히 넘겨줄 것도 없어, model등도 받지 않았다.
<form th:action th:object="${questionDTO}" method="post">
그러나 템플릿 엔진에서는, questionDTO를 넘겨 드리겠다고 말해버린 상태였다. 따라서 attribute중 questionDTO가 존재하지 않아서, 마땅한 오류를 뱉어준것이였다.
@GetMapping("/question/create")
public String create(Model model){
model.addAttribute("questionDTO", new QuestionDTO());
return "question/create";
}
따라서 코드를 위와 같이, 껍데기 DTO 객체를 넘겨주는 것으로 해결했다.
한 줄 추가하면 해결될 문제였는데 빨리 인터넷 안찾아보고 삽질해서 더 오래걸렸다.
코드는 잘못이 없다. 내가 잘못일 뿐..