Spring Boot에서 Bean Validation을 활용한 검증
Spring Boot로 개발할 때, 객체 필드 검증이 필요한 경우가 많습니다. 이때 사용하는 기술이 Bean Validation입니다. Bean Validation은 특정한 구현체가 아닌 **Bean Validation 2.0(JSR-380)**이라는 기술 표준으로, 검증을 위한 어노테이션과 여러 인터페이스의 모음입니다. 이 표준을 구현한 일반적인 구현체로는 Hibernate Validator가 많이 사용됩니다.
간단하게 예시를 보겠습니다.
위처럼 간단하게 어노테이션을 이용하여 검증을 할 수 있습니다.
Hibernate Validator를 사용하면 위의 Range처럼 더욱 다양한 기능을 활용할 수 있습니다.
다양한 어노테이션은
Hibernate Validator 6.2.5.Final - Jakarta Bean Validation Reference Implementation: Reference Guide
Validating data is a common task that occurs throughout all application layers, from the presentation to the persistence layer. Often the same validation logic is implemented in each layer which is time consuming and error-prone. To avoid duplication of th
docs.jboss.org
여기서 확인할 수 있습니다.
컨트롤러에서 @Validated 적용
Bean Validation을 통해 필드에 검증 어노테이션을 적용했다면, 컨트롤러에서 @Validated 어노테이션을 추가해 검증을 실행할 수 있습니다.
- 매핑되는 객체의 앞에 @Validated 어노테이션을 추가해줍니다.
- @Validated를 추가하면 요청이 들어올 때 객체의 필드가 검증됩니다.
- 검증에 실패하면 BindingResult에 오류가 담기고, 이를 이용해 다양한 처리를 할 수 있습니다.
*** 참고로 Restful 개발에서 JSON 데이터가 객체에 매핑 자체가 안되면 (Integer 타입에 String과 같은 타입 에러)
컨트롤러 실행 전에 HttpMessageConverter에서 에러를 발생시켜서 @Validated 또한 발생하지 않습니다.
Restful 개발에서의 검증 흐름
Restful API에서 JSON 데이터를 처리할 때, 만약 요청 데이터가 객체 필드의 타입에 맞지 않으면,
컨트롤러에 도달하기 전에 HttpMessageConverter에서 예외가 발생합니다.
이 경우 검증은 실행되지 않고, 400 Bad Request 오류가 발생합니다.
예를 들어, 아래 예시와 같이
price 필드가 Integer 타입인데 요청에서 String 값이 들어온다면, 컨트롤러 호출 전에 오류가 발생합니다.
하지만, 올바른 Integer 값(예: 10)이 들어왔으나 비즈니스 로직 상 최소값(예: 1000)을 충족하지 못한다면,
컨트롤러는 호출되지만 검증에서 실패하고 BindingResult에 오류가 담깁니다.
@ModelAttribute와 @RequestBody의 차이
- @RequestBody: JSON 데이터가 객체에 매핑되지 않으면 HttpMessageConverter에서 예외를 발생시켜 컨트롤러가 호출되지 않습니다.
- @ModelAttribute: 각 필드 단위로 검증이 이루어져, 일부 필드에서 오류가 발생해도 나머지 필드는 정상적으로 처리할 수 있습니다. 메시지 컨버터와 달리 객체 전체가 아닌 개별 필드로 검증이 적용됩니다.
참고 : 인프런, 김영한-스프링MVC 2편
'Spring(boot)' 카테고리의 다른 글
서블릿 필터 (Filter) (0) | 2024.09.09 |
---|---|
PatternMatchUtils(간단한 패턴 매치) (0) | 2024.09.09 |
Springboot-Gradle 프로젝트 build, out 폴더 (1) | 2024.02.06 |
Logging (SLF4J) 사용하기 (1) | 2024.02.02 |
스프링의 웹 스코프(Web Scope) 이해하기: Request Scope (0) | 2024.01.19 |