@ModelAttribute 질문 있습니다.
안녕하세요 영한님 강의 정말 잘 보고 있습니다!!
다름이 아니라 MemberController의 addForm 메서드 파라미터를
@ModelAttribute("member") Member member
위와 같이 받으신 이유가 단순히 아래와 같이 Model을 파라미터로 받아서 직접 추가하는 것과 같은 효과를 내기 때문인가요?
@GetMapping("/add")
public String addForm(Model model) {
model.addAttribute("member", new Member());
return "members/addMemberForm";
}
답변 2
3
안녕하세요 haemin님, 부연 설명을 자세히 해주셔서 제가 잘못알고 있던점과 haemin님이 궁금해 하시는 점을 명확히 알 수 있었습니다. 잘못된 답변을 드려 죄송합니다.
말씀해주신게 맞고 해당 내용을 적용해서 설명드리면

member 객체를 model에 담아 addMemberForm에 전달하는 과정

빈 오브젝트를 서버에서 받았기 때문에 사용 가능한 th:object.
---
다시 돌아와 궁금하신 사항에 대해 답변 드리면
그렇기 때문에 아래 코드에서 model을 파라미터로 받아 직접 Item 객체를 넣어주지 않아도 정상적으로 동작하는 것은 @ModelAttribute 때문이다라고 이해를 하였고,
@ModelAttribute가 해주는 숨은 기능(?) 때문에 정상 동작하는게 맞습니다.
영한님께서 Model 을 파라미터로 받아서 Item 객체를 직접 담아주지 않고 @ModelAttribute 를 사용해서 코드를 작성하신 이유가 단지 Model 을 파라미터로 받아 직접 넣어주는 것을 대체하기 위함 뿐인지 궁금해서 질문을 올렸었습니다.
알고 계신 기능 외로 @ModelAttribute가 해주는 숨은 기능(?)은 없는것으로 알고 있습니다.
model.addAtttribute("member", new Member());를 하지 않아도 된다는 것을 보여주시기 위함이지 않나 싶습니다 .
늦은 시간까지 열심히 공부하시는 모습 보기 좋네요.
열심히 하셔서 영한님 강의를 통해 많은 것을 배워가셨으면 좋겠습니다.
다음에 질문 주실 땐 정확한 답변 드릴 수 있도록 노력하겠습니다.
열공하세요!
1
안녕하세요. haemin님, 공식 서포터즈 OMG입니다.
제가 설명드리거나, 참고하실 만한 블로그 정리글을 알려드릴 수 도 있지만 같은 궁금증을 가진 다른 수강생분께서 궁금증을 갖고 해결해 나가는 방법을 공유해드리는게 어쩌면 더 도움이 될거란 생각이 들어서 링크 공유해드릴게요.
보시고나서도 이해가 안가시는 부분이 있다면 댓글 남겨주세요.
https://www.inflearn.com/questions/249830
감사합니다.
0
안녕하세요 OMG님 답변 감사합니다 ㅎㅎ
1. th:obejct 를 사용하기 위해 빈 객체를 model 에 추가하여 전달해 줘야 한다.
2. @ModelAttribute 가 붙은 객체는 자동으로 model에도 추가가 된다.
그렇기 때문에 아래 코드에서 @ModelAttribute 를 사용한 건 th:object 사용을 위해 빈 Member객체를 전달해주기 위한 것이라고 자연스럽게 이해하고 있었는데, 혹시나 제가 이해한 게 정확히 맞는 건지 문득 궁금했습니다!
@GetMapping("/add")
public String addForm(@ModelAttribute("member") Member member) {
log.info("memger={}", member);
return "members/addMemberForm";
}
지금 보니 제가 질문을 자세하게 작성하지 못한 것 같네요 ㅜㅜ
0
2. @ModelAttribute 가 붙은 객체는 자동으로 model에도 추가가 된다.
이 부분을 헷갈려 하시는거 같네요.
2번 설명은 @ModelAttribute의 선언이 함수 위에 있을 때를 얘기합니다 아래처럼요.

반면 다음과 같이 파라미터의 경우, 예를들어 화면의 <input name="price">로 가격을 넘긴다고 했을 때, @ModelAttribute가 붙은 객체의(아래에선 item)의 필드 중 price의 setter를 찾아서 화면에서 넘어온 price와 바인딩이 이뤄집니다. 이를 프로퍼티 바인딩(setXxx, getXxx)라고 합니다.
두 가지의 차이점을 명확히 알아가셨으면 좋겠네요.

1
addMemberForm 템플릿 파일을 보면 form에서 th:object="${item}" 을 사용하고 있는 것을 볼 수 있습니다. 이 경우 화면을 띄울 때 컨트롤러에서 model을 통해 item 객체를 전달하지 않으면 정상적으로 동작하지 않고 다음과 같은 예외가 발생하는 것을 볼 수 있었습니다.
@GetMapping("/add")
public String addForm() {
return "members/addMemberForm";
}
발생 예외 : java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'member' available as request attribute
영한님께서도 mvc2 의 '타임리프 - 스프링 통합과 폼' 강의에서 아래와 같이 설명을 해주셨습니다.

또한 mvc 1 수업에서 @ModelAttribute 에 관해 설명하실 때 아래와 같이 요청 파라미터를 처리하는 기능 외에 model에도 자동으로 추가가 된다고 설명해주셨습니다.

그렇기 때문에 아래 코드에서 model을 파라미터로 받아 직접 Item 객체를 넣어주지 않아도 정상적으로 동작하는 것은 @ModelAttribute 때문이다라고 이해를 하였고, 영한님께서 Model 을 파라미터로 받아서 Item 객체를 직접 담아주지 않고 @ModelAttribute 를 사용해서 코드를 작성하신 이유가 단지 Model 을 파라미터로 받아 직접 넣어주는 것을 대체하기 위함 뿐인지 궁금해서 질문을 올렸었습니다.
@GetMapping("/add")
public String addForm(@ModelAttribute("member") Member member) {
return "members/addMemberForm";
}
늦은 시간인데 답변 남겨주셔서 감사합니다 OMG님:)
이미지 업로드와 db 트랜잭션 묶는법
0
43
1
Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4
0
53
2
MessageSourceTest 코드
0
49
1
인터셉터 에러 설정
0
48
1
resolveArgument()메서드 질문
0
57
1
43강 검증1 에서 실패 로직 관련 질문있습니다.
0
58
2
타임리프 3.X 버전 rendering, serializer 에러 해결 방법
2
133
3
스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ
0
90
3
pdf 오타 문의
0
57
1
ItemUpdateForm 검증 관련 질문입니다.
0
49
1
22page 링크 주소 변경
0
59
2
특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문
0
53
1
섹션3번 수업에 대한 질문입니다.
0
80
2
@Autowired 보다 더 좋은 방법이 어떤 걸까요?
0
85
2
타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.
0
66
1
자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다
0
142
3
스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문
0
63
1
톰캣 에러 페이지가 안보입니다.
0
104
2
apiEceptionController에서 센드 에러 호출하면 안되는지?
0
81
1
세션 타임아웃시 쿠키 삭제 방법이 없나요?
0
118
2
ApiExceptionController 질문드립니다.
0
64
1
셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?
0
66
1
MemberRepository 필드의 fianl 선언 유무
0
85
2
혹시 index.html 에서는 fragment 사용이 안되는건가요
0
58
1





