-
[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