Java Validation (JSR-303/JSR-380)
- Java Bean Validation 표준을 따름
- 객체의 필드에 대해 유효성 검사를 선언적으로 설정할 수 있음
- 주요 애노테이션(@NotNull, @Size, @Email 등)을 사용하여 필드의 제약 조건을 정의하고, 이를 Validator를 사용하여 실행할 수 있음
주요 특징
- 객체의 각 필드에 유효성 검사를 적용하는 애노테이션 기반의 방법
- @NotNull, @Size, @Min, @Max, @Email 등 다양한 기본 애노테이션 제공
- 커스텀 유효성 검사 가능
- Java SE 환경에서도 사용 가능하며, Spring과 같은 다른 프레임워크와 통합 가능
Java Validation 샘플 코드
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Email;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.util.Set;
public class User {
@NotNull(message = "Name cannot be null") // null 값이 될 수 없는 필드
private String name;
@Email(message = "Invalid email format") // 유효한 이메일 형식이어야 함
private String email;
@Size(min = 6, max = 20, message = "Password must be between 6 and 20 characters") // 길이가 6~20이어야 함
private String password;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static void main(String[] args) {
// User 객체 생성
User user = new User();
user.setName(null); // 유효하지 않은 값 설정
user.setEmail("invalid-email"); // 잘못된 이메일 형식
user.setPassword("12345"); // 비밀번호가 짧음
// ValidatorFactory 생성
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// 유효성 검사
Set<ConstraintViolation<User>> violations = validator.validate(user);
// 검증 결과 출력
for (ConstraintViolation<User> violation : violations) {
System.out.println(violation.getMessage());
}
}
}
Spring Validation
- Java Validation을 바탕으로 스프링 프레임워크에 통합된 방식으로 유효성 검사를 처리
- Spring에서는 @Valid 또는 @Validated 애노테이션을 사용하여 메서드 파라미터나 DTO의 유효성 검사를 쉽게 적용할 수 있음
- Spring은 유효성 검사 후, BindingResult를 사용하여 결과를 처리
주요 특징
- Spring에서 유효성 검사를 쉽게 적용할 수 있도록 @Valid와 @Validated 애노테이션을 제공
- BindingResult를 사용하여 유효성 검사 결과를 처리할 수 있음
- Spring MVC, REST API 등에서 폼 데이터 검증에 널리 사용됨
- Java Validation의 기능을 활용하여 Spring 환경에서 통합적으로 유효성 검사를 수행할 수 있음
Spring Validation 샘플 코드
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/user")
public ResponseEntity<String> createUser(@Validated @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
return ResponseEntity.badRequest().body("Validation failed: " + result.getAllErrors());
}
// 유효성 검사 통과 후 처리 로직
return ResponseEntity.ok("User created successfully");
}
}
Java Validation vs Spring Validation
특징 | Java Validation | Spring Validation |
주요 사용 대상 | 독립적인 Java SE 환경에서 객체 유효성 검사 | Spring Framework (Spring MVC, Spring Boot 등)에서 유효성 검사 |
유효성 검사 적용 위치 | 객체의 필드에 애노테이션을 통해 직접 적용 | 메서드 파라미터나 DTO 객체에 애노테이션을 통해 적용 |
애노테이션 | @NotNull, @Size, @Email, @Min, @Max 등 | @Valid, @Validated, Java Validation 애노테이션 그대로 사용 |
검사 결과 처리 | Validator를 사용하여 유효성 검사 후 오류 메시지 확인 | BindingResult를 사용하여 유효성 검사 후 오류 메시지 처리 |
지원하는 환경 | Java SE, Java EE, Spring 등 다양한 환경에서 사용 가능 | Spring 프레임워크에서 주로 사용 |
유효성 검사 흐름 | ValidatorFactory -> Validator -> 객체 유효성 검사 | @Validated 또는 @Valid 애노테이션을 통해 유효성 검사 BindingResult로 오류 처리 |
정리
- Java Validation: 객체 수준에서 선언적이고 표준화된 유효성 검사 방법을 제공하며, Java SE 환경에서도 사용할 수 있는 유연한 방법
- Spring Validation: Spring 환경에서의 유효성 검사에 특화되어 있으며, Spring의 특징인 애노테이션 기반 처리와 BindingResult를 통해 유효성 검사 결과를 쉽게 관리할 수 있음
- 둘의 차이점은 주로 적용되는 환경과 유효성 검사 후 결과 처리 방식에 있음. Spring 환경에서는 Spring Validation을 활용하면 더 직관적이고 간편하게 유효성 검사를 적용할 수 있음
'Backend > Spring' 카테고리의 다른 글
[Spring] JAR & WAR (0) | 2025.02.11 |
---|---|
[Spring Boot/Gradle] spring-dev-tools 추가 (0) | 2025.01.20 |
Spring Security Architecture / 스프링 시큐리티 구조 (1) | 2023.11.20 |
Spring Bean Life Cycle / 스프링 빈 생명주기 (0) | 2023.11.07 |
[Spring & Boot] Message 사용법 (0) | 2022.03.24 |
댓글