Skip to main content

Command Palette

Search for a command to run...

[Spring] @Valid와 @Validated

Updated
3 min read
[Spring] @Valid와 @Validated
S

Nice to meet u :) Im Backend Developer

✍️ 작성하게 된 이유

Spring 프로젝트를 개발하면서 사용자 입력을 검증(Validation) 하는 건 너무나도 중요한 작업입니다. 특히 DTO 객체의 필드에 @NotBlank, @Email 같은 어노테이션을 붙이면 아주 간단하게 유효성 검증이 가능하다는 점에서 @Valid, @Validated를 많이 사용하게 됩니다.

하지만 두 어노테이션의 차이를 잘 모르고 쓰면, 검증이 되지 않거나 예외가 예상과 다르게 발생할 수 있습니다.

이번 글에서는 @Valid@Validated의 개념, 차이점, 작동 방식까지 정리해보겠습니다.


📚 @Valid란?

JSR-303(자바 진영 표준) 기반의 객체의 제약 조건을 검증하도록 지시하는 Bean Validation 어노테이션

Bean Validation

  • 도메인 모델의 필드에 유효성 제약을 위한 어노테이션을 제공하는 API → 편리

  • 표준으로는 JSR 303, JSR 380 등이 존재하며, 이를 구현한 대표적인 구현체가 Hibernate Validator

Spring에서는 일종의 어댑터인 LocalValidatorFactoryBean가 제약 조건 검증을 처리한다. 이를 이용하려면 LocalValidatorFactoryBean을 빈으로 등록해야 하는데, SpringBoot에서는 validation 의존성만 추가해주면 해당 기능들이 자동 설정된다.

✅ 주요 특징

  • 데이터 무결성을 유지하는 데 필요한 유효성 검사 수행

  • javax.validation 패키지에 포함

  • @NotBlank, @Min, @Email 등과 함께 사용

  • 컨트롤러에서만 유효성 검사가 작동

  • 유효성 실패 시 MethodArgumentNotValidException 발생

  • DispatcherServlet에 기본으로 등록된 Exception Resolver인 DefaultHandlerExceptionResolver에 의해 400 에러가 발생

💡 동작 방식

  1. 요청이 들어오면 DispatcherServlet에서 요청에 맞는 컨트롤러에 요청을 전달

  2. 전달 과정에서 컨트롤러 메소드의 객체를 전달해주는 HandlerMethodArgumentResolver 작동

  3. HandlerMethodArgumentResolverresolveArgument 메소드에서@Valid로 시작하는 어노테이션이 붙어있으면 DispatcherServlet 단에서 검사를 진행하는 식으로 동작하며, 검증을 할 파라미터에 @Valid를 붙여줘야 유효성 검증이 진행

    • @RequestBody는 Json 메세지를 객체로 변환해주는 작업, ArgumentResolver의 구현체인RequestResponseBodyMethodProcessor가 처리

    • @ModelAttribute를 사용중이라면 ModelAttributeMethodProcessor가 처리

cf) ArgumentResolver : @RequestBody가 붙은 데이터를 Json 포멧으로 변경

🧩 @Validated란?

입력 파라미터의 유효성 검증은 컨트롤러에서 최대한 처리하고 넘겨주는 것이 좋다. 하지만 개발을 하다보면 불가피하게 다른 곳에서 파라미터를 검증해야 할 수 있다. Spring에서는 이를 위해 AOP 기반으로 메소드의 요청을 가로채서 유효성 검증을 진행한다.

✅ 주요 특징

  • 메소드 요청을 가로채서 유효성 검증을 해주는 Spring AOP 기반 기능

    → 스프링 빈이면 어디든 작동 가능 (Controller, Service, Repository 등)

  • 클래스 레벨에 @Validated, 유효성 검증을 할 파라미터에 @Valid 사용

  • 유효성 실패 시 ConstraintViolationException 발생

  • 그룹 검증(Validation Group) 지원

  • 만약, 특정 클래스를 지정하지 않는 경우 groups가 없는 속성들만 처리

💡 동작 방식

  1. Spring AOP의 유효성 검증을 위한 MethodValidationInterceptor가 클래스에 등록됨

    • MethodValidationInterceptor에 Validator이 의존성 주입으로 들어가므로 @Valid와 똑같이 Hibernate Validator를 사용 → Bean Validation을 그대로 이용할 수 있음
  2. 메서드 호출 시 AOP가 포인트컷으로 확인을 하고 요청을 중간에 가로채어 유효성 검사 진행

  3. 실패 시 ConstraintViolationException 예외 발생

🧠 Validation Group, Group Sequence란?

Group Validation

  • 필드마다 조건을 다르게 걸고 싶을 때 사용

  • 검증 규칙을 논리적인 그룹에 따라서 특정 상황에서만 적용

  • 예: 회원 가입 시 필수, 수정 시는 선택

Group Sequence

여러 검증 그룹을 순차적으로 검증하도록 하는 어노테이션

→ 순서대로 그룹 검증을 적용

위에서 살펴보았듯 @Validated의 기능으로 유효성 검증 그룹의 지정도 있지만 거의 사용되지 않으므로 유효성 검증 진행을 기준으로 차이를 살펴보도록 하자.

🆚 @Valid vs @Validated 차이 정리

항목@Valid@Validated
제공JSR-303(Java 표준)Spring 프레임워크
적용 대상Controller 계층Spring Bean 전역 (Controller, Service 등)
동작 방식ArgumentResolver 기반AOP 기반
검증 시점요청 바인딩 시메서드 호출 시
예외MethodArgumentNotValidExceptionConstraintViolationException
그룹 지원❌ 미지원✅ 지원 (@GroupSequence 등)

✅ 결론: 언제 어떻게 써야 할까?

상황사용 방식
Controller에서 요청 DTO 검증@Valid
Service 계층 등 Bean에서 검증@Validated + @Valid
그룹별 유효성 검사 필요@Validated(groups = ...) 사용

🔍 예외 정리

어노테이션예외설명
@ValidMethodArgumentNotValidException요청 파라미터 바인딩 시 검증 실패
@ValidatedConstraintViolationException메서드 실행 전 AOP로 검증 실패

참고 자료

https://mangkyu.tistory.com/174

https://velog.io/@hellojihyoung/Spring-Valid와-Validation

eckrin**[Spring] @Valid와 @Validated를 이용한 순차 검증**

More from this blog

[Spring] N+1문제 발생과 분석

✍️ 작성하게 된 이유 옷을 관리하는 서비스를 개발하면서 Cloth 엔티티와 그에 연관된 ClothWithAttributes, Attribute 데이터를 함께 조회하는 기능이 필요했다.그런데 연관 데이터를 조회할 때마다 쿼리가 폭발적으로 증가(N+1 문제) 하며, 성능이 급격히 저하되는 상황을 마주하게 되었다. Spring JPA의 대표적인 문제로 N+1임을 알고있었지만, 해결하는 방법은 Fetch Join밖에 몰랐다. 지연로딩되는 필드를 엔티...

Sep 17, 20256 min read
[Spring] N+1문제 발생과 분석

데이터베이스 기본 개념 정리

1️⃣ 데이터베이스(DB) & DBMS DB (Database): 일정한 규칙(스키마)에 따라 구조화되어 저장된 데이터의 집합. DBMS (Database Management System): DB를 제어/관리하는 시스템 소프트웨어. 특징: 실시간 접근 가능, 동시 공유 가능. 구조: 데이터베이스 → DBMS → 응용 프로그램 → 사용자 2️⃣ 엔티티(Entity) & 릴레이션(Relation) 엔티티: 여러 속성을 가진 "개체"...

Aug 5, 20252 min read
데이터베이스 기본 개념 정리

[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

✍️ 작성하게 된 이유 무신사, 29cm는 Jsoup으로 충분히 크롤링이 가능했기 때문에, ZigZag도 당연히 Jsoup으로 처리될 것이라 생각했다. 무신사, 29cm와 마찬가지로 필요한 데이터는 모두 <script> 태그 안에 들어있었다. 하지만… 예상은 보기 좋게 빗나갔다. 🧪 현상 ✅ 로컬 크롤링 → 정상 작동 Jsoup으로 script 태그 내에서 대표 이미지와 상품명을 잘 추출 로컬 환경에서는 아무 문제 없이 작동 ❌ A...

Jul 30, 20253 min read
[Project] 날씨에 맞는 옷 추천 서비스 : 지그재그 크롤링 여정 기록 (1) ChromeDriver를 EC2에 설치하기

[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

✍️ 작성하게 된 이유 날씨에 따라 옷을 추천해주는 서비스를 만들면서, 사용자가 입력한 구매 링크에서 옷 정보( 대표이미지, 상품명 )를 불러오는 기능이 필요했다. 처음에 해당 페이지를 동적 페이지로 판단했고, 자연스럽게 Selenium을 도입했다. 하지만 이 결정이 과연 최선이었는지는 수많은 시행착오 끝에야 알 수 있었다. 🕸️ Selenium을 선택한 이유 동적 페이지는 Jsoup으로 크롤링이 어렵다는 인식으로 처음부터 Selenium을 ...

Jul 28, 20254 min read
[Project] 날씨에 맞는 옷 추천 프로젝트: Selenium은 정말 필요한 선택이었을까? - 크롤링 삽질 기록

Soyulia's Blog

49 posts