@Getter @Setter
public class MemberForm {
@NotEmpty(message = "회원 이름은 필수 입니다")
private String name;
private String city;
private String street;
private String zipcode;
}
@RequiredArgsConstructor
@RequestMapping("/members")
@Controller
public class MemberController {
private final MemberService memberService;
@GetMapping("/new")
public String createForm(Model model) {
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
@PostMapping("/new")
public String create(@Valid MemberForm form, BindingResult result) {
if(result.hasErrors()) {
return "members/createMemberForm";
}
Address address = new Address(form.getCity(),
form.getStreet(),
form.getZipcode());
Member member = new Member();
member.setName(form.getName());
member.setAddress(address);
memberService.join(member);
return "redirect:/";
}
@GetMapping
public String members(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
}
요구사항이 정말 단순할 때는 폼 객체(MemberForm) 없이 엔티티(Member)를 직접 등록과 수정화면에서 사용해도 됩니다. 그러나 화면 요구사항이 복잡해지기 시작하면, 엔티티에 화면을 처리하기 위한 기능이 점점 증가하게 됩니다. 결과적으로 엔티티는 점점 화면에 종속적으로 변하게 되고 지저분해진 엔티티는 결국 유지보수 하기 어려워지게 됩니다.
실무에서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 합니다.
화면이나 API에 맞는 폼 객체나 DTO를 사용하는 것을 추천드립니다. 그래야 엔티티는 최대한 순수하게 유지가 될 것입니다.