1. Validator 클래스 사용
- 직접 Validator 클래스를 작성하여 유효성 검사
- 스프링에서 제공하는 표준 방법으로 유효성 검사를 수행할 수 있음
- Validator 인터페이스를 구현하여 재사용 가능한 유효성 검사 로직을 작성할 수 있음
- 단순한 유효성 검사에 적합함
1) Validator 클래스
- 객체의 유효성을 검사하기 위한 인터페이스
- 유효하지 않은 경우 예외를 발생시키거나 특정 동작을 수행하는 등의 작업을 수행함
- Spring Framework에서는 Validator 인터페이스를 사용하여 데이터 바인딩 전에 유효성을 검사할 때 사용
- 주로 폼 데이터나 API 요청 데이터의 유효성을 검사하는데 활용됨
2) 적용하기
Validator 클래스 작성
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.multipart.MultipartFile;
@Component // Spring bean 등록
public class FileValidator implements Validator { // Validator 인터페이스를 구현하는 FileValidator 클래스
@Override
public boolean supports(Class<?> clazz) {
return MultipartFile.class.isAssignableFrom(clazz); // MultiparFile 클래스를 지원하는 것을 설정
}
@Override
public void validate(Object target, Errors errors) {
MultipartFile file = (MultipartFile) target;
if (file.isEmpty()) {
errors.rejectValue("file", "file.empty", "File must not be empty");
}
// Add more validations as needed
}
}
컨트롤러에서 BindingResult를 이용하여 유효성 검사 수행
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file, BindingResult result) {
fileValidator.validate(file, result);
if (result.hasErrors()) {
// 유효성 검사에 실패한 경우 처리
return ResponseEntity.badRequest().body("File validation failed");
}
// 유효성 검사 통과 시 파일 업로드 로직 수행
// ...
return ResponseEntity.ok("File uploaded successfully");
}
2. 커스텀 어노테이션 사용
- Validator 클래스를 작성하는 것보다 좀 더 세분화된 유효성 검사를 적용하기에 유용함
- 어노테이션을 통해 코드에 메타데이터를 추가하므로 가독성이 좋음
- 어노테이션 사용으로 재사용이 간단함, 여러 필드나 메서드에 동일한 유효성 검사를 할 때 효과적
- 재사용이 많고 도메인 규칙에 부합하는 경우 커스텀 어노테이션을 사용해서 유효성 검사하는 것이 적합
커스텀 어노테이션 정의
import org.springframework.web.multipart.MultipartFile;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME) // 어노테이션 유지 정책 설정(런타임 시에 어노테이션 읽게 설정함)
@Constraint(validatedBy = FileConstraintValidator.class) // 어노테이션을 적용할 요소 지정
public @interface FileConstraint {
String message() default "Invalid file";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
유효성 검사를 수행할 클래스 작성
import org.springframework.web.multipart.MultipartFile;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class FileConstraintValidator implements ConstraintValidator<FileConstraint, MultipartFile> {
@Override
public void initialize(FileConstraint constraintAnnotation) {
}
@Override
public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {
if (file == null || file.isEmpty()) {
return false;
}
// Add more validations as needed
return true;
}
}
컨트롤러에서 유효성 검사
@PostMapping("/upload")
public ResponseEntity<String> handleFileUpload(@FileConstraint @RequestParam("file") MultipartFile file) {
// 유효성 검사 통과 시 파일 업로드 로직 수행
// ...
return ResponseEntity.ok("File uploaded successfully");
}
3. AOP(Aspect-Oriented Programming) 사용
- AOP를 이용하여 메서드 실행 전 로직을 만듦
- 관점 지향 프로그래밍으로 유효성 검사와 같은 공통 로직을 중앙에서 관리
- 여러 메서드에서 동일한 유효성 검사를 적용하기 용이함
AOP 어노테이션 정의
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FileValidation {
}
AOP Aspect 클래스 작성
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Aspect
@Component
public class FileValidationAspect {
@Before("@annotation(FileValidation) && args(file,..)")
public void validateFile(MultipartFile file) {
if (file == null || file.isEmpty()) {
throw new IllegalArgumentException("File must not be empty");
}
// Add more validations as needed
}
}
AOP 설정 추가
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
@Configuration
@EnableAspectJAutoProxy // AOP 활성화
public class AppConfig {
@Bean
public FileValidationAspect fileValidationAspect() {
return new FileValidationAspect();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
}