Neither BindingResult nor plain target object for bean name 'joinForm' available as request attribute

김학준·2024년 6월 17일
0

게시판

목록 보기
2/44

문제 상황

/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 애너테이션이 붙은 파라미터에는 다음과 같은 작업이 순서대로 진행된다.

  1. 파라미터로 넘겨 준 타입의 오브젝트를 자동으로 생성한다.
  2. 생성된 오브젝트에 HTTP로 넘어 온 값들을 자동으로 바인딩한다.
  3. 마지막으로 @ModelAttribute 어노테이션이 붙은 객체가 자동으로 Model 객체에 추가되고 View로 전달된다.

마지막 작업에서 알 수 있듯이 join()에서 joinFormModel 객체에 추가되고 View로 전달됐기 때문에 오류 없이 잘 작동했던 것이다.

따라서 아래와 같이 modeljoinForm에 대한 객체 정보를 저장하여 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);
	}

0개의 댓글