/auth/joinPage.do
를 요청했을 때 오류가 발생한다.
Neither BindingResult nor plain target object for bean name 'joinForm' available as request attribute
at org.apache.jsp.WEB_002dINF.views.auth.join_jsp._jspService(join_jsp.java:182)
join.jsp
12 <form:form action="${pageContext.request.contextPath}/auth/join.do" method="post" modelAttribute="joinForm">
스프링 프레임워크 form 태그 라이브러리의 modelAttribute
는 폼에 있는 요소들의 값을 채우기 위한 객체를 지정해주는 속성 중 하나이다. 오류 메시지를 살펴 보면 joinForm이 존재하지 않는다고 헌다. /auth/join.do
를 POST 방식으로 요청할 때는 오류 없이 잘 작동했는데 왜 그럴까? @ModelAttribute
이 하는 역할을 한번 살펴보자.
@ModelAttribute
애너테이션이 붙은 파라미터에는 다음과 같은 작업이 순서대로 진행된다.
@ModelAttribute
어노테이션이 붙은 객체가 자동으로 Model
객체에 추가되고 View
로 전달된다.마지막 작업에서 알 수 있듯이 join()
에서 joinForm
이 Model
객체에 추가되고 View
로 전달됐기 때문에 오류 없이 잘 작동했던 것이다.
따라서 아래와 같이 model
에 joinForm
에 대한 객체 정보를 저장하여 View
로 전달해야 한다. 처음 입력 폼 페이지를 조회할 때 입력 폼은 모두 비어져 있어야 하기 때문에 빈 객체(new JoinForm()
)을 전달해야 한다.
JoinController.java
@Controller
@RequiredArgsConstructor
public class JoinController {
private final JoinService joinService;
@RequestMapping("/auth/joinPage.do")
public ModelAndView joinPage(@RequestParam HashMap<String, String> params) {
ModelAndView mv = new ModelAndView();
mv.addObject("key", Calendar.getInstance().getTimeInMillis());
mv.addObject("joinForm", new JoinForm());
mv.setViewName("auth/join");
return mv;
}
@PostMapping("/auth/join.do")
public String join(@Validated @ModelAttribute JoinForm joinForm, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (joinService.doesMemberIdExist(joinForm.getMemberId())) {
bindingResult.rejectValue("memberId", "exist", null, null);
}