241120 TIL - 커스텀 예외로 @Valid 검증 메시지 출력하기

J_log·어제
0

@valid를 활용한 입력 데이터 검증

Spring Boot에서는 @Valid를 사용하여 입력 데이터를 검증할 수 있다. DTO 클래스에 유효성 검증 조건을 선언하면, 컨트롤러에서 요청 데이터를 자동으로 검증한다.

DTO

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class UserRequestDto {

    @Email(message = "이메일 형식이 올바르지 않습니다.")
    @NotBlank(message = "이메일은 필수 입력값입니다.")
    private String email;

    @Size(min = 8, message = "비밀번호는 최소 8자 이상이어야 합니다.")
    @NotBlank(message = "비밀번호는 필수 입력값입니다.")
    private String password;

    @NotBlank(message = "사용자 이름은 필수 입력값입니다.")
    private String username;
}

검증 실패 시 예외 처리

@Valid로 유효성 검사를 수행하면, 검증 실패 시 Spring이 MethodArgumentNotValidException을 발생시킨다. 하지만 별도의 처리를 해주지 않으면 IDE 콘솔에는 예외 메시지가 출력되지만, Postman을 이용해 테스트 할 때는 예외 메시지가 출력되지 않아 창을 이동해가며 어떤 예외가 발생했는지 확인해야하는 번거로움이 있다.

이 부분을 커스텀 예외처리로 해결해보았다.

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;

@RestControllerAdvice
public class ValidationExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException exception) {

        String errorMessage = exception.getBindingResult()
                .getFieldErrors()
                .stream()
                .findFirst()
                .map(fieldError -> fieldError.getField() + ": " + fieldError.getDefaultMessage())
                .orElse("Invalid input");

        CustomErrorResponseDto errorResponse = new CustomErrorResponseDto(HttpStatus.BAD_REQUEST, errorMessage);

        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
    }

커스텀 예외 응답 구성

검증 실패 시 반환할 JSON 응답을 커스텀 객체로 정의한다. 이를 통해 응답 형식을 표준화하고, 클라이언트가 처리하기 쉽게 구성할 수 있다.

package com.example.gametalk.exception;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public class CustomErrorResponseDto {
    private final HttpStatus httpStatus;
    private final String message;
}

결과 확인

  • 커스텀 예외 처리 전

"Validation failed for object='userRequestDto'. Errir count: 1" 이 출력되면서 하나의 예외가 발생했다고 알려주지만 이름, 이메일, 비밀번호 중 어디가 문제가 발생했는지 바로 알 수 없다.

이렇듯 IntelliJ 콘솔에서 확인해야 한다.

  • 커스텀 예외 처리 후

httpStatus와 어느 부분에서 예외가 발생했는지 직관적으로 전달할 수 있다.

0개의 댓글