본 글은 Spring boot의 @Valid 어노테이션에 대해서 공부한 지식을 정리한 글입니다.
애플리케이션 개발에서 데이터의 유효성을 검증하는 것은 필수적입니다.
사용자로부터 입력받은 데이터가 올바르고 기대한 형식에 맞는지 확인하는 과정은 오류를 방지하고, 애플리케이션의 신뢰성을 높이는 데 중요한 역할을 합니다.
Java에서는 Bean Validation API를 통해 이 과정을 효율적으로 처리할 수 있으며, 그 핵심적인 도구 중 하나가 바로 @Valid 어노테이션입니다.
@Valid 어노테이션이란❓
@Valid 어노테이션은 Java의 Bean Validation API에서 제공되는 어노테이션으로, 객체의 유효성을 검사하는 데 사용됩니다. 이 @Valid어노테이션은 주로 Spring Framework과 함께 사용되며, 객체의 필드에 대한 제약 조건을 적용하고 검증할 수 있게 해 줍니다.
주요 용도 및 기능
객체 검증
- @Valid 어노테이션을 사용하면 객체의 필드에 정의된 제약 조건을 검사할 수 있습니다.
- 예를 들어, 특정 필드가 비어있지 않아야 한다거나, 특정 형식을 만족해야 한다는 조건을 설정할 수 있습니다
유효성 검사 그룹화
- Bean Validation API에서는 검증 그룹을 정의하여 특정 상황에 맞는 검증을 수행할 수 있습니다. @Valid를 사용하여 이러한 그룹을 적용할 수 있습니다.
체크 제약 조건
- @Valid는 객체의 필드에 적용된 제약 조건을 기반으로 객체를 검증합니다.
- 예를 들어, @NotNull, @Size, @Email 등의 제약 조건을 사용할 수 있습니다.
Controller
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/submit")
public @ResponseBody String submitForm(@Valid @RequestBody MyForm form) {
// form 객체가 유효성 검사를 통과한 후 이 메서드가 실행됩니다.
return "Form is valid!";
}
}
Entity 클래스 정의
@Valid가 제대로 작동하려면, 검증을 위한 제약 조건을 객체의 필드에 설정해야 합니다. 예를 들어, MyForm 클래스는 다음과 같이 정의할 수 있습니다
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class MyForm {
@NotNull(message = "Name cannot be null")
@Size(min = 1, max = 100, message = "Name must be between 1 and 100 characters")
private String name;
// Getter and Setter methods
}
위 예제에서 @NotNull과 @Size 제약 조건은 name 필드가 null이 아니고, 길이가 1에서 100자 사이여야 한다는 것을 보장합니다.
@Column과 @Valid의 결합 사용
프로젝트 진행 중, 사용자가 회원 가입 요청을 보낼 때 user_id 값이 없어도 DB에 유저가 저장되는 현상이 발생했습니다.
앞서 알아본 대로 해결방법은 @Vaild 어노테이션을 사용하는 방법이 있습니다.
1. @Valid 사용
- @Valid 어노테이션을 메서드 파라미터에 추가하면, Spring이 해당 파라미터로 전달된 객체(SignUpDto)에 대해 유효성 검사를 수행합니다.
- 주로 @RequestBody와 함께 사용되어 요청 본문으로 전달된 객체의 유효성을 검사합니다.
2. 검증 세부 사항 정의
- 객체의 필드에 대한 검증 규칙은 객체 자체의 필드에 어노테이션을 사용하여 정의합니다.
- 문제점이었던
user_id 값이 없어도 DB에 유저가 저장되는 현상을 해결하기 위해 @NotNull 어노테이션을 사용했습니다.
그런데 구글링을 하다가 궁금한 점이 생겨서 튜터님한테 질문을 했습니다.
Q. Entity 클래스에서 @Column 어노테이션으로 데이터 베이스 스키마 제약 조건이 있는 것으로 아는데, @Column(nullable= false) 옵션을 지정하면 @Vaild 어노테이션은 필요 없는 것이 아닌가요?
A. 물론 API에 대해서는@Column(nullable) 옵션을 주지 않아도 틀린 것은 아니다. 그러나 두 어노테이션(@Vaild, @Column)을 같이 쓰는 것이 좋다.
@Column(nullable = false)과 @Valid 어노테이션은 각각 데이터베이스 레벨과 애플리케이션 레벨에서 유효성을 검증하지만, 이 두 가지는 서로 다른 역할을 하며 함께 사용될 때 가장 효과적입니다.
데이터베이스 스키마 제약 조건을 설정하는 것만으로는 충분하지 않은 경우가 많기 때문에, @Valid와 함께 사용하는 것이 여전히 중요합니다.
자세한 이유는 다음과 같습니다.
1. 데이터베이스 레벨 검증(@Column(nullable = false)
- 역할
- 데이터베이스에서 칼럼의 값이
null이 아니어야 한다는 제약 조건을 설정합니다. - 데이터베이스 스키마에 설정된 nullable = false는 데이터가 데이터베이스에 저장될 때 null 값을 방지합니다.
- 데이터베이스에서 칼럼의 값이
- 제한
- 이 제약 조건은 데이터베이스에서만 작동하며, 데이터가 애플리케이션 레벨에서 데이터베이스에 저장되기 전까지의
유효성 검증을 포함하지 않습니다. - 즉, 애플리케이션 로직에서 user_id가 비어 있는 데이터를 데이터베이스에 보내기 전에 적절한 검증이 필요합니다.
- 이 제약 조건은 데이터베이스에서만 작동하며, 데이터가 애플리케이션 레벨에서 데이터베이스에 저장되기 전까지의
2. 애플리케이션 레벨 검증(@Valid)
- 역할
- @Valid는 애플리케이션 레벨에서 객체의 필드가 특정 제약 조건을 만족하는지 검사합니다.
- 이는 사용자 입력 데이터가 애플리케이션의 비즈니스 규칙에 맞는지 확인합니다.
- 장점
- 사용자에게 즉시 피드백을 제공하고, 데이터가 데이터베이스에 저장되기 전에 검증을 수행함으로써, 잘못된 데이터를 데이터베이스에 저장하는 것을 방지할 수 있습니다.
- 애플리케이션 레벨에서의 검증은 사용자 입력을 유효성 검증하는 데 도움을 주며, 잘못된 데이터를 사전에 걸러내는 데 유용합니다.
위와 같은 이유로 데이터베이스 스키마에 제약 조건(ex: @Column(nullable = false)을 추가하는 것만으로는 애플리케이션의 모든 유효성 검증 요구 사항을 충족할 수 없으므로, @Valid를 통한 애플리케이션 레벨 검증은 여전히 필요합니다.
따라서 최종 코드는 다음과 같이 형성되면 좋습니다.
위와 같이 코드를 구성하면 데이터베이스 레벨 검증과 애플리케이션 레벨 검증이 모두 충족됩니다
'Framework > Spring\Spring boot' 카테고리의 다른 글
[Spring boot] @Pattern 어노테이션: 정규 표현식으로 입력 검증 간편하게 하기 (0) | 2024.08.27 |
---|---|
[Spring boot] @PostConstruct : 빈의 안전한 초기화 콜백 (0) | 2024.08.25 |
[Spring boot] @Builder 어노테이션의 장점 (0) | 2024.08.09 |
[Spring Cloud] Zipkin을 이용한 분산 추적: 요청 흐름과 성능 모니터링 (0) | 2024.08.07 |
[Spring Cloud] Spring Cloud Sleuth(분산 추적)와 Zipkin이란 ❓ (0) | 2024.08.07 |