본문으로 건너뛰기
Advertisement

6.1 Bean Validation 개요

소프트웨어 개발에서 데이터 유효성 검사(Validation) 는 시스템의 안정성과 보안을 유지하기 위한 필수적인 과정입니다. 클라이언트가 전달한 값이 비즈니스 로직에 들어가기 전에, 해당 값이 올바른 형식과 제약 조건을 만족하는지 확인해야 합니다.

검증을 컨트롤러 밖에서 해야 하는 이유

과거에는 컨트롤러나 서비스 계층 안에서 수많은 if 문을 사용하여 데이터를 검증했습니다.

@PostMapping("/users")
public ResponseEntity<?> createUser(@RequestBody UserDto userDto) {
if (userDto.getName() == null || userDto.getName().trim().isEmpty()) {
return ResponseEntity.badRequest().body("이름은 필수입니다.");
}
if (userDto.getAge() < 0) {
return ResponseEntity.badRequest().body("나이는 0보다 커야 합니다.");
}
// 비즈니스 로직 실행...
}

이런 방식은 몇 가지 심각한 문제를 야기합니다.

  1. 코드의 가독성 저하: 비즈니스 로직보다 검증 로직이 더 많은 자리를 차지하게 됩니다.
  2. 중복 발생: 동일한 데이터 객체(UserDto)를 여러 곳에서 사용할 때마다 동일한 검증 코드를 작성해야 합니다.
  3. 단일 책임 원칙(SRP) 위배: 컨트롤러의 주 역할은 요청의 처리와 응답의 반환인데, 검증까지 떠맡게 됩니다.

Bean Validation의 등장

이러한 문제를 해결하기 위해 Java 진영에서는 객체의 필드에 애너테이션을 달아 제약 조건을 명시하는 Bean Validation (JSR-380) 표준을 도입했습니다. 스프링 부트는 이 표준의 구현체인 Hibernate Validator를 기본적으로 채택하여 사용합니다.

public class UserDto {
@NotBlank(message = "이름은 필수입니다.")
private String name;

@Min(value = 0, message = "나이는 0보다 커야 합니다.")
private int age;
}

컨트롤러에서는 파라미터 앞에 @Valid 또는 @Validated 애너테이션만 붙여주면, 스프링 프레임워크가 DispatcherServlet에서 컨트롤러로 요청을 넘기기 전에 데이터 바인딩과 검증을 자동으로 수행합니다. 검증에 실패하면 즉시 사용자에게 에러 응답(400 Bad Request)을 내려줍니다. 덕분에 비즈니스 로직은 순수하게 핵심 역할에만 집중 할 수 있습니다.

Advertisement