Java + Spring

java(자바) message.properties ( 메시지 프로퍼티 ) 설정하기

현욱블리츠 2019. 11. 9. 19:38

안녕하세요 현욱블리츠입니다.

오늘은 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 basenameLocale localethrows 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<StringObjectresult = new HashMap<StringObject>();

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/