Validation 검증과 예외처리

coldrice99·2024년 10월 27일
0
post-thumbnail

데이터 검증은 Java 프로그래밍에서 매우 중요한 과정입니다. 특히 Spring에서는 다양한 애너테이션을 활용해 Bean Validation을 간편하게 적용할 수 있어 코드가 간결해지고 오류를 줄일 수 있습니다.

Validation이란?

Java는 null 값에 접근할 때 NullPointerException 오류가 발생하기 때문에, 이를 방지하기 위해 데이터 검증(Validation) 과정이 필요합니다. Spring에서는 Bean Validation을 제공하여 null 확인뿐 아니라 문자 길이 측정, 양수/음수 여부 등 다양한 검증을 쉽게 처리할 수 있습니다.

Bean Validation 애너테이션

Spring Boot에서는 다음과 같은 유용한 애너테이션들을 사용해 검증을 수행할 수 있습니다:

  • @NotNull: null 값을 허용하지 않음
  • @NotEmpty: null과 빈 문자열("")을 허용하지 않음
  • @NotBlank: null, 빈 문자열(""), 공백 문자열(" ")을 허용하지 않음
  • @Size: 문자열의 길이 제한
  • @Max: 최대값 설정
  • @Min: 최소값 설정
  • @Positive: 양수만 허용
  • @Negative: 음수만 허용
  • @Email: 이메일 형식 검증
  • @Pattern: 정규 표현식으로 검증

프로젝트 설정

먼저 build.gradle 파일에 다음과 같이 spring-boot-starter-validation을 추가하여 Bean Validation을 활성화합니다:

implementation 'org.springframework.boot:spring-boot-starter-validation'

Validation 적용 예시

ProductRequestDto

아래와 같이 ProductRequestDto 클래스에 Bean Validation을 적용할 수 있습니다.

package com.sparta.springauth.dto;

import jakarta.validation.constraints.*;
import lombok.Getter;

@Getter
public class ProductRequestDto {
    @NotBlank
    private String name;

    @Email
    private String email;

    @Positive(message = "양수만 가능합니다.")
    private int price;

    @Negative(message = "음수만 가능합니다.")
    private int discount;

    @Size(min = 2, max = 10)
    private String link;

    @Max(10)
    private int max;

    @Min(2)
    private int min;
}

@Valid로 Validation 실행

@Valid 애너테이션을 사용하여 컨트롤러에서 데이터 검증을 수행할 수 있습니다:

@PostMapping("/validation")
@ResponseBody
public ProductRequestDto testValid(@RequestBody @Valid ProductRequestDto requestDto) {
    return requestDto;
}

Validation 예외처리

회원가입 같은 경우, 데이터 검증 과정에서 예외가 발생하면 오류 메시지를 제공해야 합니다. 이를 위해 BindingResult를 활용하여 예외처리를 할 수 있습니다.

SignupRequestDto

회원가입 데이터를 담는 SignupRequestDto 클래스에 Bean Validation을 추가합니다.

package com.sparta.springauth.dto;

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

@Getter
@Setter
public class SignupRequestDto {
    @NotBlank
    private String username;

    @NotBlank
    private String password;

    @Email
    @NotBlank
    private String email;

    private boolean admin = false;
    private String adminToken = "";
}

UserController의 Validation 적용과 예외처리

컨트롤러에서 @ValidBindingResult를 사용하여 예외를 처리합니다. 예외 발생 시 오류 메시지를 출력하고, 로그인 페이지가 아닌 회원가입 페이지로 리다이렉트할 수 있습니다.

@PostMapping("/user/signup")
public String signup(@Valid SignupRequestDto requestDto, BindingResult bindingResult) {
    // Validation 예외처리
    List<FieldError> fieldErrors = bindingResult.getFieldErrors();
    if (fieldErrors.size() > 0) {
        for (FieldError fieldError : fieldErrors) {
            log.error(fieldError.getField() + " 필드 : " + fieldError.getDefaultMessage());
        }
        return "redirect:/api/user/signup";
    }
    userService.signup(requestDto);
    return "redirect:/api/user/login-page";
}

BindingResult와 FieldError 활용

  • BindingResult: @Valid 바로 다음 파라미터로 선언하면, 검증 과정에서 발생한 오류를 바인딩하여 접근할 수 있습니다.
  • FieldError: bindingResult.getFieldErrors()를 통해 발생한 오류 목록을 List<FieldError>로 가져올 수 있습니다. 각 필드의 오류 정보를 출력하거나 로깅하여 디버깅에 도움을 줍니다.

이처럼 Spring Boot에서는 Validation을 통해 입력 데이터를 쉽게 검증하고 예외 상황을 처리할 수 있습니다. 이 방법을 활용하면 코드의 가독성과 안전성이 크게 향상되며, 애플리케이션의 오류 발생을 줄이는 데에도 도움이 됩니다.

https://github.com/coldrice99/spring-auth.git

profile
서두르지 않으나 쉬지 않고

0개의 댓글