본문 바로가기

Dev/Spring Boot

@Valid로 유효성 체크하기

혼자 공부하며 이해한 내용을 바탕으로 정리하고자 한다.


먼저 유효성 체크를 해야하는 경우는 다음과 같다

  • 회원가입을 할 경우에 패스워드에 보안문제로 인해 특수문자나 영어 대소문자등을 포함해서 사용해야 하는 경우
  • 이메일 형식의 아이디를 사용하는데 중간에 @가 빠진 상태로 입력하는 경우

대게 유효성 체크를 해주는 경우는 프론트와 백엔드에서 이중으로 처리해주는 것이 좋다.

스프링 부트에서는 도메인으로 사용하는 필드에 조건과 메시지를 작성해주면 @Vaild 어노테이션과 함께 유효성 검사를 할 수 있다.

 

제일먼저 build.gradle에 아래와 같이 추가해줘야 한다.

스프링 부트 2.3버전 이상부터는 validation이 스프링 부트 스타터 자체에 포함되어있지 않고 별도의 모듈로 분리되었다는점 알아두자!

// valid 사용
implementation 'org.springframework.boot:spring-boot-starter-validation'

이렇게 추가하게되면 아래와같은 어노테이션을 사용할 수 있다. 

  • @Eamil : 이메일 형식에 맞는지 아닌지 유효성 체크
  • @NotBlank : 필수입력 값 체크
  • 이외에도 NotNull, @Size, @Min, @Max, @NotEmpty 등 여러가지 추가된 어노테이션 등이 있는데 정보 확인은 하단에 있는 참고사이트에서 확인 및 여기 클릭
    private Long id;

    @NotBlank(message = "이메일은 필수 입력 값입니다.")
    @Email(message = "이메일 형식에 맞지 않습니다.")
    private String email;

    @NotBlank(message = "패스워드는 필수 입력 값입니다.")
    @Pattern(regexp="(?=.*[0-9])(?=.*[a-z])(?=.*\\W)(?=\\S+$).{6,12}",
            message = "비밀번호는 영문자와 숫자, 특수기호가 적어도 1개 이상 포함된 6자~12자의 비밀번호여야 합니다.")
    private String password;

    private Date instTime;
    private Date updtTime;
    private int grade;
    private String status;

    @Size(min = 2, max = 8, message = "이름을 2~8자 사이로 입력해주세요.")
    private String name;

어노테이션과 함께 유효성 체크시 사용할 메시지를 적어준다.

 

HTTP 응답을 받아주는 AccountController.java 파일

    @PostMapping("/user/sendSignUpEmail")
//    @ResponseBody
    public String sendSignUpEmail(@ModelAttribute @Valid Account account, BindingResult errors, Model model) throws DuplicateEmailException, SendEmailException{
        if (errors.hasErrors()) {
            // 유효성 통과 못한 필드와 메시지를 핸들링
            Map<String, String> validatorResult = accountSecurityService.validateHandling(errors);
            for (String key : validatorResult.keySet()) {
                model.addAttribute(key, validatorResult.get(key));
            }
            return "/user/register";
        }
  • 여기선 Account에 @Valid 어노테이션을 붙여줌으로써 Account에 캡슐화 형태로 넘어올 떄 유효성을 체크하라는 뜻이다.
  • 여기서 BindingResult를 사용해서 에러가 있는지를 검사해준다. (BindingResult에 있는 hasError() 사용)
  • 여기서는 유효성 체크할 때 에러가 났을 경우 다시 회원가입 폼으로 되돌려준다.
 // 회원가입 시, 유효성 체크
    public Map<String, String> validateHandling(Errors errors) {
        Map<String, String> validatorResult = new HashMap<>();

        for (FieldError error : errors.getFieldErrors()) {
            String validKeyName = String.format("valid_%s", error.getField());
            validatorResult.put(validKeyName, error.getDefaultMessage());
        }
        return validatorResult;
    }

실제 유효성 체크부분이다.

  • errors.getFieldErrors() : 유효성 검사에 실패한 필드 목록을 가져옵니다.
  • error.getField() : 유효성 검사에 실패한 필드명을 가져옵니다.
  • error.getDefaultMessage() : 유효성 검사에 실패한 필드에 정의된 메시지를 가져옵니다.

회원가입 폼 (register.html)

 <form class="sign-up" th:action="@{/user/sendSignUpEmail}" method="post">
 	<h2 class="heading mb-4">회원가입</h2>
 	<div class="form-group fone mt-2"> <i class="fas fa-user"></i>
 		<input type="name" name="name" class="form-control" placeholder="Name">
 		<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_name}"></span>
 	</div>
 	<div class="form-group fone mt-2"> <i class="fas fa-envelope"></i>
 		<input type="text" name="email" class="form-control" placeholder="Email">
 		<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_email}"></span>
 	</div>
 	<div class="form-group fone mt-2"> <i class="fas fa-lock"></i>
 		<input type="password" name="password" class="form-control" placeholder="Password">
 	<div class="image"><i class="fas fa-eye"></i></div>
 		<span th:style="${'color: red; font-size:11px;'}" th:text="${valid_password}"></span>
 	</div>
 	<div class="form-group fone mt-2"> <i class="fas fa-lock"></i> <input type="password" name="confirm" class="form-control" placeholder="Confirm Password"></div>
 		<button type="submit" class="btn btn-block btn-bold btn-primary mt-2" onclick="regFun()">Sign up now!</button>
 </form>

회원가입 폼에서 타임리프를 사용해서 "${valid_ + 선언 필드명} 형태로 유효성 체크 실패시 도메인에 선언한 메시지를 가져와서 보여준다.


유효성 체크 결과 화면

이상 유효성 체크 정리 끝!


참고 사이트

victorydntmd.tistory.com/332

 

[SpringBoot] @Valid로 유효성 검사하기

유효성 검사 유효성 검사란, 요청한 데이터가 어떤 조건에 충족하는지 확인하는 작업입니다. 예를 들어, 회원가입을 할 때 이메일을 입력하는 란이 있다고 가정하겠습니다. 이메일 주소는 흔히

victorydntmd.tistory.com

www.baeldung.com/javax-validation

 

Java Bean Validation Basics | Baeldung

Learn the basics of Java Bean validation, the common annotations and how to trigger the validation process.

www.baeldung.com