API를 만들 땐 절대 Entity 반환 하면 안된다. dto 써야함.
참고: 폼 객체 vs 엔티티 직접 사용
- 참고: 요구사항이 정말 단순할 때는 폼 객체( MemberForm ) 없이 엔티티( Member )를 직접 등록과 수정 화면에서 사용해도 된다.
- 하지만 화면 요구사항이 복잡해지기 시작하면, 엔티티에 화면을 처리하기 위한 기능이 점점 증가한다.
- 결과적으로 엔티티는 점점 화면에 종속적으로 변하고, 이렇게 화면 기능 때문에 지저분해진 엔티티는 결국 유지보수하기 어려워진다.
- 실무에서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 한다. 화면이나 API에 맞는 폼 객체나 DTO를 사용하자.
- 그래서 화면이나 API 요구사항을 이것들로 처리하고, 엔티티는 최대한 순수하게 유지하자.
MemberController
@Controller
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@GetMapping("/members/new")
public String createForm(Model model){
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
// @Valid : validation 쓴다고 선언
// BindingResult : form과 result가 담긴 상태로 return으로 다시 페이지를 호출한다.
@PostMapping("/members/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("/members")
public String list(Model model){
List<Member> members = memberService.findMembers(); // List<MemberDto> 사용
model.addAttribute("members", members);
return "members/memberList";
}
}
memberForm
@Getter @Setter
public class MemberForm {
@NotEmpty(message = "회원 이름은 필수 입니다.")
private String name;
private String city;
private String street;
private String zipcode;
}
'프로그래밍 > SpringBoot & JPA Use1' 카테고리의 다른 글
JPA Use1 수강 완료 - 깃허브 (0) | 2022.06.20 |
---|---|
상품 수정 - 변경 감지와 병합 ★★★★★ (0) | 2022.06.20 |
홈 화면과 레이아웃 (0) | 2022.06.19 |
구현(회원, 상품, 주문 도메인 개발) - 도메인 모델 패턴 (0) | 2022.06.19 |
애플리케이션 구현 준비 (0) | 2022.06.19 |