앞서 제작한 도메인들과 비즈니스 로직들에 대해 웹 계층을 개발한다.
@Getter @Setter
public class MemberForm {
@NotEmpty(message = "회원 이름은 필수입니다.")
private String name;
private String city;
private String street;
private String zipcode;
}
이름 필드에 @NotEmpty
validation을 추가한다.
@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";
}
@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:/";
}
}
회원 등록 폼에서 데이터를 입력하고 Submit 버튼을 클릭하면 /members/new를 POST 방식으로 요청한다.
회원가입이 끝나면 홈 화면(redirect:/)으로 리다이렉트된다.
create()의 인자 MemberForm에 붙은 @Valid
를 통해 해당 객체의 검증이 이루어진다.
만약 MemberForm의 name 필드 값이 비어 있다면 @Valid가 에러를 발생시킨다. 이러한 에러 결과 값은 두 번째 인자인 BindingResult
에 전달되고 BindingResult 값을 통해 에러를 탐지할 수 있다.