@Validation 이란?
@Validation
은 일반적으로 데이터 유효성 검사를 위해 사용되는 어노테이션들을 의미하며, Spring Boot 및 Java 애플리케이션에서 입력값의 유효성을 보장하기 위해 사용됩니다. javax.validation
이나 jakarta.validation
패키지에서 제공하는 어노테이션과 함께 사용됩니다.
다음은 주요 유효성 검사 어노테이션들과 그 역할입니다:
- @NotNull: 필드가
null
이 아닌지 확인합니다.null
값이 입력될 경우 유효성 검사를 통과하지 못합니다. - @NotEmpty: 필드가 빈 문자열이 아닌지 확인합니다.
null
을 허용하지 않고, 최소한 하나 이상의 문자가 있어야 합니다. - @NotBlank: 공백 문자열을 포함하여
null
이나 빈 문자열이 아닌지 확인합니다. 일반적으로 문자열 필드에 사용됩니다. - @Size: 문자열, 컬렉션, 배열, 맵 등의 크기를 제한할 때 사용합니다. 예를 들어,
@Size(min=2, max=30)
과 같이 최소 및 최대 크기를 설정할 수 있습니다. - @Min / @Max: 숫자 값에 최소 및 최대 값을 지정할 때 사용합니다. 예를 들어,
@Min(18)
은 최소 값이 18인지 확인합니다. - @Pattern: 정규 표현식으로 필드의 형식을 제한할 때 사용합니다. 예를 들어,
@Pattern(regexp="\\d{3}-\\d{2}-\\d{4}")
는 지정된 형식을 따르는 문자열만 허용합니다. - @Email: 이메일 형식을 유효성 검사할 때 사용합니다. 일반적으로 이메일 주소 입력란에 사용됩니다.
유효성 검사는 주로 DTO 클래스에 어노테이션을 붙여서 사용합니다. 예를 들어, 다음과 같은 방식으로 유효성 검사를 추가할 수 있습니다:
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public class MemberDto {
@NotBlank(message = "이름은 필수 입력 항목입니다.")
private String name;
@Email(message = "올바른 이메일 형식이어야 합니다.")
private String email;
@Size(min = 8, max = 20, message = "비밀번호는 8자 이상 20자 이하이어야 합니다.")
private String password;
// getters and setters
}
이렇게 설정한 유효성 검사는 컨트롤러에서 해당 DTO가 요청으로 들어올 때 자동으로 실행되며, 유효성 검사 실패 시 오류 메시지가 반환됩니다.
@Validation
어노테이션을 통한 유효성 검사에서 예외가 발생할 때 이를 처리하는 것을 유효성 검사 예외 처리라고 합니다. Spring Boot에서는 유효성 검사가 실패하면 MethodArgumentNotValidException
이나 ConstraintViolationException
같은 예외가 발생합니다. 이러한 예외는 기본적으로 클라이언트에 적절한 오류 응답을 보내기 위해 예외 처리 핸들러에서 처리합니다.
예외 처리 방법
Spring Boot에서는 @ControllerAdvice
와 @ExceptionHandler
를 사용하여 예외를 처리할 수 있습니다. 예를 들어, @Valid
나 @Validated
어노테이션이 적용된 DTO의 유효성 검사가 실패하면 MethodArgumentNotValidException
예외가 발생하고, 이를 잡아 사용자에게 적절한 메시지를 반환할 수 있습니다.
다음은 유효성 검사 예외 처리를 위한 예제 코드입니다:
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.validation.FieldError;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
// 유효성 검사 실패 시 발생하는 예외 처리
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
// 모든 필드 에러에 대한 메시지를 맵에 저장
for (FieldError error : ex.getBindingResult().getFieldErrors()) {
errors.put(error.getField(), error.getDefaultMessage());
}
return errors;
}
// ConstraintViolationException 예외 처리
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Map<String, String> handleConstraintViolationException(ConstraintViolationException ex) {
Map<String, String> errors = new HashMap<>();
ex.getConstraintViolations().forEach(violation -> {
String propertyPath = violation.getPropertyPath().toString();
String message = violation.getMessage();
errors.put(propertyPath, message);
});
return errors;
}
}
설명
@RestControllerAdvice
: 이 어노테이션은 모든 컨트롤러에서 발생하는 예외를 전역적으로 처리할 수 있게 해 줍니다.@ExceptionHandler
: 특정 예외 타입을 처리하는 메서드를 지정합니다.MethodArgumentNotValidException
: DTO에 설정된 유효성 검사에서 실패했을 때 발생하는 예외입니다. 예외가 발생하면BindingResult
에서 필드와 메시지를 가져와 클라이언트에 전달할 수 있습니다.ConstraintViolationException
: 메서드의 인자 유효성 검사 실패 시 발생하는 예외로,@Validated
어노테이션과 함께 사용됩니다.
이와 같은 방식으로 예외를 처리하면, 유효성 검사 실패 시 클라이언트는 각 필드의 오류 메시지를 JSON 형식으로 받을 수 있습니다.
'Spring' 카테고리의 다른 글
지연로딩,AOP,Mockito에 대하여 (0) | 2024.11.11 |
---|---|
entity 연관관계 (0) | 2024.11.11 |
JPA와 영속성 컨텍스트, 그리고 Bean의 관계 (0) | 2024.11.10 |
파일 디렉터리 구조 형성 방법들 (0) | 2024.11.10 |
IoC와 DI: Java 개발에서 꼭 알아야 할 개념 (0) | 2024.11.10 |