기존 화면에 보이던 글자들을 변경하게 될 경우, 하나하나 찾아가면서 변경하는 것은 쉽지 않은 일이다. 이런 다양한 메시지들은 한 곳에서 관리하게 되면 유지보수 및 변경에 용이한데 이런 기능을 메시지 기능이라 한다.
타임리프의 메시지 표현식 #{. . .}
를 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
<label for="memberGrade" th:text="#{memberGrade}"></label>
더 나아가 각 나라별로 쓰이는 언어에 맞춰 관리하면 서비스를 국제화할 수 있다.
messages.properties
→ messages_ko.properties
, messages_en.properties
, messages_jp.properties
· · ·
국제화 언어 선택
- HTTP
accept-language
헤더 값 사용- 사용자가 직접 언어를 선택하는 방법
- 쿠키 . . .
메시지 관리 기능은 스프링이 제공하는 MessageSource
를 스프링 빈으로 등록하여 사용한다.
MessageSource
- 인터페이스ResourceBundleMessageSource
- 인터페이스 구현체 ( 이를 스프링 빈으로 등록 )메시지 소스를 직접 등록하는 방법과 자동 등록하는 방법이 존재한다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "information");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
basenames
: 설정 파일의 이름을 지정하는 것으로, 여러 파일을 지정 가능하다.
defaultEncoding
: 인코딩 정보를 지정한다. utf-8 을 사용하면 된다.
추가로, 국제화 기능을 사용하고자 하면 파일명 마지막에 언어 정보를 주면 된다. 찾을 수 있는 국제화 파일이 없으면 messages.properties
(언어정보가 없는 파일명)를 기본으로 사용한다.
스프링 부트를 사용하면 스프링 부트가 MessageSource
를 자동으로 스프링 빈으로 등록해준다.
MessageSource
를 스프링 빈으로 등록하지 않고, 별도의 설정없이 다음과 같이 설정하게 되면 "messages" 라는 이름으로 등록된다.
application.properties
spring.messages.basename=messages,config.i18n.messages
public interface MessageSource {
String getMessage(String code, @Nullable Object[] args,
@Nullable String defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args,
Locale locale) throws NoSuchMessageException;
}
code
: 메시지 코드로 메시지 관리 파일에 있는 KEY 값args
: 매개변수를 사용할 때 사용된다.locale
: 언어 설정 정보로 국제화 파일을 선택할 때, 쓰인다.locale
이 en_US
의 경우, messages_en_US
→ messages_en
→ messages
순서로 찾는다.메시지가 없는 경우에는 NoSuchMessageException
이 발생하지만, 기본 메시지 defaultMessage
를 사용할 경우, 기본 메시지가 반환된다.
Locale 정보가 없는 경우
Locale.getDefault()
을 호출해서 시스템의 기본 로케일을 사용합니다.
📌 본 포스트는 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.