본문 바로가기

카테고리 없음

[Springboot] MultiartFile 유효성 검사 방법

 

 

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();
    }
}