티스토리 뷰

🍀 Spring Boot

@Valid - @Validated

James Wetzel 2025. 2. 19. 19:26
728x90
반응형

아래는 @Valid와 @Validated를 어떻게 구분해서 사용하는지에 대한 샘플 코드입니다.

  • @Valid는 JSR-380 표준 애너테이션으로, 주로 RequestBody나 ModelAttribute 등 Bean 객체의 필드 유효성 검증에 사용됩니다.
  • @Validated는 Spring에서 제공하는 애너테이션으로, 메서드 레벨(@PathVariable, @RequestParam 등) 유효성 검증과 함께 그룹 기능을 지원합니다.

    단, 메서드 매개변수에 직접 제약 조건을 사용하려면 컨트롤러 클래스에 @Validated를 추가해야 합니다.

UserDto.java

package com.example.demo.dto;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.Setter;

/**
 * 사용자 정보 DTO (Request Body로 전달)
 */
@Getter
@Setter
public class UserDto {
    @NotBlank(message = "Username is required")
    private String username;
    
    @Min(value = 18, message = "Age must be at least 18")
    private int age;
}

UserController.java

package com.example.demo.controller;

import com.example.demo.dto.UserDto;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;

/**
 * 사용자 관련 컨트롤러
 * 
 * 클래스에 @Validated를 선언하여, @PathVariable이나 @RequestParam 등
 * 단순 타입의 매개변수에 대한 유효성 검증을 활성화합니다.
 */
@RestController
@RequestMapping("/api/users")
@Validated
public class UserController {

    /**
     * Request Body에 전달된 UserDto 객체를 @Valid로 검증합니다.
     * 
     * @param userDto 사용자 정보 (JSON 형식)
     * @return 성공 메시지
     */
    @PostMapping
    public String createUser(@RequestBody @Valid UserDto userDto) {
        // userDto의 각 필드는 @NotBlank, @Min 등의 제약 조건에 의해 검증됩니다.
        return "User created: " + userDto.getUsername();
    }

    /**
     * URL Path Variable을 통해 전달된 id를 검증합니다.
     * 
     * @param id 사용자 ID (1 이상이어야 함)
     * @return 사용자 ID에 대한 메시지
     */
    @GetMapping("/{id}")
    public String getUserById(@PathVariable @NotNull(message = "ID is required") @Min(value = 1, message = "ID must be greater than 0") Long id) {
        // @Validated가 선언되어 있어, 단순 타입 매개변수의 제약 조건(@NotNull, @Min)이 활성화됩니다.
        return "User with ID: " + id;
    }
}

설명:

  1. @Valid
    • createUser 메서드에서 @RequestBody로 전달되는 UserDto 객체의 필드에 대해 @Valid가 작동합니다.
    • UserDto의 username, age 필드에 지정한 제약 조건이 Bean Validation 표준에 따라 검증됩니다.
  2. @Validated
    • 컨트롤러 클래스에 @Validated를 선언하면, 메서드 매개변수(여기서는 @PathVariable id)에 직접 붙인 제약 조건(@NotNull, @Min)이 동작합니다.
    • 이 방식은 단순 타입(예: Long, String 등)에 대한 유효성 검증에 필요하며, @Valid는 Bean 객체에만 적용되기 때문에 별도로 @Validated가 필요합니다.

이와 같이 @Valid와 @Validated를 상황에 맞게 사용하면, 클라이언트로부터 전달받은 데이터의 유효성을 효과적으로 검증할 수 있습니다.

728x90
반응형