Dawn

[Spring] 제약조건 검증 오류, @Vaild jakarta.validation.UnexpectedTypeException 본문

Spring

[Spring] 제약조건 검증 오류, @Vaild jakarta.validation.UnexpectedTypeException

woosikwoosik 2025. 3. 3. 04:16
반응형

제약조건 검증 오류

jakarta.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'jakarta.validation.constraints.Size' validating type 'java.lang.Integer'. Check configuration for 'age'

@Size 제약 조건이 Integer 타입인 age 필드에 적용되었으나, @SizeInteger 타입을 지원하지 않는다.

//오류 발생지점

@Size(min = 19, max = 28, message = "나이는 19세 이상 28세 이하로 입력해주세요.")
        private int age;

진행 중인 프로젝트에서 회원의 나이 제한을 두는 지점에서 오류가 발생했다.

@Size는 문자열이나 컬렉션, 배열 등의 길이나 크기를 검증하는 데 사용된다.

하지만 여기서는 int로 정의된 필드에 적용을 했기 때문에 오류가  발생했다.

수정

@Min(value = 1, message = "나이는 19세 이상이어야 합니다.")
@Max(value = 100, message = "나이는 28세 이하여야 합니다.")
private int age;


import org.hibernate.validator.constraints.Range

@Range(min = 19, max = 28, message = "나이는 19세 이상 28세 이하로 입력해주세요.")
private int age;

위와 같이 @Min, @Max를 이용해 최소, 최대를 지정하는 방법과

hibernate validator에서 제공하는 @Range를 사용해 범위를 지정해서 해결할 수 있었다.

 

오류를 찾게된 계기, @Valid

처음 코드를 짜고 테스트할 때는 오류가 발생하지 않았었다.

@PostMapping("/signup")
public Response<UserRes.SignUpRes> signup(@Valid @RequestBody UserReq.SignUpReq signUpReq) {
    return Response.ok(userService.signup(signUpReq));
}

컨트롤러 메서드의 파라미터에 @Valid를 붙이면서 입력 값 검증이 엄격해지며 발생했다.

어노테이션을 사용하며 입력 데이터 유효성을 보장하고,

if (signUpReq.getAge() < 19 || signUpReq.getAge() > 28)

과 같은 방식으로 하드코딩할 필요도 없어졌다.

에러 역시 MethodArgumentNotValidException 로 던져주기 때문에 에러처리를 할 필요도 없어졌다.

찾아보니 SQL 인젝션이나 잘못된 데이터들을 막아내기에 서비스의 안정성 역시 좋아진다고 한다.

검증과정이 하나 더 생긴 것이기에 요청 처리 시간이 약간은 증가할 수 있다고 하지만 미미한 차이로 예상되고 내 상황처럼 입력 데이터가 중요한 POST, PATCH와 같은 요청에서 사용하면 도움을 받을 수 있을 것이다.

반응형