관심쟁이 영호

[Spring Boot] Bean Validation 적용하기 본문

Bank-End/Spring Boot

[Spring Boot] Bean Validation 적용하기

관심쟁이 영호 2021. 8. 3. 15:36
반응형

오늘은 Bean Validation에 대해서 기록을 해보자!

 

목차

  • Bean Validation 이란?
  • Bean Validation Error 발생시키기
  • Bean Validation 실행 내용 이해하기
  • Bean Validation Object Error

Bean Validation 이란?

웹 서버를 운영하면서, 사용자에게 여러 가지 입력을 받는다.

모든 사용자가 올바른 양식의 입력을 해주면 좋겠지만, 사용자도 사람인지라 올바르지 못한 입력을 할 가능성이 있다.

가령, 회원가입을 진행하면서 id를 공백으로 입력하는 경우를 말할 수 있다.

 

물론, Controller에서 if문을 이용하여 입력값을 검증할 수 있다. (고대 개발자들은 이렇게 했겠지..)

이렇게 할 경우에는 Controller가 너무 길어지고, 코드의 구성이 복잡하여 코드를 읽는데 지장이 생길 수 있다.

그리고 중복되는 검증처리들이 존재하여 컨트롤러마다 똑같은 코드를 입력해야 하는 경우가 있을 수 있다.

 

이럴 경우를 방지하기 위해서 스프링에서 Bean Validation 인터페이스를 미리 만들어 검증 처리를 하는데 도움을 준다.

 

한마디로, 검증 처리를 깔끔하고 간편하게 구현할 수 있도록 도와주는 인터페이스이다.

 


Bean Validation Error 발생시키기

 

Step. 1

가장 먼저, Bean Validation 라이브러리를 추가하자!

build.gradle에 다음 코드를 추가한 다음 새로고침! (나는 gradle기반 프로젝트다.)

 

dependencies {

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

}

 

 

jakarta.validation-api(인터페이스)와 hibernate-validator(구현체)가 설치된다.

 

 

Step. 2

먼저 검증을 적용할 도메인을 찾아보자! 필자는 User 클래스에 적용한다.

코드는 다음과 같다.

@Data
@Entity(name = "user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long sequenceId;


    @NotNull
    @NotBlank
    @Column(length = 25, nullable = false)
    String userId;

    @NotNull
    @NotBlank
    @Column(nullable = false)
    String password;

};

두가지의 변수에 각 2가지씩 (총 4가지)의 검증을 추가했다. 내용은 다음과 같다.

  • String userId의 "@NotBlank", "@NotNull"
  • String password의 "@NotBlank", "@NotNull"

말 그대로 공백과 Null을 받지 않는다는 이야기다!

 

 

Step. 3

이제 해당 검증을 거칠 부분을 정해야한다.

정하는 방법은 "@Validated" 어노테이션을 추가하는 방법이다.

다음 코드를 보자.

 

@PostMapping("/signup")
    public String signupForm(@Validated @ModelAttribute User user, BindingResult bindingResult, RedirectAttributes redirectAttributes){

        log.info("userid ={}", user.getUserId());
        if(bindingResult.hasErrors()){
            log.info("errors ={}", bindingResult);
            return "/signup";
        }

        signUpService.signup(user);

        return "redirect:/";
    }

 

Signup 에서 "@Validated"를 추가한 것을 볼 수 있다.

 

이렇게 하면 user을 바인딩하면서 생기는 에러를 bindingResult에 담는다!

 


Bean Validation 실행 내용 이해하기

 

Bean Validation이 어떻게 동작하는지 순서대로 살펴보자!

 

  1. Bean Validation 라이브러리를 설치하면 스프링 부트는 그것을 감지하고 스프링에 통합한다.
  2. 해당하는 Validator를 글로벌 Validator로 등록을 한다.
  3. @ModelAttribute가 타입 변환을 시도한다. 성공하면 Validator 수행, 실패하면 FieldError로 binding result에 추가!    ※ 한마디로 타입 변환에 성공한 내용만 검증을 수행한다!
  4. 해당 Validator는 어노테이션을 살펴보고 검증을 수행한다.
  5. 검증 오류가 발생하면 "FieldError"와 "ObjectError"를 생성해서 BindingResult에 담아준다.

Bean Validation Object Error

 

지금까지 보았던 내용은 필드 자체에 오류이다.

그럼 다음과 같은 검증을 하고 싶을 때는 어떻게 해야 할까?

 

"id의 길이와 비밀번호의 길이의 합은 100을 넘어선 안된다."

 

두 가지의 필드가 합쳐서 검증이 수행되어야 한다는 것을 알 수 있다.

 

※ 해당 기능을 수행하기 위해서 "@ScriptAssert"라는 기능을 구현해놓긴 했는 데 사용하기에 한계가 있다!

관심 있으면 찾아보자!!

 

이 경우에는, 컨트롤러에 직접 코드를 추가하자!

그래야 제약도 없다.

 

더 좋은 방법이 있을 것만 같다.

이건 추후에 알게 된다면 포스팅을 하자!

300x250
Comments