Spring

[Spring] Validation

미소여우 2022. 5. 20. 16:57
728x90

유효성 검사

유효성 검사를 해야하는 이유는 클라이언트가 입력한 값이 서버에서 적절하게 이해하고 처리해줄 수 있는지 사전 검사해주는 역할이라 보면 된다. 스프링 부트에서는 아래의 라이브러리를 추가해주면 어노테이션만으로 아주 쉽게 유효성 검사를 할 수 있다. 커스텀이 필요하면 그때는 만들어주면 될거 같다. 

implementation 'org.springframework.boot:spring-boot-starter-validation'

유효값 검증을 위해 validation을 사용하는데, 다음과 같은 어노테이션들을 제공한다.

어노테이션 설명
@NotEmpty NULL 체크, 문자열의 경우 길이 0인지 검사
@NotBlank NULL 체크 및 문자열의 경우 길이 0 및 빈 문자열(" ") 검사
@Length(min=, max=) 최소, 최대 길이 검사
@Email 이메일 형식인지 검사
@Max(숫자) 지정한 값보다 작은지 검사
@Min(숫자) 지정한 값보다 큰지 검사
@Null 값이 NULL인지 검사
@NotNull 값이 NULL이 아닌지 검사

적용

MemberDto에 활용해보는 예제이다.

@Getter
@Setter
public class MemberFormDto {

    @NotBlank(message = "이름은 필수 입력 값입니다.")
    private String name;

    @NotEmpty(message = "이메일은 필수 입력 값입니다.")
    @Email(message = "이메일 형식으로 입력해주세요.")
    private String email;

    @NotEmpty(message = "비밀번호는 필수 입력 값입니다.")
    @Length(min = 8, max = 16, message = "비밀번호는 8자 이상, 16자 이하로 입력해주세요")
    private String password;

    @NotEmpty(message = "주소는 필수 입력 값입니다.")
    private String address;
}

Controller 적용

컨트롤러 파라미터로 DTO 매개변수 앞에는 @Valid를 달아주고, BindingResult를 넣어주면 에러가 발생시 bindingResult에 에러 내용을 담아준다. 내 기억으로는 BindingResult는 반드시 유효성 검사하는 인스턴스 바로 다음에 위치해야한다. bindingResult는 다음에 정리해서 올리도록 하겠다.

@PostMapping(value = "/new")
public String memberForm(@Valid MemberFormDto memberFormDto,
                         BindingResult bindingResult, Model model) {

    if (bindingResult.hasErrors()) {
        return "member/memberForm";
    }

    try {
        Member member = Member.createMember(memberFormDto, passwordEncoder);
        memberService.saveMember(member);
    } catch (IllegalStateException e) {
        model.addAttribute("errorMessage", e.getMessage());
        return "member/memberForm";
    }
    return "redirect:/";
}

확인

아무것도 입력하지 않고, 서버에 전송해보면 다음과 같이 에러 코드를 볼 수 있다.

728x90