MemberController: 회원 등록 컨트롤러
1. createForm
model의 역할: 컨트롤러에서 뷰로 넘어갈 때 model을 통해 넘긴다.
@GetMapping(value = "/members/new")
public String createForm(Model model) {
model.addAttribute("memberForm", new MemberForm());
return "members/createMemberForm";
}
사용자가 사용자 정보를 입력할 수 있는 페이지를 만드는 메소드.
addAttribute("memberForm", new MemberForm());에서 빈 MemberForm을 생성해서 넘겨야 에러가 발생하지 않는다
MemberForm.class로 반환했더니 생겼던 에러는 다음과 같다

2. create()
@PostMapping(value = "/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:/";
}
@Valid: request 후에 서버측에서 데이터를 바인딩할때, 데이터가 유효한지(ex. 누락, 최대 크기 초과 등) 검사해야 하는 경우에 사용하는 어노테이션이다. 객체에 들어가는 값을 검증해준다
MemberForm에 name 필드에 @NotEmpty가 설정되어있으므로 @Valid MemberForm form 형태로 파라미터를 작성한다
@Valid를 사용하기 위해서는 설정이 필요한데 다음고 같이 하면 된다. 강의와는 그레이들 버전이 달라서 버전에 맞춰서 진행하면 된다

/Controller/MemberForm
@NotEmpty(message = "회원 이름은 필수 입니다 ")
private String name;
BindingResult: Validator를 상속받는 클래스에서 객체값을 검증하는 방식이다
if (result.hasErrors()){ return "members/createMemberForm";} => result에 에러가 있다면 회원 등록 html로 이동
입력된 사용자 정보를 저장하는 메소드이다.
form에는 사용자의 이름, 도시,주소명,우편번호가 담겨져있다
각각의 필드를 객체에 저장하고 join한다.
redirect:/ => 가입이 완료되면 메인페이지로 이동한다
3. list()
@GetMapping(value = "/members") public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
조회한 상품을 view에 전달하기 위해 스프링 mvc가 제공하는 model 객체에 보관한다(members 객체를 "members"에 담아서 뷰에 전달한다)
실무에서는 엔티티를 외부에 노출하거나, 화면에 반환하는 일은 절대 없어야한다
엔티티를 노출하면 엔티티가 화면 종속성이 증가할 수 있고, 나중에 유지보수를 하기 어려워질 수 있다.
따라서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야한다.
==> 화면이나 API에 맞는 폼 객체나 DTO를 사용하자
'JPA > JPA + SpringBoot' 카테고리의 다른 글
[JPA+SpringBoot] 3/2 공부 내용 기록(웹 구현, OrderController) (0) | 2022.03.07 |
---|---|
[JPA +SpringBoot] 변경감지와 병합(dirty checking, merge) (0) | 2022.03.07 |
[JPA+SpringBoot] 3/2 공부 내용 기록(웹 구현, ItemController) (0) | 2022.03.07 |
[JPA+SpringBoot] 3/1 공부내용 기록 (0) | 2022.03.01 |
[JPA+SPRINGBOOT] 2/28 공부 내용 기록, 공부 1일차(p6spy,@Controller vs @RestController, @Transactional, 엔티티 설계) (0) | 2022.02.28 |