프로젝트

[Java / Spring] @Valid & @Validated

gitofjy 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