공부함
메세지, 국제화 본문
메세지
다양한 메세지를 한 곳에서 관리하는 기능을 메세지 기능이라 한다.
메세지 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록해야 한다.
MessageSource는 인터페이스이므로 ResourceBundleMessageSource 구현체를 스프링 빈으로 등록해야 한다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new
ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
위와 같이 직접 등록할 수 있다.
setBasenames는 설정 파일의 이름을 지정하는 것이다.
위와 같이 지정하면 messages.properties와 errors.properties가 지정된 것이다.
파일 위치는 /resources 이하에 두면 된다.
국제화를 하고 싶으면 messages_en.properties와 같이 파일명 마지막에 언어 정보를 주면 된다.
스프링부트를 사용하면 스프링부트가 MessageSource를 자동으로 스프링 빈으로 등록한다
application.properties를 사용해서 basename을 지정할 수 있다.
spring.messages.basename=messages,config.i18n.messages
별도 설정을 하지 않으면 messages라는 이름으로 자동 등록된다.
즉 messages.properties 파일을 등록하면 자동 인식된다.
hello=안녕
hello.name = 안녕 {0}
위와 같이 messages.properties 파일을 작성할 수 있다.
어떻게 활용하는지 알아보자.
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
}
MessageSource를 주입받아서 사용한다.
getMessage의 인자는 순서대로 code, args, locale이다.
위와 같이 args와 locale 값을 null로 주고 호출하면 basename으로 지정된 messages.properties에서 값을 가져온다.
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(result).isEqualTo("안녕 Spring");
}
메세지의 {0} 부분은 매개변수로 치환할 수 있다.
@Test
void enLang() {
assertThat(ms.getMessage("hello", null,
Locale.ENGLISH)).isEqualTo("hello");
}
Locale.ENGLISH로 locale 값을 설정해서 messages_en.properties에서 값을 가져온다.
타임리프에서 적용
타임리프에서는 #{ ... } 로 편리하게 메세지를 적용할 수 있다.
#{hello} : 파라미터 없이 hello=안녕 사용
#{hello.name(${item.itemName})} 파라미터 있이 hello.name = 안녕 {0} 사용
'스프링 > 스프링mvc2' 카테고리의 다른 글
타임리프 스프링 통합, 폼 (0) | 2023.10.10 |
---|---|
타임리프 (0) | 2023.10.09 |