Validation Library
Spring Validation은 Spring 프레임워크(Spring Framework)에서 제공하는 기능으로, 클라이언트가 입력한 데이터가 정해진 조건을 만족하는지 확인하고, 애플리케이션의 비즈니스 로직이 잘못된 데이터로 인해 문제가 발생하지 않도록 보장합니다.
Spring Validation은 Java Bean Validation 표준을 기반으로 하며, Hibernate Validator라는 라이브러리(Library)를 사용하여 유효성 검증을 수행합니다.
데이터 유효성 검증
웹 애플리케이션은 사용자 입력 데이터를 처리하는 경우가 많습니다.
예를 들어, 회원가입 페이지에서 사용자가 이름, 이메일, 비밀번호를 입력한다고 할 때
- 이름은 빈 값일 수 없고
- 이메일은 올바른 형식이어야 하며
- 비밀번호는 최소 8자 이상이어야 합니다.
이러한 조건을 데이터 유효성 검증(Validation)이라고 합니다.
데이터 유효성 검증 특징
- 데이터 무결성 보장 : 잘못된 데이터를 방지하여 애플리케이션의 안정성을 높입니다.
- 보안 강화 : 악의적인 입력(예: SQL Injection, 스크립트 공격)을 차단합니다.
- 사용자 경험 개선 : 입력 오류를 사전에 알려 사용자 실수를 줄입니다.
사용법
Spring Validation은 주로 컨트롤러에서 요청 데이터를 받을 때 사용됩니다. 다음은 Spring Boot에서 Validation을 구현하는 과정입니다.
1. DTO 클래스에 유효성 검증 주석 추가
데이터 전송 객체(DTO)에 필요한 검증 조건을 정의합니다.
ex. 회원가입 요청 데이터 검증
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public class SignUpRequest {
@NotBlank(message = "이름은 필수 입력 항목입니다.")
private String name;
@Email(message = "올바른 이메일 형식을 입력하세요.")
@NotBlank(message = "이메일은 필수 입력 항목입니다.")
private String email;
@Size(min = 8, message = "비밀번호는 최소 8자 이상이어야 합니다.")
private String password;
// Getters and Setters
}
2. 컨트롤러에서 검증 처리
컨트롤러에서 @Valid를 사용하여 DTO의 유효성을 검사합니다.
ex. 컨트롤러 예제
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
@RestController
@RequestMapping("/api/signup")
public class SignUpController {
@PostMapping
public ResponseEntity<String> registerUser(@Valid @RequestBody SignUpRequest request) {
// 유효성 검증 통과 시 실행
return ResponseEntity.ok("회원가입 성공");
}
}
- @Valid : DTO 클래스에 정의된 유효성 검증 조건을 실행합니다.
- @RequestBody : 클라이언트에서 전송한 JSON 데이터를 Java 객체로 변환합니다.
3. 유효성 검증 실패 시 에러 처리
Spring은 유효성 검증에 실패하면 기본적으로 MethodArgumentNotValidException을 발생시킵니다.
이를 처리하기 위해 Global Exception Handler를 구현할 수 있습니다.
ex. 글로벌 예외 처리
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class ValidationExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getFieldErrors().forEach(error ->
errors.put(error.getField(), error.getDefaultMessage()));
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
- 글로벌 예외 처리 : 애플리케이션 전체에서 발생하는 유효성 검증 예외를 처리
- HttpStatus.BAD_REQUEST : 검증 실패 시 400 상태 코드 반환
- 에러 메시지 커스터마이징 : 각 필드별 에러 메시지를 생성
Validation 어노테이션
어노테이션 | 설명 | 예 |
@NotNull | 값이 null이 아니어야 함 | @NotNull |
@NotBlank | 값이 null이 아니고 공백이 아니어야 함 | @NotBlank |
@Size | 문자열 또는 컬렉션의 크기를 제한 | @Size(min=5, max=100) |
이메일 형식이어야 함 | ||
@Pattern | 정규식을 사용한 값 검증 | @Pattern(regexp="^[a-zA-Z]+$") |
@Min / @Max | 숫자의 최소/최대값 제한 | @Min(18) |
@Past / @Future | 과거 또는 미래 날짜여야 함 | @Past |
출처
OpenAI의 ChatGPT (https://openai.com)
'Java Framework > Spring' 카테고리의 다른 글
[Spring] 페이징 (Paiging) 주요 메서드 (0) | 2025.02.10 |
---|---|
[Spring] 바인딩 (Binding) (0) | 2025.02.09 |
[Spring] HTTP Method (0) | 2025.02.07 |
[Spring] @Autowired (1) | 2025.02.02 |
[Spring] @GetMapping (0) | 2025.01.31 |