[SpringBoot] Spring validation 에러 메시지 안뜸

bada·2024년 8월 16일

Trouble Shooting

목록 보기
3/10

문제 발생

이벤트 신청 폼 페이지에서 Spring validation을 적용하여 유효성 검사를 실시할 수 있도록 기능 구현을 하는 실습 중에,
유효하지 않은 값을 입력 후 제출 버튼을 누르면 설정한 에러 메시지가 뜨지 않는 현상을 마주했다.

500에러가 뜨는 걸 보니 서버 상의 문제였다.


문제 원인1

아래 코드는 유저정보 폼에서 유효 값을 체크하기 위해 작성한 validator 클래스다.

@Component
public class UserInfoValidator implements Validator {
    @Override
    public boolean supports(Class<?> clazz) {
        return UserInfoForm.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {

        UserInfoForm userInfo = (UserInfoForm) target;

        // 지시사항을 참고하여 코드를 작성해 보세요.
        if(!StringUtils.hasText(userInfo.getName())) {
            errors.rejectValue("name","required");
        }

        if(userInfo.getAge() == null || userInfo.getAge() < 19) {
            errors.rejectValue("age", "min", new Object[]{19}, null);
        }

        //boolean 타입의 getter는 "is~" 이다.
        if (!userInfo.isMembership()) {
            errors.rejectValue("membership", "membership");
        }
    }
}

Validator.validate(Object target, Errors errors)

Validator의 메서드 중 validate에 대해 잠깐 설명하자면,

  • 주어진 객체에 대한 유효성 검사를 수행하고 오류가 있을 경우 Errors 객체에 추가한다.
  • Errors 객체는 검증 오류를 수집하고 저장하는 데 사용된다.
  • 조건을 만족하지 않으면 오류 메시지를 Errors 객체에 추가하여 검증 실패를 기록한다.
  • 검사 내용, 오류 코드, 오류 메시지는 사용자 정의로 작성하여 객체에 저장한다.
  • errors.rejectValue 메서드는 이러한 오류 코드를 Errors 객체에 추가하고, 이후에 이 객체를 사용해 적절한 오류 메시지를 사용자에게 반환한다.

그리고 위의 코드에서 name 필드는 "required" , age 필드는 "min", membership 필드는 "membership"이라는 오류 코드에 대한 메시지를 출력하도록 설정해 놓았다.

해당 메시지는 errors.properties에 아래와 같이 작성했다.

required = (이름) 잘못된 입력입니다.
min = (최소 나이 조건) 잘못된 입력입니다.
membership = (멤버십) 잘못된 입력입니다.

하지만 유효성 검사 체크를 위해 의도적으로 잘못된 값을 입력 후 제출을 했을 때 나타난 오류창..

이 중 눈에 띄는 문장을 발견했다. 유효성 검사를 위한 필드와 메시지 작성을 모두 완료했지만 둘의 연결이 이루어지지 않은 듯 했다.

No message found under code 'required.user.name' for locale 'ko_KR'.

문제 해결1

application.properties에 에러 메시지를 출력할 수 있도록 경로를 설정해주지 않았다. 그림과 같이 spring.messages.basename=errors 코드를 추가해 준다.

application.properties 는 Spring Boot 애플리케이션의 구성 정보를 정의하는 파일로, 애플리케이션의 동작 방식을 설정한다. errors.properties 파일을 사용하여 유효성 검사의 에러 메시지를 정의할 때, 이 파일의 위치를 지정해야주어야 한다. 예를 들어, spring.messages.basename=messages 과 같이 설정했다면 이 경우는 messages.properties 파일을 사용한 것.




문제 원인2

이번에는 오류 메시지가 출력은 되는데 깨짐 현상이 발생했다. 한글로 설정한 메시지였으므로 인코딩의 문제임을 바로 알 수 있었다.


문제 해결2

인텔리제이의 Settings - File Encodings 에서 properties 파일들의 디폴트 인코딩을 UTF-8로 변경해준다.

완전히 잘 작동한 모습 ^ ___ ^

profile
하루 세번 목 당기기

0개의 댓글