인프런 커뮤니티 질문&답변

명수찬님의 프로필 이미지
명수찬

작성한 질문수

스프링 핵심 원리 - 기본편

회원 도메인 실행과 테스트

Member 객체가 언제 생성될까요 ?

작성

·

171

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
안녕하세요.
 
강의 활용해서 제가 따로 프로젝트를 만들어서 따라해보고 있는데 궁금증이 생겨 질문 드립니다.
 
Controller -> MemberService -> MemberRepository 순으로 진행되는 코드에서 혹시 생성자는 언제 생성이 되는 건가요?
 
signup 인스턴스(HTML에서 변수를 받아오는 방식으로 사용 중입니다)를 Member 객체로 받아올 때 생성이 되는건가요?
 
객체가 생성되지 않으면 signup이라는 인스턴스를 join 메소드의 파라미터로 못 넣을텐데...
 
++ 입문 강의에서 김영한 선생님께서는 컨트롤러에서도 Member 객체를 new 연산자로 생성은 하셨었는데, 코드 한 줄 줄일 수 있을까 싶어 바로 singup 인스턴스로 파라미터를 넣으니까 돼서, 어떤 차이가 있을지도 궁금합니다.
 
원래 HTML의 form 태그에서 submit으로 Controller에서 받아오는 시점에서 객체가 생성되는 건지(new 연산자 없이),
 
만약 그렇다면 받아오면서 객체가 생성되고 설정한 생성자도 작동하게 되는건가요?
 
항상 좋은 강의와, 서포터 분들의 정성 어린 답변 감사드립니다.
 
@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객체의 주소값만 참조로 넘깁니다. 이 때는 생성자가 호출되지 않습니다.


감사합니다.

명수찬님의 프로필 이미지
명수찬
질문자

안녕하세요. 좋은 답변 감사드립니다. ArgumentResolver에 대해서 검색 해보면서 추가적인 학습을 해보겠습니다!

그러면 혹시, 선생님의 입문 강의 예제에서 컨트롤러에 Member 객체를 추가적으로 생성한 이유가 있을까요? 

@PostMapping("/members/new")
public String create(MemberForm form){
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}

상기와 같이 Member 객체를 생성해서, member 인스턴스에 form 인스턴스(HTML에서 전달된 객체)를 set 해준 이유는 뭐가 있을까요?

 

Member member = new Member();

member.setName(form.getName())이라는 코드 라인을 지우고

 

memberService.join(form) 같은 방식으로 바로 값을 넘겨줘도 되지 않나(특정 값의 경우는 form.getName()) 여쭤보고 싶습니다.

 

선생님께서 작성하신 코드가 설명을 돕기 위해 저렇게 하신 것인지, 혹은 어떤 제가 모르는 다른 이유가 있어서인지 궁금합니다.

안녕하세요!

강의에서는 폼에서 입력하는 데이터와 Member가 가진 속성이 1:1로 일치하기에 MemberForm을 따로 만들 이유가 없다고 생각하실 수 있습니다. 하지만 실무에서는 폼과 폼에 매칭될 엔티티가 1:1로 일치하지 않는 경우가 많습니다. 

그리고 엔티티에서 사용되는 값을 외부로 노출하지 않기 위해서 Form값을 받는 DTO 객체를 별도로 두기도 합니다.

명수찬님의 프로필 이미지
명수찬
질문자

답변 감사합니다^^

명수찬님의 프로필 이미지
명수찬

작성한 질문수

질문하기