728x90
Spring Boot에서는 @Validation을 활용하여 DTO 검증, 메서드 파라미터 검증, 커스텀 검증기 작성 등을 통해 강력한 유효성 검사를 수행할 수 있습니다. 이번 포스팅에서는 다양한 예제와 함께 @Validation의 활용 방법을 정리해보겠습니다.
1. 기본적인 @Valid를 활용한 DTO 검증
1.1 UserDTO: 요청 데이터를 검증하는 DTO
package com.example.demo.dto;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;
@Data
public class UserDTO {
@NotBlank(message = "이름은 필수 입력 항목입니다.")
@Size(min = 2, max = 20, message = "이름은 2~20자 사이여야 합니다.")
private String name;
@Email(message = "유효한 이메일 주소를 입력하세요.")
@NotBlank(message = "이메일은 필수 입력 항목입니다.")
private String email;
@NotBlank(message = "전화번호는 필수 입력 항목입니다.")
@Pattern(regexp = "^(\\d{3}-\\d{3,4}-\\d{4})$", message = "전화번호는 XXX-XXXX-XXXX 형식이어야 합니다.")
private String phone;
}
1.2 UserController: 요청을 처리하는 컨트롤러
package com.example.demo.controller;
import com.example.demo.dto.UserDTO;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated // 개별 파라미터 유효성 검사를 활성화하기 위해 추가
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/create")
public ResponseEntity<String> createUser(@Valid @RequestBody UserDTO userDTO) {
return ResponseEntity.ok("User Created: " + userDTO.getName());
}
// 특정 메서드 파라미터 유효성 검사를 추가
@GetMapping("/{id}")
public ResponseEntity<String> getUserById(@PathVariable @Min(value = 1, message = "ID는 1 이상이어야 합니다.") Long id) {
return ResponseEntity.ok("User ID: " + id);
}
}
✅ @Validated를 클래스 레벨에 추가하여 DTO뿐만 아니라 개별 파라미터도 검증 가능
2. Enum 값 검증 (@ValidEnum 활용)
2.1 Enum 클래스 생성
package com.example.demo.enums;
public enum UserRole {
ADMIN, USER, GUEST
}
2.2 Enum 검증 어노테이션 생성
package com.example.demo.validation;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = EnumValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEnum {
Class<? extends Enum<?>> enumClass();
String message() default "유효하지 않은 값입니다.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2.3 EnumValidator 구현
package com.example.demo.validation;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.Arrays;
public class EnumValidator implements ConstraintValidator<ValidEnum, String> {
private Class<? extends Enum<?>> enumClass;
@Override
public void initialize(ValidEnum constraintAnnotation) {
this.enumClass = constraintAnnotation.enumClass();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) return false;
return Arrays.stream(enumClass.getEnumConstants())
.map(Enum::name)
.anyMatch(e -> e.equals(value));
}
}
3. JSP에서 메시지 처리 (Spring Form 태그 활용)
Spring Boot와 JSP를 함께 사용할 경우, 검증 오류 메시지를 JSP에서 출력할 수 있습니다.
3.1 컨트롤러에서 검증 결과 전달
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerUser(@Valid @ModelAttribute("user") UserDTO userDTO, BindingResult result) {
if (result.hasErrors()) {
return "register";
}
return "success";
}
3.2 JSP에서 에러 메시지 표시 (Spring Form 태그 사용)
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<form:form modelAttribute="user" action="register" method="post">
이름: <form:input path="name" />
<form:errors path="name" cssClass="error" />
<br/>
이메일: <form:input path="email" />
<form:errors path="email" cssClass="error" />
<br/>
전화번호: <form:input path="phone" />
<form:errors path="phone" cssClass="error" />
<br/>
<input type="submit" value="등록" />
</form:form>
✅ spring-form 태그를 사용하여 검증 오류 메시지를 간편하게 처리 가능
✅ form:errors를 활용하여 필드별 검증 오류 출력
🎯 결론
1️⃣ @Valid, @Validated를 활용하여 DTO 및 개별 파라미터 검증
2️⃣ @Constraint를 활용한 커스텀 Validator 작성
3️⃣ @RestControllerAdvice를 활용한 전역 예외 처리
4️⃣ @ValidEnum을 활용한 Enum 값 검증
5️⃣ 비밀번호 확인 Multi-Field 검증 추가
6️⃣ JSP에서 Spring Form 태그를 활용한 검증 메시지 처리 방법 추가
728x90
'개발 > Spring' 카테고리의 다른 글
| Spring에서 @Data 어노테이션 (0) | 2025.02.05 |
|---|---|
| Spring 및 Spring Boot에서 CSP 적용 방법 (0) | 2025.02.04 |
| Spring 프레임워크에서 Repository 주입 방법 (@Autowired, @Resource, @Inject) (0) | 2025.02.01 |
| Spring AOP(Aspect-Oriented Programming) 가이드 (0) | 2025.01.29 |
| Spring Security에서 @EnableMethodSecurity 및 권한 관련 어노테이션 정리 (0) | 2025.01.29 |