데이터 유효성 검증을 위해 다음과 같이 메시지를 하드 코딩했다.
SignupRequestDto
@Getter
@Setter
public class SignupRequestDto {
@Size(min = 4, max = 10)
@NotBlank
@Pattern(regexp = "^[a-z0-9]*$")
private String userId;
@Size(min = 8, max = 15)
@NotBlank
@Pattern(regexp = "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\\W)(?=\\S+$).{8,15}", message = "비밀번호는 8~15자 영문 대 소문자, 숫자, 특수문자를 사용하세요.")
private String password;
}
하드 코딩하지 않고 valid의 메시지를 관리하기 위해 message properties를 사용해보자.
message.properties 파일 생성
필자는 validation에 대한 메시지라는 것을 명확히 하기 위해 validation.properties 라는 이름으로 생성했다.
userId.pattern=영문, 숫자만 가능합니다.
password.pattern=비밀번호는 8~15자 영문 대 소문자, 숫자, 특수문자를 사용하세요.
콤마(.)를 구분값으로 사용했다.
메세지 프로퍼티에는 다음과 같이 메시지들을 작성할 수 있다.
test=This is test message
test.message=콤마를 넣어 구분값으로 사용 가능하다.
1=one 숫자는 String key로 인식
price=price is {0} 으로 작성하면 해당 부분을 치환할 수 있다.
WebConfig.class 생성
생성한 메시지를 사용하기 위해서는 config 파일을 생성해 경로를 설정해 주어야 한다.
WebConfig
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages/message");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public MessageSource validationMessageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages/validation");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Override
public Validator getValidator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(validationMessageSource());
return bean;
}
}
messageSource() 메서드에는 message.properties 경로를 설정해주고, validationMessageSource() 메서드에는 위에서 생성한 validation.properties 경로를 설정해주었다.
getValidator() 메서드에서 messageSource를 지정해주어 dto에서 메시지를 가져올 수 있다.
SignupRequestDto
@Getter
@Setter
public class SignupRequestDto {
@Size(min = 4, max = 10)
@NotBlank
@Pattern(regexp = "^[a-z0-9]*$", message = "{userId.pattern}")
private String userId;
@Size(min = 8, max = 15)
@NotBlank
@Pattern(regexp = "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*\\W)(?=\\S+$).{8,15}", message = "{password.pattern}")
private String password;
}
PostMan을 통해 확인하면 비밀번호에 문제가 있을 경우 다음과 같이 message가 나타난다.
도중에 한글이 깨지는 문제가 있었는데, application.yml 파일에 다음을 추가해주니 해결되었다.
spring:
messages:
encoding: UTF-8
이렇게 해도 한글이 깨진다면 File > Settings > Editor > File Encodings 로 가서
Default encoding for properties files를 UTF-8로 변경해주면 된다.
728x90