[Spring]@RequestBody 검증하기 @Valid @Validated @NotNull

yeonjoo913·2023년 6월 26일
0

Spring

목록 보기
5/19

API를 개발하다보면 데이터의 필수값 등을 검증해야할 경우가 있다.
이 글에서는 객체의 검증을 쉽게 하는 법을 공부해보고자한다.

의존성 gradle

implementation 'org.springframework.boot:spring-boot-starter-validation:2.3.0.RELEASE'

[제약조건 어노테이션 종류]

  • @NotNull : null 인지 검증
  • @NotEmpty : null이 아니고, ""아닌지 검증(" " 허용)
  • @NotBlank : null이 아니고, ""," " 모두 아닌지 검증
  • @AssertTrue : 해당 값이 true인지 검증
  • @Size : 해당 값이 주어진 값 사이에 해당하는지 검증
  • @Min,Max : 작지 않은지,크지않은지 검증
  • @Email : 이메일 형식에 해당하는지 검증

@Valid 와 @Validated

@Valid를 이용한 검증해보기

@Valid는 빈 검증기를 이용해 객체의 제약 조건을 검증하는 어노테이션이다.
객체의 필드에 달린 어노테이션으로 검증한다.

@Setter
@Getter
@AllArgsConstructor
@RequiredArgsConstructor
public class UserAuthReq {
    @NonNull
    private String userName;
    @NotNull
    private String password;
    @Valid
    private Token token;
}

@NotNull은 필드의 값이 null이 아님을 확인한다.

@ApiOperation(value = "로그인")
    @PostMapping(value = "/login")
    public ResponseEntity<CommonResponse<Object>> login(@RequestBody @Valid UserAuthReq userAuthReq) {
        return ResponseEntity.ok().body(new CommonResponse<>(securityService.login(userAuthReq),StatusCode.SUCCESS_SELECT));
    }

위와 같이 메소드에 @Valid를 붙이면 유효성 검증이된다.

동작원리

  • 모든 요청은 디스패처 서블릿을 통해 controller에 전달된다. 전달 될때 controller 메소드의 객체를 만들어주는 ArgumentResolver가 동작하는데 ,@Valid 역시 ArgumentResolver에 의해 처리된다.
  • Json을 변환하는 작업이 ArgumentResolver 구현체에서 처리되며, 이 내부에서 @Valid로 시작하는 어노테이션의 유효성 검사를 진행한다.

@Valid 특징

  • controller 에서만 동작하며 다른 계층에서는 검증되지 않는다.
  • 다른 계층에서 파라미터를 검증하기 위해서는 @Validated와 결합되어야한다.
  • MethodArgumentNotValidException

@Validated를 이용한 검증해보기

@Validated는 AOP 기반으로 메소드의 요청을 가로채서 유효성을 검증한다.
JSR 표준기술이아니며 spring프레임워크에서 제공하는 어노테이션이다.

@Service
@Slf4j
@RequiredArgsConstructor
@Validated
public class SecurityService {
	public AuthTokenVO login(@Vadid UserAuthReq userAuthReq) {
    	...
    }

}

위와 같이 클래스에 @Validated를 붙이고, 검증할 메소드에 @Valid를 붙이면 유효성 검증이 진행된다.

동작원리

  • AOP기반으로 메소드 요청을 인터셉터하여 처리한다.
  • @Validated를 클래스레벨에 선언하면 유효성 검증을 위해 AOP의 어드바이스 또는 인터셉터가 등록된다. 그리고 메소드가 호출될때 포인트 컷으로 요청을 가로채서 검증을 진행한다.

@Validated 특징

  • 위와 같은 이유로 스프링 빈이라면 유효성 검증이 가능하다.
  • ConstraintViolationException

참고 블로그
https://mangkyu.tistory.com/174

profile
주니어 백엔드 개발자. 까먹는다 기록하자!

0개의 댓글