[공부정리] Custom Constraint로 MultipartFile 검사하기

jeyong·2024년 3월 9일
0

공부 / 생각 정리  

목록 보기
39/120
post-custom-banner


이번 글에서는 스프링에서 MultipartFile 객체를 필드에서 검증하는 방법에 대해 설명할 것이다.

1. Custom Constraint

기본적으로 스프링의 Validation는 다양한 어노테이션을 제공하여 입력값을 검증하지만, MultipartFile 객체에 대한 검증 어노테이션은 제공하지 않는다. 따라서 MultipartFile을 검증하기 위해서는 사용자 정의 제약 조건(Custom Constraint)을 생성해야 한다. 이러한 Custom Constraint는 Validation의 ConstraintValidator 인터페이스를 구현하여 만들 수 있다. 자세한 설명은 아래 게시글을 참고하는 것을 추천한다.

[Spring Boot] ConstraintValidator를 이용해 나만의 validator annotation 만들기

2. MultipartFile 검증 방법

스프링의 Validation API를 사용하여 MultipartFile 객체를 검증하기 위한 Custom Constraint를 만드는 방법을 소스코드와 함께 설명하겠다. 이 과정에서는 단일 파일뿐만 아니라 파일 리스트에 대한 검증도 다룰 것이다.

1-1. MultipartFile 검증

@Documented
@Constraint(validatedBy = ImageFileValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidImageFile {
    String message() default "Invalid image";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class ImageFileValidator implements ConstraintValidator<ValidImageFile, MultipartFile> {

    @Override
    public boolean isValid(MultipartFile value, ConstraintValidatorContext context) {
        if (value == null) return false;
        boolean isImage = Arrays.asList("image/jpg", "image/jpeg", "image/gif", "image/bmp", "image/png").contains(value.getContentType());
        boolean isSizeAcceptable = value.getSize() <= 1024 * 1024 * 10;
        return isImage && isSizeAcceptable;
    }
}

ValidImageFile

  • @Documented: 어노테이션이 문서에 포함되어야 함을 지정한다.
  • @Constraint(validatedBy = ImageFileValidator.class): 어노테이션의 검증 로직이 ImageFileValidator 클래스에 의해 수행됨을 나타낸다.
  • @Target({ElementType.FIELD}): 어노테이션을 필드 레벨에서 사용할 수 있음을 나타낸다.
  • @Retention(RetentionPolicy.RUNTIME): 어노테이션이 런타임에 적용되고 유지되어야함을 나타낸다.
  • String message() default "Invalid image": 검증 실패 시 출력될 기본 메시지 설정이다.
  • Class<?>[] groups() default {}, Class<? extends Payload>[] payload() default {}: 검증 그룹과 페이로드 정보를 위한 속성이다. 복잡한 검증 상황에서 유용하게 사용된다고 한다.

ImageFileValidator

  • ValidImageFile 어노테이션에 대한 검증 로직을 구현한 클래스이다.
  • isValid: 파일 타입이 이미지(jpg, jpeg, gif, bmp, png)이며, 파일 크기가 10MB 이하인지를 확인한다.

1-2. List< MultipartFile > 검증

@Documented
@Constraint(validatedBy = ImageFileListValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidImageFileList {
    String message() default "Invalid image files";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

public class ImageFileListValidator implements ConstraintValidator<ValidImageFileList, List<MultipartFile>> {

    @Override
    public boolean isValid(List<MultipartFile> values, ConstraintValidatorContext context) {
        if (values == null) return false;

        for (MultipartFile value : values) {
            if (value == null || !isValidFile(value)) {
                return false;
            }
        }
        return true;
    }

    private boolean isValidFile(MultipartFile value) {
        boolean isImage = Arrays.asList("image/jpg", "image/jpeg", "image/gif", "image/bmp", "image/png").contains(value.getContentType());
        boolean isSizeAcceptable = value.getSize() <= 1024 * 1024 * 10;
        return isImage && isSizeAcceptable;
    }
}

ValidImageFileList

  • 필드 레벨에서 MultipartFile 객체 리스트의 유효성 검증을 수행한다.
  • @Constraint(validatedBy = ImageFileListValidator.class): 어노테이션의 검증 로직이 ImageFileListValidator 클래스에 의해 수행됨을 나타낸다.

ImageFileListValidator

  • ValidImageFileList 어노테이션에 대한 검증 로직을 구현한 클래스이다.
  • isValid: 리스트 내의 각 MultipartFile 객체가 유효한 이미지 타입과 적절한 파일 크기를 가지고 있는지 검사한다.

해당 방법 말고 혹시, Validation에서 제공하는 MultipartFile 객체에 대한 검증 어노테이션이 있다면, 댓글로 공유해주신다면 감사하겠습니다.

profile
노를 젓다 보면 언젠가는 물이 들어오겠지.
post-custom-banner

0개의 댓글