@Validation에 대하여

2024. 11. 11. 03:46·Spring

@Validation 이란?

@Validation은 일반적으로 데이터 유효성 검사를 위해 사용되는 어노테이션들을 의미하며, Spring Boot 및 Java 애플리케이션에서 입력값의 유효성을 보장하기 위해 사용됩니다. javax.validation이나 jakarta.validation 패키지에서 제공하는 어노테이션과 함께 사용됩니다.

다음은 주요 유효성 검사 어노테이션들과 그 역할입니다:

  1. @NotNull: 필드가 null이 아닌지 확인합니다. null 값이 입력될 경우 유효성 검사를 통과하지 못합니다.
  2. @NotEmpty: 필드가 빈 문자열이 아닌지 확인합니다. null을 허용하지 않고, 최소한 하나 이상의 문자가 있어야 합니다.
  3. @NotBlank: 공백 문자열을 포함하여 null이나 빈 문자열이 아닌지 확인합니다. 일반적으로 문자열 필드에 사용됩니다.
  4. @Size: 문자열, 컬렉션, 배열, 맵 등의 크기를 제한할 때 사용합니다. 예를 들어, @Size(min=2, max=30)과 같이 최소 및 최대 크기를 설정할 수 있습니다.
  5. @Min / @Max: 숫자 값에 최소 및 최대 값을 지정할 때 사용합니다. 예를 들어, @Min(18)은 최소 값이 18인지 확인합니다.
  6. @Pattern: 정규 표현식으로 필드의 형식을 제한할 때 사용합니다. 예를 들어, @Pattern(regexp="\\d{3}-\\d{2}-\\d{4}")는 지정된 형식을 따르는 문자열만 허용합니다.
  7. @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
'Spring' 카테고리의 다른 글
  • 지연로딩,AOP,Mockito에 대하여
  • entity 연관관계
  • JPA와 영속성 컨텍스트, 그리고 Bean의 관계
  • 파일 디렉터리 구조 형성 방법들
통촏하여주시옵소서
통촏하여주시옵소서
솔방울님의 블로그 입니다.
  • 통촏하여주시옵소서
    솔방울의 IT
    GuestBook Guest
    GitHub GitHub
    Notion Notion
    글쓰기 관리
    • 분류 전체보기 (120)
      • Java (16)
      • Spring (13)
      • 자료구조 (3)
      • 보안 (6)
        • 네트워크보안 (2)
        • 백신 프로그램 (4)
      • 네트워크 (10)
        • 네트워크 관련지식 (7)
        • TCP IP (3)
      • Windows (9)
      • TIL (54)
        • TIL(Today I Learned) (19)
        • 코딩테스트 연습문제 (29)
        • 내일배움캠프 숙제 (6)
      • 프로젝트 (4)
        • 백신데스크톱 (1)
        • 스파르타코딩 (3)
      • 자격증 (5)
        • 사무자동화산업기사 (0)
        • 정보처리산업기사 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

    • 방명록을 적어주시면
  • 전체
    오늘
    어제
  • 06-20 14:35
  • 태그

    백신프로그램
    정보보안
    검은조직
    비밀집단
    스파르타코딩
    IT
    epp
  • 인기 글

  • whlsls3377.dev@gmail.com
통촏하여주시옵소서
@Validation에 대하여
상단으로

티스토리툴바