java(자바) message.properties ( 메시지 프로퍼티 ) 설정하기
안녕하세요 현욱블리츠입니다.
오늘은 message.properties에 대해 설명하려고 합니다.
웹에서 alert나 confirm을 할 때 여러분들은 어떻게 이용하시나요 ?
alert('확인되었습니다.');
confirm("정말 삭제하시겠습니까?");
이런식으로 이용하시나요 ? 그렇다면 메시지 프로퍼티를 아셔야 할 필요가 있습니다 !
메시지 프로퍼티는 이러한 메시지에 이용되는 문구를 한 곳에 저장하여 관리, 사용할 수 있습니다.
그렇다면 어떤 효과가 있을까요?
예를 들어, alert('확인되었습니다.'); 라는 문구가 여러군데에서 사용하고 있는데 갑자기 '확인되었습니다' 라는 문구를 전부 '확인되었습니다. 감사합니다.' 라는 문구로 바꿔달라는 요청이 왔다고 가정하면 우리는 spring 내의 ctrl + h 등의 검색을 통해 모든 파일을 돌아다니면서 수정해야 할 것입니다.
그러나 메시지 프로퍼티를 이용한다면 파일 하나만 수정한다면 끝나게 됩니다.
그렇다면 어떻게 설정할까요 ?
여러 방법이 있겠지만 저는 gradle을 사용하기 때문에 해당 방법으로 하겠습니다.
일단 build.gradle에 message property를 사용하기 위해 아래와 같이 추가해줍니다.
build.gradle
compile 'net.rakugakibox.util:yaml-resource-bundle:1.1'
그리고 java / resources 폴더에 messages라는 폴더를 만들고 messages_ko.yml 폴더를 만들어주세요.( ko는 한글을 쓰겠다는 표시이며 다르게 쓰셔도 상관 없습니다.)
yml은 xml과 다르게 띄어쓰기(들여쓰기)로 구분하며 보기 편하다는 장점이 있습니다.
메시지를 저장할 곳이며 아래와 같이 작성할 것입니다.
messages_ko.yml
alert:
save: "{0}이(가) 저장되었습니다."
saved: "저장되었습니다."
그리고 이 메시지를 사용할 수 있게 config 파일이 있어야 하는데요, 저는 java / kr / hw / config 폴더에 ConfigMessage.java라는 파일을 만들겠습니다.
WebMvcConfigurer을 implements하여 사용하는 방법도 있지만 저는
WebMvcConfigurerAdapter를 extends하여 사용하겠습니다.
ConfigMessage.java
@Configuration
public class ConfigMessage extends WebMvcConfigurerAdapter{
@Bean // 세션에 지역을 설정하며 기본값은 ko입니다.
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.KOREA);
return slr;
}
@Bean // 지역설정을 변경하는 인터셉터입니다. 요청할 때에 Parameter에 lang 정보를 지정하면 언어가 변경된다고 합니다.
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Override // Interceptor를 시스템 레지스트리에 등록합니다.
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
@Bean("messageSource") // // yml 파일을 참조하는 MessageSource 선언합니다.
public MessageSource messageSource() {
YamlMessageSource ms = new YamlMessageSource();
ms.setBasename("messages/messages");
ms.setDefaultEncoding("UTF-8");
ms.setAlwaysUseMessageFormat(true);
ms.setUseCodeAsDefaultMessage(true);
ms.setFallbackToSystemLocale(true);
return ms;
}
}
// locale(지역) 정보에 따라 다른 yml 파일을 읽도록 처리합니다.class YamlMessageSource extends ResourceBundleMessageSource {
@Override
protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException {
return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE);
}
}
그 다음 application.properties에 아래 내용을 추가합니다.
spring.messages.basename=classpath:/messages/message
spring.messages.encoding=UTF-8
이제 사용하면 됩니다. 사용하는 방법은 controller에서 넘겨줄 때 사용하는 방법이 있고, front단에서 사용하는 방법이 있습니다.
방법 1. Controller
@Autowired MessageSource messageSource;
.
. ( 생략 )
.
public String test( ...(생략)... , Locale locale){
.
. ( 생략 )
.
Map<String, Object> result = new HashMap<String, Object>();
String msg = "";
String[] param = {"아이디"};
msg = messageSource.getMessage("alert.save", param , locale); // 결과 : "아이디이(가) 저장되었습니다."
result.put("msg", msg);
return result;
}
이런식으로 사용하여 변수로 넘겨줄 수 있습니다.
그리고 jsp에서는 아래와 같이 사용할 수 있습니다.
test.jsp
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> // 맨 위에 설정해주시면 됩니다.
<spring:message code="alert.saved" />
<spring:message code="alert.seve" arguments="아이디" />
{0} {1} 메시지 프로퍼티에 여러개를 입력받아서 사용할 수도 있습니다.
처음으로 긴 글을 작성해 보는 것 같습니다. 저한테도 이미 적용되어 있는 파일을 다시 열어보며 공부하는 계기가 되었고 다른 분들도 적용하여 사용하였으면 좋겠습니다.
오늘도 이만 글을 마칩니다 !
참고 : https://daddyprogrammer.org/post/499/springboot2-exception-handling-with-messagesource/