공부함

메세지, 국제화 본문

스프링/스프링mvc2

메세지, 국제화

찌땀 2023. 10. 11. 20:46

메세지

다양한 메세지를 한 곳에서 관리하는 기능을 메세지 기능이라 한다.

메세지 기능을 사용하려면 스프링이 제공하는 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