메시지 : 화면에 보이는 문구를 한번에 설정하고 관리할 수 있게 하도록 하는 기능
국제화 : 나라 별 다른 언어로 보이도록 하는 기능
메시지 기능 사용
1. 메시지 파일 등록
기존에는 아래와 같이 메시지 기능을 제공하는 스프링 빈을 직접 등록해서 사용했다.
basenames을 지정하면 그 파일을 사용할 수 있게 된다. 여기서는
messages.properties와 errors.properties 파일을 사용하게 된다.
국제화 기능을 위해선 messages_ko.properties와 같이 언어 정보를 주면 된다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
하지만 현재는 스프링부트가 빈 생성을 자동으로 등록해주기 때문에, 바로 사용이 가능하다.
아무 설정을 해주지 않을 경우 messages라는 파일 이름을 기본으로 등록한다.
따라서 기능 사용을 위해 messages.properites 또는 messages_en.properties 같은 파일을 등록해주면 된다.
2. 메시지 파일 사용
아래와 같이 파일들을 등록했다고 해보자.
//messages.properties
hello=안녕
hello.name=안녕 {0}
//messages_en.properties
hello=hello
hello.name=hello {0}
테스트를 아래와 같이 실행할 수 있다.
아래와 같이 파라미터도 설정이 가능함을 알 수 있다.
ms.getMessage("hello", null, null)에서 각 파라미터는 다음과 같다 : code: hello, args: null, locale: null
lacale 파라미터 설정을 통해 국제화 기능을 사용할 수 있다.
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
@Test
void notFoundMessageCode() {
assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class);
}
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
assertThat(result).isEqualTo("기본 메시지");
}
@Test
void argumentMessage() {
String message = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(message).isEqualTo("안녕 Spring");
}
@Test
void defaultLang() {
assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
}
@Test
void enLang() {
assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");
}
}
기능 적용하기
타임리프 메시지 적용법
타임리프 표현식 #{...}을 통해 손쉽게 조회 가능
렌더링 전
<div th:text="#{label.item}"></h2>
렌더링 후
<div>상품</h2>
파라미터는 아래와 같이 적용한다.
hello.name=안녕 {0}의 경우,
<p th:text="#{hello.name(${item.itemName})}"></p>
----------------------------------------------
참고 : 인프런 김영한님 강의(스프링 MVC 2편 - 백엔드 웹 개발 활용 기술)
댓글