본문 바로가기

SpringFramework/Spring

Spring - Validation

Spring에서는, Validation Annotation으로 Request Form에대한 요청이나, Parameter, Bean Class와 같은 여러가지 필드에 대하여 길이제한, 필수값 등.. 유효성 check를 할 수 있다.

 

의존성 추가

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-validation' // 유효성검사
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

Validation관련 주요 어노테이션 설명

@Min(value=*): value에 입력된 수치보다 크거나 같아야 한다

@Max(value=*): value에 입력된 수치보다 작거나 같아야 한다

@DemicalMin(value=*, inclusive=*): value에 입력된 수치보다 크거나 같아야한다. inclusive가 false(default는 true)인경우, 크다로 변경

@DemicalMax(value=*, inclusive=*): value에 입력된 수치보다 작거나 같아야한다. inclusive가 false(default는 true)인경우, 작다로 변경

(!) Min, Max는 double과 float를 지원하지 않는다

@Positive: 양수이어야 한다. (0은 잘못된 값)

@PositiveOrZero: 양수 혹은 0이어야 한다

@Negative: 음수이어야 한다. (0은 잘못된 값)

@NegativeOrZero: 음수 혹은 0이어야 한다

@Digits(integer=*, fraction=*): 허용되는 범위 내의 숫자를 확인. integer는 허용되는 최대 정수 자릿수, fraction은 허용되는 최대 소수 자릿수 (double과 float는 지원하지 않는다)

@Length(min=*, max=*): 문자열의 길이가 min과 max사이인지 확인

@Range(min=*, max=*): 숫자의 유효범위. min과 max사이인지 확인

@Size(min=*, max=*): 범위 검증. 요소(문자열 길이, 배열크기 등)의 크기는 min보다 크거나 같아야하며, max보다 작거나 같아야 한다.

@Email: 형식이 이메일 주소이여야 한다

@Pattern(regexp=*): 문자열이 정규표현식에 해당되는지를 검증 (단, null은 유효한 것으로 본다)

@AssertTrue, @AssertFalse: 값이 각각 true, false 인지를 검증 (단, null은 유효한 것으로 본다)

@Null: null이어야함

@NotNull: null이 아니여야함

@NotEmpty: null이거나 비어있으면 안됨

@NotBlank: null이 아니어야하며, 하나 이상의 whitespace가 아닌 문자열이 있어야함

@Past, @PastOrPresent: 날짜 검증. 현재보다 과거 (PastOrPresent는 현재를 포함)

@Future, @FutureOrPresent: 날짜 검증. 현재보다 미래 (FutureOrPresent는 현재를 포함

@URL: 문자열이 URL인지 확인

 

어노테이션의 공통 Parameter

  • message: 유효성 조건에 충족하지 않는 경우 출력할 전달 message를 설정
  • groups: 특정 상황에서 실행할 수 있도록함. 보통 클래스가 지정된다
  • payload: 유효성 검사에서 전달할 매개변수

@Valid 어노테이션을 선언하여 자바빈 Class내에 선언시켜놓은 어노테이션에 대하여 유효성 검증을 시작한다.

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.Valid;

public class MemberDto {
    @NotNull(message = "이름을 입력하세요.") // NULL을 허용하지 않음
    private String name;

    @NotNull(message = "생년월일을 입력하세요.")
    private String birth;

    @NotNull(message = "성별을 입력하세요.")
    @Pattern(regexp = "^[MF]$", message = "성별 입력이 잘못되었습니다.") // 문자열이 정규표현식에 의거 M 혹은 F아니면 유효하지 않는다.
    private String sex;

    @NotNull(message = "주소를 입력하세요.")
    @NotEmpty(message = "주소를 입력하세요.") // 공백(whitespace)만 존재한다면 유효하지 않음
    @Length(max = 255, message = "주소값은 255자까지 입력이 가능합니다.")
    private String address;

    @Length(max = 255, message = "상세 주소값은 255자까지 입력이 가능합니다.")
    private String addressDetail;
}

public class MemberController {
    @GetMapping(value = "/member")
    public void memberInsert(@Valid @ModelAttribute MemberDto memberDto) {
        // @Valid 어노테이션을 선언함으로써 유효성 검사가 시작된다.
    }
}

 

유효성검사 기준에 충족하지 않을경우,

 

Field error in object 'memberDto' on field 'address': rejected value [null]; codes [NotNull.memberDto.address,NotNull.address,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [memberDto.address,address]; arguments []; default message [address]]; default message [주소를 입력하세요.]

 

와 같은 문구가 log에 출력된다. 유효성검사에 충족되지 않을때 처리해주는 Exception 처리부를 구현하여 비즈니스 로직을 정리할 수 있다.

- @RestControllerAdvice: 서버단에서 로직을 처리하는 과정에서 발생하는 예외를 통합관리하고, 그 결과를 클라이언트에 반환해준다.

- @ExceptionHandler: 파라미터에 정의된 Exception이 발생하면, 정의된 로직을 처리하겠다고 선언한다. (Exception이 발생했을 경우 응답코드나, landing등을 유도할 수 있다)

 

구현예제

import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
 
@RestControllerAdvice
public class ExampleException {
    @ExceptionHandler(BindException.class)
    public String methodValidException(BindException e) {
        BindingResult bindingResult = e.getBindingResult();
        String message = bindingResult.getFieldError().getDefaultMessage(); // validation 어노테이션에서 정의한 message를 가져오는 메소드
        return message;
    }
}

 

'SpringFramework > Spring' 카테고리의 다른 글

Spring - 인스턴스 변수 참조  (0) 2021.10.20
Spring - Redis 연동  (0) 2021.10.20
Spring - ErrorController  (0) 2021.10.15
Spring - Filter, InterCeptor, AOP  (0) 2021.10.13
Spring - Log4j2  (0) 2021.10.13