작성
·
177
0
@PostMapping("/members/new")
public String create(Member signup){
memberService.join(signup);
return "redirect:/";
}
답변 1
0
안녕하세요, aud248 님. 공식 서포터즈 codesweaver 입니다.
.
콘트롤러의 create() 메서드가 호출되기전에 스프링의 ArgumentResolver (특히 HTTP 메시지 컨버터)에 의해 Member가 생성되며 폼에서 넘어온 값들이 Member 객체로 매핑됩니다 (Member의 필드와 Form의 name 이 일치할 경우만) 질문 하신 내용이 Member의 생성자가 언제 호출되는가를 물으신것 같습니다. Member의 생성자는 이 때 이미 호출됩니다.
@Controller의 create(Member signup) 이 호출될 시점에는 이미 생성된 Member객체의 주소값만 참조로 넘깁니다. 이 때는 생성자가 호출되지 않습니다.
감사합니다.
안녕하세요!
강의에서는 폼에서 입력하는 데이터와 Member가 가진 속성이 1:1로 일치하기에 MemberForm을 따로 만들 이유가 없다고 생각하실 수 있습니다. 하지만 실무에서는 폼과 폼에 매칭될 엔티티가 1:1로 일치하지 않는 경우가 많습니다.
그리고 엔티티에서 사용되는 값을 외부로 노출하지 않기 위해서 Form값을 받는 DTO 객체를 별도로 두기도 합니다.
안녕하세요. 좋은 답변 감사드립니다. ArgumentResolver에 대해서 검색 해보면서 추가적인 학습을 해보겠습니다!
그러면 혹시, 선생님의 입문 강의 예제에서 컨트롤러에 Member 객체를 추가적으로 생성한 이유가 있을까요?
상기와 같이 Member 객체를 생성해서, member 인스턴스에 form 인스턴스(HTML에서 전달된 객체)를 set 해준 이유는 뭐가 있을까요?
Member member = new Member();
member.setName(form.getName())이라는 코드 라인을 지우고
memberService.join(form) 같은 방식으로 바로 값을 넘겨줘도 되지 않나(특정 값의 경우는 form.getName()) 여쭤보고 싶습니다.
선생님께서 작성하신 코드가 설명을 돕기 위해 저렇게 하신 것인지, 혹은 어떤 제가 모르는 다른 이유가 있어서인지 궁금합니다.