유효성 검사: @Valid / @Validated

Seunghee Lee·2024년 3월 20일

캡스톤

목록 보기
7/10

✓ @Valid

@Valid 는 주로 Request Body 를 검증하는 데 사용된다.

Controller 단에서 파라미터를 받을 때 @Valid 를 적용한 해당 파라미터의 값이 유효한 지 검증한다.

// Controller
@PostMapping()
public String signUp(@Valid @RequestBody final UserRequestDto request) { 
		...
}
// DTO
public record UserRequestDto (
		
		@Email
		String email,
		
		@NotBlank
		String password,
		
		@NotNull
		Address address
){
}

위와 같이 구현되었다고 가정할 때 아래와 같은 Request DTO 가 들어오면 Address 의 값이 null 이더라도 정상적인 요청으로 받아드린다.

{
		"email": "test@test.com",
		"password": "test",
		"address": {
				"city": "",
				"zipCode": null
		}
}

여기서 Nested DTO 를 검증하려면 Address 에 NotNull 대신 @Valid 을 붙이면 정상적으로 동작한다.
※ Nested DTO 는 DTO 안에 또 다른 DTO 를 말한다.

// DTO
public record UserRequestDto (
		
		@Email
		String email,
		
		@NotBlank
		String password,
		
		@Valid    // Valid 로 수정!!
		Address address
){
}

✓ @Validated

@Validated 는 주로 쿼리 스트링이나 쿼리 파라미터, request body 에서 사용된다.

쿼리 스트링이나 파라미터를 검증해야 할 경우가 있다고 가정해보자. 아래와 같이 Validated클래스 레벨에 선언 후 유효성 검사하는 어노테이션을 추가하는 형식이다. 만약 클래스 레벨에 @Validated 이 없다면, @Min 은 동작하지 않는다.

// Controller
@RestController
@RequestMapping("/api/users")
@Validated
public class UserController {
	
	@GetMapping("/{userId}")
	public String find(@PathVariable @Min(1) final Long id) {
			...
	}
}

만약 Controller 가 아닌 Service 단에서 검증을 한다고 가정해보자. 이때는 Service 단에 Validated 를 선언하고 파라미터에 Valid 를 적용하면 된다.

// Service
@Service
@Validated
@Transactional
public class UserService {
		
	@Transactional
	public void singUp(@Valid final UserRequestDto request) {
			...
	}
}

📍 @Valid 와 @Validated 유효성 검증 차이

클래스 레벨은 → @Validated / 메소드에는 → @Valid 을 사용한다.

  • @Valid
    • JSR-303 자바 표준 스펙
    • 특정 ArgumentResolver 를 통해 진행되어 컨트롤러 메소드의 유효성 검증만 가능
    • 유효성 검증 실패 시 MethodArgumentNotValidException 발생
  • @Validated
    • 스프링 프레임워크가 제공하는 기능
    • AOP 기반으로 스프링 빈의 유효성 검증을 위해 사용
    • 유효성 검증 실패 시 ConstraintViolationException 발생
profile
자라나라 개발개발 ~..₩

0개의 댓글