backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • Bean Validation을 활용한 검증 및 에러 처리
  • Bean Validation 기술 개요
  • @Validated 어노테이션
  • 타입 검증 및 설정 관련
  • Groups를 활용한 등록/수정 검증 분리
  • @RequestBody와 @ModelAttribute의 검증 차이
  • 에러 처리 흐름
  • Validator 빈 등록 방식 비교
  • 예시 코드
  1. 스프링
  2. Spring Boot
  3. 12 Bean Validation(빈검증)

Bean Validation(빈검증) 보충자료

Bean Validation을 활용한 검증 및 에러 처리


Bean Validation 기술 개요

Hibernate Validator

  • Bean Validation(표준 사양)을 구현한 가장 널리 사용되는 기술입니다.

  • javax.validation 패키지를 기반으로 다양한 어노테이션(@NotBlank, @Min, @Max 등)을 제공합니다.

글로벌 Validator 빈 등록

  • Spring에서 LocalValidatorFactoryBean을 글로벌 Validator로 등록하여 사용합니다.

  • 이를 통해 Bean Validation을 모든 컨트롤러와 서비스에 적용할 수 있습니다.

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public Validator getValidator() {
        return new LocalValidatorFactoryBean();
    }
}

@Validated 어노테이션

  • @Validated는 Spring에서 Bean Validation을 활성화하기 위해 반드시 사용해야 합니다.

  • 적용 위치:

    • @Controller 메서드 파라미터

    • 서비스 계층 메서드

    • 기타 Bean Validation이 필요한 곳


타입 검증 및 설정 관련

  1. 타입 미스매치 처리

    • Bean Validation은 데이터 바인딩 및 타입 변환 자체를 처리하지 않습니다.

    • 타입 변환 오류는 Spring MVC에서 처리되며, 이를 사용자 정의 메시지로 출력할 수 있습니다.

    • 예시: typeMismatch.user.userId

  2. 메시지 코드 우선순위

    • 검증 메시지의 우선순위는 다음과 같습니다:

      1. NotBlank.user.userName (필드와 객체명 포함)

      2. NotBlank (일반 오류 코드)

  3. 메시지 처리 예시

    NotBlank.user.userName=User Name is required.
    NotBlank=This field is required.
    typeMismatch.user.userId=Invalid format for User ID.

Groups를 활용한 등록/수정 검증 분리

Groups 설정

  • 등록과 수정 시 검증 로직을 다르게 적용해야 하는 경우, Bean Validation의 groups를 사용할 수 있습니다.

Groups 예시

UserGroups.java

public class UserGroups {
    public interface Create {}
    public interface Update {}
}

User.java

import javax.validation.constraints.NotBlank;

public class User {
    
    @NotBlank(groups = UserGroups.Create.class, message = "User ID is required for creation.")
    private String userId;

    @NotBlank(groups = {UserGroups.Create.class, UserGroups.Update.class}, message = "User Name is required.")
    private String userName;

    // Other fields...
}

컨트롤러

@PostMapping("/create")
public String createUser(
    @Validated(UserGroups.Create.class) @RequestBody User user,
    BindingResult bindingResult
) {
    if (bindingResult.hasErrors()) {
        return "errorPage";
    }
    return "successPage";
}

@PutMapping("/update")
public String updateUser(
    @Validated(UserGroups.Update.class) @RequestBody User user,
    BindingResult bindingResult
) {
    if (bindingResult.hasErrors()) {
        return "errorPage";
    }
    return "successPage";
}

@RequestBody와 @ModelAttribute의 검증 차이

@ModelAttribute

  • 객체 단위로 바인딩되며, 특정 필드에서 타입 오류가 발생해도 나머지 필드는 정상적으로 처리됩니다.

  • 예: userId 타입 오류 발생 시, userName은 정상적으로 바인딩됩니다.

@RequestBody

  • 전체 객체 단위로 처리됩니다.

  • 메시지 컨버터(Message Converter)가 성공적으로 작동해야 Bean Validation이 수행됩니다.

  • 메시지 컨버터 단계에서 오류가 발생하면 Bean Validation은 적용되지 않습니다.


에러 처리 흐름

웹 애플리케이션의 에러 처리 구조

  1. 요청 흐름

    • WAS → 필터 → 서블릿 → 인터셉터 → 컨트롤러 → 예외 발생

  2. 컨트롤러에서 예외 발생 시 처리

    • 예외가 컨트롤러에서 발생하면 아래 흐름에 따라 처리됩니다:

      1. HandlerExceptionResolver: Spring MVC가 제공하는 기본 예외 처리기.

      2. @ExceptionHandler: 컨트롤러 또는 전역에서 커스텀 예외 처리 가능.

      3. Default Error Page: 서블릿 컨테이너에 의해 처리.


Validator 빈 등록 방식 비교

기존 Validator

Bean Validation (Hibernate Validator)

직접 검증 코드 작성

어노테이션 기반의 검증 제공

Errors.rejectValue 사용

@NotBlank, @Min, @Max 등 사용

로직이 복잡하고 반복적인 코드 필요

코드의 간결성과 유지보수 용이

커스텀 Validator 빈 등록 필요

글로벌 Validator (LocalValidatorFactoryBean) 기본 제공


예시 코드

Bean Validation 기반 검증

User.java

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

public class User {

    @NotBlank(message = "User ID cannot be blank.")
    @Size(min = 5, message = "User ID must be at least 5 characters long.")
    private String userId;

    @NotBlank(message = "User Name cannot be blank.")
    private String userName;

    // Other fields...
}

UserController.java

@PostMapping("/create")
public String createUser(
    @Validated @RequestBody User user,
    BindingResult bindingResult
) {
    if (bindingResult.hasErrors()) {
        return "errorPage";
    }
    return "successPage";
}
Previous12 Bean Validation(빈검증)Next13 예외처리

Last updated 4 months ago