문제

코드 테스트 중 아래와 같은 에러가 발생했다.

Exception : class jakarta.validation.UnexpectedTypeException HV000030: No validator could be found for constraint 'jakarta.validation.constraints.NotBlank' validating type 'java.util.List<java.lang.String>'. Check configuration for 'categoryTypes'

 

에러 메세지를 보면 CategoryTypes와 Validation의 문제로 오류가 발생한 것 같았다.

당시 CategoryTypes의 유효성 검증을 하는 dto는 아래와 같이 작성되어 있었다.

@Getter
@Valid
@AllArgsConstructor
public class PostCreateRequestDto {
  @Size(min=1, max=1000, message = "게시글은 1000글자 이내여야 합니다.")
  @NotBlank(message = "게시글 내용은 필수값 입니다.")
  private final String content;

  private final List<String> imgUrls;

  @NotBlank(message = "카테고리는 필수값 입니다.")
  private final List<String> categoryTypes;

  @NotBlank(message = "공개범위는 필수값 입니다.")
  @ValidEnum(target = Visibility.class)
  private final String visibility;
}

 

 

원인

검색해보니 @NotBlank는 String 타입의 값이 하나만 들어왔을 때 적용 가능한 유효성 검증 어노테이션이었다.

따라서 이 오류는 하나의 값만 들어왔어야 할 필드에 리스트가 들어와서 데이터를 정상적으로 처리하지 못해 발생하는 문제였다.

이 문제를 해결하기 위해서는 @NotEmpty 또는 @Size(min = 1)을 사용해서 해당 값이 비어있지 않도록 검증해야 한다.

 

 

해결

@Getter
@Valid
@AllArgsConstructor
public class PostCreateRequestDto {
  @Size(min=1, max=1000, message = "게시글은 1000글자 이내여야 합니다.")
  @NotBlank(message = "게시글 내용은 필수값 입니다.")
  private final String content;

  private final List<String> imgUrls;

  @NotEmpty(message = "카테고리는 필수값 입니다.")
  private final List<String> categoryTypes;

  @NotBlank(message = "공개범위는 필수값 입니다.")
  @ValidEnum(target = Visibility.class)
  private final String visibility;
}

 

코드를 위와 같이 수정하면 프로그램이 제대로 동작하면서 게시글 생성 API가 데이터를 잘 저장하는 것을 볼 수 있었다.