Controller(+ @Valid)

2876 단어 JPASpringbootJPA

Controller: 웹 계층, Client의 요청을 받는 부분

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"; // templates/members/createMemberForm.html 랜더링
    }

    @PostMapping("/members/new")
    public String saveForm(@Valid MemberForm memberForm, BindingResult result) {
        /**
         * 1. @Valid를 통해 오류가 없는 지 확인 -> ex: MembeForm에서 name을 필수이므로 @NotEmpty 애노테이션 추가하고, name의 값이 empty인지 아닌지 확인
         * 2. If name이 emtpy이면, @Valid에서 오류를 던짐 & BindingResult에 오류가 들어감
         * 3. createMemberForm.html의 fields.hasError('name')에 오류 & message가 대입 됨
         * (더 자세한 내용은 SpringMVC2 Validation 부분 참고)
         */

        if (result.hasErrors()) {
            return "members/createMemberForm";
        }

        Address address = new Address(memberForm.getCity(), memberForm.getStreet(), memberForm.getZipcode());
        Member member = Member.createMember(memberForm.getName(), address);

        memberService.join(member);

        return "redirect:/"; // templates/members/createMemberForm.html 랜더링
    }

    @GetMapping("/members")
    public String getMembers(Model model) {
        List<Member> members = memberService.findMembers();
        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;
}

Client 쪽에서 회원가입하는 Member의 Form 데이터를 서버로 보낼때, 해당 데이터들을 MemberForm에 담아서 서버에서 처리합니다.

@Valid를 통해 MemberForm를 validate 합니다. @Valid 애노테이션이 있으면, MemberForm에서 @NotEmpty,@NotBlank 등등 애노테이션이 붙어있는 속성들을 확인하고, 애노테이션을 만족하는지 확인합니다. 만약 만족하지 않으면, BindingResult에 error가 담기고, BindingResult를 client에 보내서 오류를 표시하도록 할 수 있습니다.
예제에서는, MemberForm의 name에 @NotEmpty가 붙어 있는데, 만약에 client에서 보낸 form 데이터에 name값이 없으면 해당 error가 BindingResult에 담겨서 client 쪽으로 보내지며 , message "회원 이름은 필수 입니다."를 랜더링 하도록 할 수 있습니다.

(값을 validate할 수 있는 방법은 다양하며, 더 자세한건 앞서 학습했던 Spring_MVC2의 validataion을 참고하시면 됩니다.https://github.com/k-ms1998/Spring-studies)

좋은 웹페이지 즐겨찾기