-
@Valid 세팅 및 사용법Spring 2019. 10. 26. 13:25
간단소개
API를 만들다 보면 유효성체크를 꼭하기 마련이다.
매번 유효성체크를 로직을 작성하는 것도 매우 반복되는 일이다.
Javax에서 @Valid 어노테이션을 제공해주고 있는대 Bean Validation을 아주 쉽고 간편 유효성검사를 제공해주고 있다!
예제 환경
SpringBoot 2.1.9
Java 1.8
Maven
세팅
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>SpringBoot 프로젝트를 생성 할 때, SpringBoot-Web을 선택하면 javax.validation은 자동으로 들어가 있다.
그냥 Spring이라면 아래처럼 선언해주면된다
pom.xml
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>예제
model
package com.example.validtest.model;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Setter
@ToString
public class UserDto {
@NotNull(message = "번호에 Null값을 넣을 수 없습니다.")
private long no;
@NotNull(message = "이름에 Null값을 넣을 수 없습니다.")
private String name;
}예제는 최대한 간단히 했다.
- 멤버필드에 @NotNull을 선언해 준다.
- message속성은 해당 멤버필드가 유효성체크에 통과하지 못하면 보여줄 메세지이다
어노테이션
예제
설명
@DecimalMax
@DecimalMax(value = "5.5")
- 소수 최대값 지정
- 같은값 허용
- null 허용
@DecimalMin
@DecimalMin(value = "5.5")
- 소수 최소값 지정
- 같은값 허용
- null 허용
@Max
@Max(value = 10)
- 정수 최대값 지정
- 같은값 허용
- null 허용
@Min
@Min(value = 10)
- 정수 최소값 지정
- 같은값 허용
- null 허용
@Digits
@Digits(integer = 3, fraction = 2)
- interger 정수 허용 자리수 ex) 3이니까 100자리 까지허용
- fraction은 소수점 허용 자리수 ex)2니까 소수점 둘째짜리 까지 허용
- null 허용
@Size
@Size(min = 2, max = 4)
- 길이를 검증
- null 허용- ex) "a" 비허용, "abcd"허용
@NotNull
@NotNull
설명생략
@Pattern
@Pattern(regexp = "")
- 정규식에 해당하는 것만 통과
@NotEmpty
@NotEmpty
- null 비허용
- 길이가 0 비허용 ex) ""
@Positive @Positive
- 양수만 허용
- 0 비허용
- null 비허용@PositiveOrZero @PositiveOrZero - 양수 허용
- 0 허용
- null 비허용@Negative @Negative - 음수만 허용
- 0 비허용
- null 비허용@NegativeOrZero @NegativeOrZero - 음수만 허용
- 0 허용
- null 비허용@Email @Email(regexp = "정규식") - 정규식따로 작성 권장 , "abc@def" 같은 케이스도 통과해버림
@Future @Future - 미래날짜만 허용
- 시간까지 체크는 안됨
- 멤버필드 타입 String일 경우 에러발생
- LocalDate권장
@FutureOrPresent @FutureOrPresent - 미래, 현재날짜만 허용
- 시간까지 체크는 안됨
- 멤버필드 타입 String일 경우 에러.
- LocalDate권장
@Past @Past - 과거날짜만 허용
- 시간까지 체크는 안됨
- 멤버필드 타입 String일 경우 에러.
- LocalDate권장
@PastOrPresent @FutureOrPresent
- 과거, 현재 날짜만 허용
- 시간까지 체크는 안됨
- 멤버필드 타입 String일 경우 에러.
- LocalDate권장
Controller
package com.example.validtest.controller;
import com.example.validtest.model.UserDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@Slf4j
@RestController
public class UserController {
@PostMapping(value = "/user")
public String insertUser(@RequestBody @Valid UserDto userDto, BindingResult bindingResult){
log.info("@ param : {}", userDto);
return "success";
}
}- (필수) 메소드의 매개변수에 @Valid를 선언해준다.
- BindingResult는 에러 내역을 볼 수 있다.
- List<UserDto> list와 같은 형태에서는 검증 할 수 없다. (다른방법을 통해서 가능)
postman
- 테스트를 위해서 API를 쉽게 호출해 볼 수 있는 Postman 을 이용했다.
호출결과
굉장히 많은 에러 메세지를 내려 주고 있다.
이렇게 통째로 내려주면 안되는 이유는
1. 시스템 내부 정보가 포함되어있음
2. 클라이언트단에 내려주는 형식도 너무 복잡해 사용하기 힘듬.
아래 글을 통해서 이쁘게 가공되고 통일된 Response를 내려주도록 하자.
@ControllerAdvice를 이용해 에러 처리하기
'Spring' 카테고리의 다른 글
Gradle 인식못할 때 (0) 2020.04.02 @Valid 와 @ControllerAdvice로 DTO 예외처리하기 (3) 2020.01.12 MyBatis속성 setting값의 우선순위는 어떻게 될까? (0) 2019.09.15 Gradle annotationProcessor (0) 2019.09.07 [Spring Security] ajax요청시 403 에러 발생 처리방법 (0) 2018.11.18