Springboot의 어노테이션을 이용한 validation을 하는 방법에 대해 알아보자.
API의 parameter에 따라 별도의 오류 메시지와 조건이 필요하고,
이런 경우 쉽게 사용할 수 있는 것이 @NotNull, @NotEmpty, @NotBlank, @Null 이다.
위의 4가지 annotation은 Bean Validation에서 제공하는 표준 Validation 으로 사용하는 방법은 유사하지만 잘못 사용하면 완전히 다른 결과를 초래할 수 있기 때문에 차이를 알아두어야한다.
public class MemberLoginRequestDto {
@NotNull(message = "이름은 Null 일 수 없습니다.")
@Size(min = 1, max = 10, message = "이름은 1-10자 이어야 합니다.")
private String name;
@NotNull(message = "이메일은 Null 일 수 없습니다.")
@Min(1)
@Max(10)
@Email
private String email;
}
1. 문자열 유무 검증
@NotBlank
- null 이 아닌 값
- 공백이 아닌 문자를 하나 이상 포함한다.
- 반드시 값이 존재하고 공백 문자를 제외한 길이가 0보다 커야 한다.
@NotEmpty
- null 이거나 empty(빈 문자열)가 아니어야 한다.
- Type : CharSequence (length of character) Collection (collection size) Map (map size Array (array length)
- 반드시 값이 존재하고 길이 혹은 크기가 0보다 커야 한다.
@NotNull
- Type : 어떤 타입이든 수용한다.
- null 이 아닌 값
- 반드시 값이 있어야 한다.
@Null
- Type : 어떤 타입이든 수용한다.
- null 값
null | "" | " " | |
@NotNull | Invalid | Valid | Valid |
@NotEmpty | Invalid | Invalid | Valid |
@NotBlank | Invalid | Invalid | Invalid |
2. 최대 최소에 대한 검증
supportType
- BigDecimal BigInteger CharSequence byte, short, int, long, 이에 대응하는 Wrapper 클래스
- double, float는 지원하지 않는다.
- null 도 valid로 간주
Validation
- @DecimalMax(value="100000")
- 지정된 최대 값보다 작거나 같아야 한다.
- Require: String value => max 값 지정
- @DecimalMin(value="1")
- 지정된 최소 값보다 크거나 같아야 한다.
- Require: String value => min 값 지정
- @Max(value = 1000)
- 지정된 최대 값보다 작거나 같아야 한다.
- Require : int value => max 값을 지정한다.
- @Min(value = 1)
- 지정된 최소 값보다 크거나 같아야 한다.
- Require : int value => min 값을 지정한다.
3. 이메일 검증
- @Email
- 올바른 형식의 이메일 주소여야 한다.
4. 자릿수 범위 검증
- @Digits(integer = 5, fraction = 5)
- 허용한 범위 내의 숫자이다.
- Require : int integer => 이 숫자에 허용되는 최대 정수 자릿수
- Require : int fraction => 이 숫자에 허용되는 최대 소수 자릿수
5. 크기 검증
- @Size(max = 5, min = 3)
- 허용한 범위 내의 숫자이다.
- Require : int max => element의 크기가 작거나 같다.
- Require : int min => element의 크기가 크거나 같다.
DTO 를 쓰는 이유
DTO를 사용하는 이유는,
1. Member 라는 도메인에 들어있는 모든 변수가 request 및 response에 필요하지 않음에도 불필요하게 사용될 수 있고,
2. 각 API의 request와 response를 맞추기 위해서 entity가 수정되어서는 안되기 때문이다.
따라서 각 DTO에는
필요한 데이터만 정의되어야 하며,
필수 값에 대한 조건을 체크하는 것이나 DTO에서 Domain으로 변환하거나, Domain에서 DTO로 변환하는 로직은 Domain이 아닌 DTO에 담겨야 한다.
즉, 위의 Data의 Validation도 DTO의 역할이기 때문에 DTO에 넣어주면 역할과 책임이 좀 더 명확해질 수 있다.
Controller 설정
@PostMapping("/login")
public ResponseEntity login(@Valid @RequestBody MemberLoginDto loginUser) {
MemberLoginDto login = memberService.login(loginUser);
return new ResponseEntity<>(new BaseResult.Normal(login), HttpStatus.OK);
}
DTO에서 설정한 @NotNull과 같은 Validation을
사용하고자하는 Controller 내 API에서 @RequestBody에 @Valid를 추가해주면, 설정된 Bean Validation을 사용할 수 있다.
추가로
javax.validation.constraints 패키지를 보면 많은 어노테이션들이 존재하고, @Valid를 이용한 객체 검증 시 기본적으로 이 어노테이션을 이용한다.
@Valid를 이용하면, Service 단이 아닌 객체 안에서, 들어오는 값에 대해 검증을 할 수 있다.
@Valid 를 사용하는 방법
@RestController
@Slf4j
public class TestController {
@PostMapping("/user")
public ResponseEntity<String> savePost(final @Valid @RequestBody UserDto userDto) {
log.info(userDto.toString());
return ResponseEntity.ok().body("postDto 객체 검증 성공");
}
}
parameter로 @RequestBody 옆에 @Valid를 작성하면, RequestBody로 들어오는 객체에 대한 검증을 수행한다.
이 검증에 대한 세부사항은 객체 안에 정의해두어야 한다. (e.g. @NotNull)
@Valid와 검증 어노테이션을 같이 잘 써주면, 객체 단에서 에러를 잡을 수 있다.
ref
https://sanghye.tistory.com/36
'Server' 카테고리의 다른 글
[Spring] Spring boot와 JPA 활용 - 웹 계층 개발 (0) | 2022.07.05 |
---|---|
[Spring] Spring boot와 JPA 활용 - 주문 도메인 개발 (0) | 2022.06.24 |
[Spring] Spring boot와 JPA 활용 - 상품 도메인 개발 (0) | 2022.06.23 |
[Spring] Spring boot와 JPA 활용 - 애플리케이션 구현 준비, 회원 도메인 개발 (0) | 2022.06.19 |
[Spring] Spring boot와 JPA 활용 - 도메인 분석 설계 (0) | 2022.06.05 |