작성
·
82
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에서
답변을 보면,
@PostMapping("/members/new")
public String create(MemberForm form){
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
위와 같이 코드를 작성하면, "members/new"로 POST 메소드가 호출되었을 때, 스프링이 create() 메서드를 실행하기 위해 MemberForm 객체를 만들어야 하고, setter를 불러와서 멤버변수에 파라미터를 주입한다고 이해했습니다.
그런데, 한가지 의문이 들었습니다.
MemberForm에 name을 저장하고, 그 값을 다시 Member 객체에 저장할거면, 한번에 Member에 저장하면 안되나? Member에도 멤버변수로 name이 있고, setter도 있으니, 안될 건 없다고 생각했습니다. 그래서 아래와같이 코드를 작성했습니다.
@PostMapping("/members/new")
public String create(Member member){
memberService.join(member);
return "redirect:/";
}
이렇게 작성하고 회원가입, 회원목록 기능을 모두 수행해본 결과, 똑같이 잘 작동했습니다.
혹시 강사님께서 굳이굳이 MemberForm을 거쳐서 Member 객체를 만드신 이유가 있나요? 어떤 성능상의 이점이 있는 건가요? 아님 두번째 방법이 위험한 방법이라서 그런건가요? 왜 그런건가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
질문자님께서 말씀하신 MemberForm
사용과 관련하여 직접 Member
객체를 사용하는 것과의 차이점에 대해 궁금하시군요. 유사한 내용과 관련된 정보를 제공한 기존 답변을 찾았습니다.
먼저, 관련된 내용을 다루는 질문으로, “MemberContorller클래스 create함수 질문”이 있습니다. 이 질문에서도 MemberForm
클래스를 만들지 않고, 기존에 만들었던 Member
의 name으로 입력받은 name을 바로 받는 방식의 가능성과 이유에 대해서 논의되었습니다.
김영한 강사님께서 이에 대한 답변을 해 주셨는데, 요약하면 Member 객체에 직접 바인딩하여 사용하는 방법도 가능하지만, 실무에서는 요청 데이터와 도메인 모델이 정확하게 일치하지 않는 경우가 많아서, 중간에 Form 객체를 두는 방법을 자주 사용한다고 합니다. 특히, Member
같은 도메인 모델은 여러 곳에서 사용되므로, 관련 없는 데이터가 추가되어 확장되는 것은 바람직하지 않습니다.
이 방식의 장점으로는 다음과 같은 것들을 들 수 있습니다:
- 분리의 원칙: 데이터 바인딩 과정에서의 관심사를 분리하여, Controller와 Service 계층에서 처리하는 데이터를 명확히 구분할 수 있습니다.
- 보안: 외부로부터 받는 데이터를 검증하고 필터링하는 과정을 통해, 잠재적인 보안 위험을 줄일 수 있습니다.
- 유연성: 요청 데이터의 구조가 변경되더라도, Form 객체를 통해 유연하게 대응할 수 있습니다.
두 번째 방법이 위험하다기보다는, 앞서 설명한 이유들로 인해 MemberForm
을 사용하는 것이 더 권장되는 패턴입니다. 특히, 유지보수와 확장성 측면에서 훨씬 유리합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.