인프런 커뮤니티 질문&답변
Neither BindingResult nor plain target object for bean name 'memberFrom' available as request attribute
작성
·
3.8K
1
안녕하세요 강사님.
의문이 생겨 이렇게 질문하게 되었습니다.
강사님의 코드대로 타이핑을 하여 실행을 하였는데요
BindinResult에서 hasErrors()가 넘어가는 것은 확인을 했습니다. 그런데 createMemberForm에서
${#fields.hasErrors('name')} ? 'form-control fieldError' : 'form-control'
이 부분에 에러가 발생하더군요. 에러 내용은 대충 속성을 사용할 수 없다는 내용이였으니 이와 관련하여 찾아보면 되겠구나 하여 검색을 해봤습니다.
그렇게 나온 결론은
public String create(@Valid MemberFrom form{} 을
public String create(@ModelAttribute("memberForm") @Valid MemberForm() {} 와 같이 @ModelAttribute를 붙여주니 해결되었습니다.
제가 내린 결론은 @GetMapping을 통해 memberForm을 model.Attribute를 통해 넘겨 주었고, @PostMapping 함수 부분에서는 memberForm과 바인딩이 되지 않아 발생하는 오류라고 결론을 내렸습니다만, 이게 확실한지 잘 모르겠어서 이렇게 질문을 드리게 되었습니다.
그리고 강사님의 코드는 왜 @ModelAttribute를 넣어주지 않아도 정상적으로 작동하는지 또한 알고싶습니다.
두서없는 긴 글을 끝까지 읽어주셔서 감사합니다.
퀴즈
회원 가입 시 화면 입력 데이터를 엔티티 객체 대신 별도의 Form 객체로 받는 주된 이유는 무엇일까요?
데이터베이스 성능을 최적화하기 위해서
화면 종속적인 데이터나 유효성 검증 로직을 분리하기 위해서
JPA 영속성 컨텍스트와 직접적인 관계를 맺기 위해서
코드의 자동 생성 기능을 활용하기 위해서
답변 2
1
0
안녕하세요. 민성님
@ModelAttribute("memberForm") Member form는 다음과 같은 추가 효과가 있습니다.
model.addAttribute("memberForm", form)
model에 memberForm이 담기기 때문에 View에서 사용할 수 있는 것이지요.
그런데 @ModelAttribute를 생략해도 같은 효과가 있습니다. 대신에 이렇게 됩니다.
create(MemberForm form)
model.addAttribute(form)
그러면 앞과 비교해서 키가 없는데, 이 경우 키 이름을 클래스명으로 대체하고 첫글자를 소문자로 변경합니다.
그래서 다음과 같이 됩니다.
model.addAttribute("memberForm", form)
그러면 민성님 같은 경우에 안된 이유는 다음과 같습니다.
현재 MemberFrom -> 여기에 보시면 Form으로 써야하는데 From으로 오타가 있습니다.
그래서 키 값이 다음과 같이 들어갔습니다.
model.addAttribute("memberFrom", form)
클래스 명을 MemberFrom -> MemberForm 변경해주시면 정상 동작하실거에요^^
@ModelAttribute는 다음에 준비중인 MVC 강의에서 더 자세히 설명드릴게요^^
감사합니다.





