Spring/MVC

메세지, 국제화

개복이 2022. 4. 27. 15:01

[메세지 개요]

HTML, JSP 파일 등에 메세지가 하드코딩 되어있다면?

<label>상품명</label>

 

예를들어 고객사, 기획자 등 모든 상품명을 상품이름으로 수정을 요청한다면?

<label>상품이름</label>
  1. 상품명으로 되어있는 HTML을 모두 찾아 상품이름으로 변경해야 한다.
  2. 규모가 작은 프로젝트라면 문제가 되지 않겠지만 큰 프로젝트라면 관리가 힘들어질 것이다.
  3. 이런 다양한 메세지를 한 곳에서 관리하도록 하는 기능을 메세지 기능이라 한다.

 

[Spring MessageSource 설정]

@Bean
public MessageSource messageSource(){
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages", "errors");
    messageSource.setDefaultEncoding("utf-8");
    return messageSource;
}
  1. Spring이 제공하는 MessageSource를 Bean으로 등록해야 한다.
  2. MessageSource는 인터페이스이기 때문에 구현체인 ResourceBundleMessageSource를 Spring Bean으로 등록해야 한다.
  3. setBasenames로 설정 파일의 이름을 지정한다.
    1. 위의 예제에서는 messages, errors로 지정하였기 때문에 messages.properties, errors.properties 파일을 읽어서 사용한다.
    2. 파일의 위치는 /resources/messages.properties, errors.properties에 두어 사용한다.
      (setBasenames를 수정하여 원하는 경로로 변경할 수 있다. ex) /resources/*/*.properties)
    3. 국제화 기능을 적용하려면 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어
      정보를 넣으면 된다.
      만약 찾을 수 있는 국제화 파일이 없으면 messages.properties (언어정보가 없는 파일명)를 기본으로 사용한다.
  4. setDefaultEncoding로 인코딩 정보를 지정할 수 있다.

 

[Spring boot MessageSource 설정]

Spring boot는 MessageSource를 자동으로 Spring Bean으로 등록한다.

 

[application.properties]

spring.messages.basename=messages
  1. 기본 설정 값이기 때문에 별도로 작성하지 않으면 messages라는 이름으로 기본 등록된다.
  2. 따라서 messages_en.properties, messages_ko.properties, messages.properties 파일만 등록하면 자동으로 인식

 

[messages.properties 예시]

# messages.properties

label.item=상품
label.item.id=상품ID
label.item.itemName=상품명

...

 

[Thymeleaf 적용 예시]

<label th:text="#{label.item.itemName}"></label>

 

[JSP 적용 예시]

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
...

<h2><spring:message code="label.item.itemName"></h2>

...