Spring/MVC
메세지, 국제화
개복이
2022. 4. 27. 15:01
[메세지 개요]
HTML, JSP 파일 등에 메세지가 하드코딩 되어있다면?
<label>상품명</label>
예를들어 고객사, 기획자 등 모든 상품명을 상품이름으로 수정을 요청한다면?
<label>상품이름</label>
- 상품명으로 되어있는 HTML을 모두 찾아 상품이름으로 변경해야 한다.
- 규모가 작은 프로젝트라면 문제가 되지 않겠지만 큰 프로젝트라면 관리가 힘들어질 것이다.
- 이런 다양한 메세지를 한 곳에서 관리하도록 하는 기능을 메세지 기능이라 한다.
[Spring MessageSource 설정]
@Bean
public MessageSource messageSource(){
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- Spring이 제공하는 MessageSource를 Bean으로 등록해야 한다.
- MessageSource는 인터페이스이기 때문에 구현체인 ResourceBundleMessageSource를 Spring Bean으로 등록해야 한다.
- setBasenames로 설정 파일의 이름을 지정한다.
- 위의 예제에서는 messages, errors로 지정하였기 때문에 messages.properties, errors.properties 파일을 읽어서 사용한다.
- 파일의 위치는 /resources/messages.properties, errors.properties에 두어 사용한다.
(setBasenames를 수정하여 원하는 경로로 변경할 수 있다. ex) /resources/*/*.properties) - 국제화 기능을 적용하려면 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어
정보를 넣으면 된다.
만약 찾을 수 있는 국제화 파일이 없으면 messages.properties (언어정보가 없는 파일명)를 기본으로 사용한다.
- setDefaultEncoding로 인코딩 정보를 지정할 수 있다.
[Spring boot MessageSource 설정]
Spring boot는 MessageSource를 자동으로 Spring Bean으로 등록한다.
[application.properties]
spring.messages.basename=messages
- 기본 설정 값이기 때문에 별도로 작성하지 않으면 messages라는 이름으로 기본 등록된다.
- 따라서 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>
...