데이터 검증은 Java 프로그래밍에서 매우 중요한 과정입니다. 특히 Spring에서는 다양한 애너테이션을 활용해 Bean Validation을 간편하게 적용할 수 있어 코드가 간결해지고 오류를 줄일 수 있습니다.
Java는 null
값에 접근할 때 NullPointerException
오류가 발생하기 때문에, 이를 방지하기 위해 데이터 검증(Validation) 과정이 필요합니다. Spring에서는 Bean Validation을 제공하여 null
확인뿐 아니라 문자 길이 측정, 양수/음수 여부 등 다양한 검증을 쉽게 처리할 수 있습니다.
Spring Boot에서는 다음과 같은 유용한 애너테이션들을 사용해 검증을 수행할 수 있습니다:
null
값을 허용하지 않음null
과 빈 문자열(""
)을 허용하지 않음null
, 빈 문자열(""
), 공백 문자열(" "
)을 허용하지 않음먼저 build.gradle
파일에 다음과 같이 spring-boot-starter-validation
을 추가하여 Bean Validation을 활성화합니다:
implementation 'org.springframework.boot:spring-boot-starter-validation'
아래와 같이 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
애너테이션을 사용하여 컨트롤러에서 데이터 검증을 수행할 수 있습니다:
@PostMapping("/validation")
@ResponseBody
public ProductRequestDto testValid(@RequestBody @Valid ProductRequestDto requestDto) {
return requestDto;
}
회원가입 같은 경우, 데이터 검증 과정에서 예외가 발생하면 오류 메시지를 제공해야 합니다. 이를 위해 BindingResult를 활용하여 예외처리를 할 수 있습니다.
회원가입 데이터를 담는 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 = "";
}
컨트롤러에서 @Valid
와 BindingResult를 사용하여 예외를 처리합니다. 예외 발생 시 오류 메시지를 출력하고, 로그인 페이지가 아닌 회원가입 페이지로 리다이렉트할 수 있습니다.
@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";
}
@Valid
바로 다음 파라미터로 선언하면, 검증 과정에서 발생한 오류를 바인딩하여 접근할 수 있습니다.bindingResult.getFieldErrors()
를 통해 발생한 오류 목록을 List<FieldError>
로 가져올 수 있습니다. 각 필드의 오류 정보를 출력하거나 로깅하여 디버깅에 도움을 줍니다.이처럼 Spring Boot에서는 Validation을 통해 입력 데이터를 쉽게 검증하고 예외 상황을 처리할 수 있습니다. 이 방법을 활용하면 코드의 가독성과 안전성이 크게 향상되며, 애플리케이션의 오류 발생을 줄이는 데에도 도움이 됩니다.