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 |