@vaild 애노테이션 파헤치기(작성중)

신창호·2022년 6월 24일
0
post-thumbnail
post-custom-banner

Spring에서 메소드 레벨 유효성 검증을 위해
JSR-303의 @Valid 애노테이션을 사용한다.
또한 유효성 검사를 위해 멤버 속성을 표시하는 데에도 사용한다.

@Valid 특징

  • import javax.validation.Valid;로 불러와야 사용할 수 있는 애노테이션이다.
    - javax 패키지는 java 표준라이브러리의 확장 패키지란 뜻으로, 공식적으로 지원하는 라이브러리라는 것이다.
  • 사용하기 위해서는 build.gradle파일 -> dependencies 항목 -> org.springframework.boot:spring-boot-starter-validation이 추가되어 있어 야 한다.
  • 잘못된 형식을 입력값을 확인하기위한 기능으로, 보편적으로 많이 쓰이는 유효성검사를 애노테이션으로 만들어, 아래와 같은 기능으로 나눠져있다.
  • 보통 DTO 클래스에 많이 적용되며, DTO클래스가 @Valid기능을 사용할 수 있게 만들어 주는 Annotation이다.

@Valid 종류

Annotaion제약조건
@NotNullNull 불가
@NullNull만 입력 가능
@NotEmptyNull, 빈 문자열 불가
@NotBlankNull, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min=,max=)문자열, 배열등의 크기가 만족하는가?
@Pattern(regexp =)정규식을 만족하는가?
@Max(숫자)지정 값 이하인가?
@Min(숫자)지정 값 이상인가
@Future현재 보다 미래인가?
@Past현재 보다 과거인가?
@Positive양수만 가능
@PositiveOrZero양수와 0만 가능
@Negative음수만 가능
@NegativeOrZero음수와 0만 가능
@Email이메일 형식만 가능
@Digits(integer=, fraction = )대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=)지정된 값(실수) 이하인가?
@DecimalMin(value=)지정된 값(실수) 이상인가?
@AssertFalsefalse 인가?
@AssertTruetrue 인가?

사용방법

  • 컨트롤러에서 GET, POST, PATCH, PUT,PATCH 등 HTTP 메소드로 받을 값중에,
    POST, PATCH, PUT은 http요청값에 Body를 받는다.

  • 여기서 Body는 보통 JSON값으로 들어오는데, 변수가 1~2개일 경우에는 @RequestParam으로 받아도되지만, 몇십개, 몇백개가 되어 버릴 수 있어서, 별도의 Class타입으로 처리를 한다.
    - 이것을 DTO파일이라고 하는데, @RequsetBoby을 앞에붙여 주면된다.

        public ResponseEntity postCoffee(@Valid @RequestBody CoffeePostDto coffeePostDto){ ...
    • 여기서, 들어온 값이 제대로된 값인지도 같이 파악해야하는데, @Valid애노테이션으로 같이 써주면된다.
    • 그럼 위에 봤던 @Valid 종류중에 적합한 것을 붙여주면된다.
    public class CoffeePostDto {
    
       @NotBlank
       @Pattern(regexp = "^[a-zA-Z]+\\s?[a-zA-Z]+$")
       private String engName;
    
       @NotBlank
       private String korName;
    
       @NotPrice
       private int price;
       ...

    추가적인 팁

  • @NotNull의 경우 해당 값의 타입이 객체든, Enum이든 타입에 상관없이 적용 가능하지만, @NotBlank의 경우 객체와 Eum같이 별도의 특정값을 넣어야되는 상황에는 적용이 안된다.

    • 결국 @NotBlank는 문자열 타입에만 추천!

@validated?

profile
한단계씩 올라가는 개발자
post-custom-banner

0개의 댓글