본문 바로가기
IT/Java

@Valid annotation (BindingResult, Error)(유효성 검사)

by 성준하이 2022. 8. 22.
반응형

지난번에 다뤘던 포스팅 중에서 not null관련 포스팅도 존재하고, jackson 관련 포스팅도 존재한다.

둘의 공통점은 dto 등에서 변수에 설정을 걸어주는것이다.

 

하지만 이 둘 말고도 또다른 annotation이 존재하는데 그것들에 대해서 잠깐 소개 하고 valid annotation으로 한번에 유효성 검증을 하는 법에 대해서 소개해보려고 포스팅을 작성한다.

위에 두가지 경우에 대해서는 아래 참고 포스팅을 참고해보길 바란다.

 

오늘 사용할 annotation 관련은 

import javax.validation.constraints.*;

임포트를 따른다.

 

Anotation 제약조건
@Size(min=,max=) 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex=) 정규식을 만족하는가?
@Max(숫자) 지정 값 이하인가?
@Min(숫자) 지정 값 이상인가
@Future 현재 보다 미래인가?
@Past 현재 보다 과거인가?
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer=, fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=)  지정된 값(실수) 이하인가?
@DecimalMin(value=) 지정된 값(실수) 이상인가?
@AssertFalse false 인가?
@AssertTrue true 인가?

 

해당 어노테이션을 적절하게 dto 로 선언을 해주고 사용되는 컨트롤러 쪽에서 @Valid annotation을 사용해주면 된다.

public ResponseEntity saveMember(@Valid Member member, BindingResult bindingResult) {
     if (bindingResult.hasErrors()) {
          return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(bindingResult.getAllErrors());
     }
}

여기서 참고로 BindingResullt 대신에 Error를 사용해도 되는데 둘의 차이는

BindingResult는 인터페이스고, Errors 인터페이스를 상속받고 있다.
실제 넘어오는 구현체는 BeanPropertyBindingResult 인데 BindingResult대신 Errors를 사용해도 된다.

Errors 인터페이스는 단순한 오류 저장과 조회 기능을 제공한다.
BindingResult는 여기에 더해서 추가적인 기능들을 제공한다. (ex. addError())

 

만약 Dto 안에 또다른 Dto를 선언해둔 경우라면 해당 Dto 변수 앞에 @Valid를 넣어주면 된다.


참고 포스팅

https://thenicesj.tistory.com/303

 

jackson annotation 관련

자바에서 , 특히 dto 에서 많이 사용하는 jackson 관련 annotation을 소개하려고 한다. dto 에 대한 정의는 아래 참고 포스팅을 확인해보는것을 추천한다. @JsonProperty 는 json을 받는 쪽에서 이름을 지정하

thenicesj.tistory.com

https://thenicesj.tistory.com/253

 

null 관련 (Null, isEmpty(), null관련 annotation)

먼저 자바에서 null과 isEmpty 의 차이를 알아보면 null 인스턴스가 생성되지 않은 상태, list변수가 메모리에 아무런 주소값도 참조하지 않은 상태이다. list에 값이 없을 경우 null로 체크를 하면 안된

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

스프링 웹플럭스(webflux)  (43) 2022.08.24
Optional 이란?  (51) 2022.08.23
querydsl 동적 쿼리 관련  (60) 2022.08.21
jackson annotation 관련  (41) 2022.08.20
Entity, DTO, VO 차이  (47) 2022.08.18

댓글