회원 등록

구현할 내용

  1. 화면에 랜더링할 Form 데이터 MemberForm 객체 생성 컨트롤러에서 모델이 빈 객체 memberForm을 담아서 보낸다. 이 객체는 validation 역할을 한다.

    package jpabook.jpashop.controller;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.validation.constraints.NotEmpty;
    
    @Getter @Setter
    public class MemberForm {
        @NotEmpty(message = "회원 이름은 필수 입니다")
        private String name;
    
        private String city;
        private String street;
        private String zipcode;
    }
    
  2. 컨트롤러 컨트롤러는 서비스에 서비스를 요청한다. ① GetMapping : HTML Form 페이지 조회.

    @GetMapping("/members/new")
    public String createForm(Model model){
        //빈 MemberForm 클래스를 모델이 넣어준다. validation을 해주기 때문.
        model.addAttribute("memberForm",new MemberForm());
        return "members/createMemberForm";
    }

    ② PostMapping : HTML Form 데이터 전송받는다. @NotEmpty, @Valid : 애노테이션 기반으로 간편하게 validation 하기 => 필수 입력 필드에 값이 없으면 컨트롤러에서 해당 메서드 실행이 안 되지만, BindingResult를 함께 파라미터로 넣어주면 없는 채로 메서드가 실행될 수 있다!

    스프링과 타임리프 연동이 매우 잘 되어 있어서 스프링 컨트롤러에서 타임리프 form 페이지로 보내면 BindingResult에서 에러를 알 수 있는 메서드가 굉장히 많은데 이것들을 이용해서 화면을 구성할 수 있다!

    @PostMapping("/members/new")
    public String create(@Valid MemberForm form, BindingResult result){//MemberForm에서 NotEmpty였던 필드 validation 해준다.
        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:/";
    }
  3. 타임리프 템플릿 : createMemberForm.html <form action="/members/new"...method="post"> : 작성한 HTML Form 데이터는 동일한 url로 POST 방식으로 보낸다! th:object="${memberForm} : 타임리프 내에서 memberForm 객체를 변수처럼 계속 사용하겠다는 뜻이다. *{...} : 프로퍼티 접근법으로 객체의 속성에 접근할 수 있다. =>*{name}, *{city}, *{streeet}...

Last updated