ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java / Spring] @Valid & @Validated
    프로젝트 2024. 9. 1. 18:02

    역삼에서 프로젝트를 마무리하면서 부장님께서 감사하게도 간단한 코드 리뷰를 해주셨다.

    그중 첫 번째 말씀하셨던 부분은 어노테이션 @valid 와 @validated

    서버 API를 구현하며 꼭 사용했던 어노테이션인데 두 개의 차이조차 인지하지 못하고 있었다는 점을 반성하며 정리해보려 한다.

     

     

    1. @valid & @validated

    비슷해 보이는 두 개의 어노테이션 차이점은 뭘까 ?

     

    @valid 

    - JSR 자바 표준 스펙

    - 컨트롤러 메서드의 유효성 검증

    - 유효성 검증 실패 시 MethodArgumentNotValidException  발생

     

    @validated

    - 스프링 프레임워크가 제공하는 기능

    - AOP 기반으로 스프링 빈의 유효성을 검증하기 위해 사용되며

      클래스에는 @validated, 메서드에는 @valid를 붙여 사용

    - 유효성 검증 실패시 ContraintViolationException 발생

     

     

    2. @valid

    @valid는 주로 requestbody 검증하는 데 사용한다.

    예를 들어 아래와 같은 ExInDto가 있고 @NotNull, @NotEmpty 등의 유효성 검사 어노테이션을 적용했다.

    @Data
    public class ExInDto {
    
        @NotNull
        @Schema(description = "ex1", example = "")
        private String ex1;
    
        @Schema(description = "ex2")
        private String ex2;
    
        @NotEmpty
        @Schema(description = "ex3")
        private String ex3;
    
        @Schema(description = "list ex4")
        private List<ListExInDto> listExIndto;
    
    }

     

     

    @RestController
    @RequestMapping("/api/ex")
    @Tag(name = "ex", description = "ex")
    @RequiredArgsConstructor
    public class ExController {
    
        /**
         * ex 서비스
         */
        private final ExService exService;
    
        @PostMapping("/retrieve-ex")
        @Operation(summary = "ex 조회", description = "ex 목록을 조회합니다.")
        public RetrieveExOutDto retrieveExList(@Valid @RequestBody ExInDto inDto) {
            return RetrieveExOutDto;
        }
    
    }

    Controller에서 파라미터 부분에 @Valid를 추가해야 정상적으로 작동한다.

     

     

    // @Schema(description = "list ex4")
    // private List<ListExInDto> listExIndto;
    
    @Validated
    @Schema(description = "list ex4")
    private List<ListExInDto> listExIndto;

    이 두 부분을 봤을 때 나를 포함한 주니어 개발자들이 많이 실수한 부분이 바로 @Validated를 놓친 것이었다.

    dto를 보면 마지막에 listDto가 포함되어 있는데 indto가 리스트로 들어올 때는 검증 어노테이션을 따로 줘야 하는 것이다.

     

     

    3. @validated 사용되는 경우 추가

    1. query string
    2. query parameter
    3. request body

    추가적으로 쿼리 파라미터를 검증하는 경우 @validated를 클래스 레벨에 선언 후 유효성 검증 어노테이션을 추가하면 된다.

    또한 해당 프로젝트에서 사용한 적은 없지만, Service에서도 @validated 선언 후 파라미터에 @valid를 적용해 사용할 수 있다.

     

     

    cf. 프로젝트 진행하며 자주 보였던 제약조건 어노테이션 (JSR 표준 스펙)

    • @NotNull: 해당 값이 null이 아닌지 검증
    • @NotEmpty: 해당 값이 null이 아니고, 빈 스트링("") 아닌지 검증(" "은 허용됨)
    • @NotBlank: 해당 값이 null이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증
    • @AssertTrue: 해당 값이 true인지 검증
    • @Size: 해당 값이 주어진 값 사이에 해당하는지 검증(String, Collection, Map, Array에도 적용 가능)
    • @Max: 해당 값이 주어진 값보다 크지 않은지 검증
    • @Pattern: 해당 값이 주어진 패턴과 일치하는지 검증

     

     

     

     


    https://mangkyu.tistory.com/174

     

    728x90

    '프로젝트' 카테고리의 다른 글

    [Spring] 저장 @Transactional 선언적트랜잭션  (0) 2024.09.01
    [Mybatis] 동적쿼리 foreach문 Null 체크  (0) 2024.09.01
    [스프링부트/intellij/maven] JPA Querydsl 추가  (0) 2024.02.14
    CORS란 ?  (0) 2023.05.05
    schema란?  (0) 2023.05.04
Designed by Tistory.