처음부터 차근차근

스프링 부트의 유효성 검사 본문

Framework/Spring

스프링 부트의 유효성 검사

_soyoung 2022. 9. 18. 15:33
반응형

Bean Validation

Bean Validation 데이터 유효성 검사 프레임워크이다.

어노테이션으로 데이터를 검증한다.

검증 자체를 DTO or 도메인에 얹는 방식으로 수행한다.

 

Hibernate Validator

Bean Validation 명세의 구현체이다.

스프링 부트에서는 이 Hibernate Validator를 유효성 검사 표준으로 채택해서 사용하고 있다.

 

스프링 부트의 유효성 검사

스프링 부트는 각 계층으로 데이터가 넘어오는 시점에 해당 데이터에 대한 검사를 실시한다.

여기서 각 계층은 컨트롤러, 서비스, 레파지토리 등을 의미한다.

dto는 데이터를 담아 컨트롤러 -> 서비스 -> 레파지토리 이렇게 이동한다.

그래서 dto에다 유효성 검사를 얹어놓은 것이다.

스프링 부트는 dto 객체를 대상으로 유효성검사를 수행한다.

 

유효성 검사 어노테이션 정리

문자열 검증

@Null : null 값만 허용

@NotNull : null을 허용하지 않음. "" 과 " "는 허용함.

@NotEmpty : null과 ""을 허용하지 않음. " "는 허용함.

@NotBlank : null과 "", " " 모두 허용하지 않음

 

최댓값, 최솟값 검증

BigDecimal, BigInteger, int, long 타입 지원함.

@DecimalMax(value="숫자") : 숫자보다 작은 값 허용

@DecimalMin(value="숫자") : 숫자보다 큰 값 허용

@Min(value=숫자) : 숫자 이상의 값 허용

@Max(value=숫자) : 숫자 이하의 값 허용

 

값 범위 검증

BigDecimal, BigInteger, int, long 타입 지원함.

@Positive : 양수 허용
@PositiveOrZero : 0과 양수 허용
@Negative : 음수 허용
@NegativeOrZero : 0과 음수 허용

 

시간 검증

Date, LocalDate, LocalDateTime 등 지원함.

@Future : 현재보다 미래날짜 허용

@FutureOrPresent : 현재와 미래날짜 허용

@Past : 현재보다 과거날짜 허용

@PastOrPresent : 현재와 과거 허용

 

자릿수 범위 검증

@Digits(integer = 숫자1, fraction = 숫자2) : 숫자1의 정수 자리수와 숫자2의 소수 자리수 허용

 

Boolean 검증

@AssertTrue : true인지 체크. null은 체크하지 않음

@AssertFalse : false인지 체크. null은 체크안함

 

문자열 길이 검증

@Size(min = 숫자1, max = 숫자2) : 숫자1 이상 숫자2 이하 범위 허용

 

정규식 검증

@Pattern(regexp = "정규식") : 정규식을 검사함.

 

유효성 검사 예시

public class Board {
    @Min(value=1)
    private int id;

    @NotBlank(message = "제목은 필수입니다.")
    private String title;

    @NotBlank(message = "내용은 필수 값입니다.")
    private String content;

    @NotBlank
    private String writeTime;

    @Min(value=0)
    private int viewCount;

    @Min(value=0) @Max(value=1)
    private int state; // 0: 비공개, 1: 공개

    @Min(value=1)
    private int writerId;
}

 

@Vaild vs @Validated

@Vaild은 자바에서 지원하는 어노테이션이고, @Validated은 스프링에서 별도로 지원하는 어노테이션이다.

@Validated는 @Vaild를 포함하고 있어서 @Validated로 변경할 수 있고, 

@Validated에는 유효성 검사를 그룹으로 묶어서 특정 대상만 유효성 검사를 할 수 있는 기능이 있다.

// dto
Min(value=1, groups=그룹1.class)
private int age;

Min(value=10, groups=그룹2.class)
private int view;


// controller
public String createBoard(@Validated(그룹1.class) @RequestBody Board board)

이런식으로...

 

@Validated는

특정 그룹을 설정하지 않은 경우엔 groups가 설정되지 않은 필드에 대해 유효성 검사를 하고,

특정 그룹을 설정한 경우엔 지정된 그룹으로 설정된 필드만 유효성 검사를 한다.

그래서 위의 예시의 경우에는 view 필드가 유효성 검사를 거치지 않게된다.

@Validated를 사용할 때는 이 점에 유의해서 사용해야 한다.

반응형
Comments