WEB/Spring MVC 2

Spring MVC 2편 메시지, 국제화

Tony Lim 2021. 8. 21. 11:13

메세지

messages.properties 같은 메시지 관리용 파일을 만들어서 여기서 다 관리를 한다. 

item=상품
item.id = 상품 ID
item.price = 가격

이것들을 다른 페이지에 다 똑같이 적용시켜서 관리한다.

 

국제화

messages.properties 를 각 나라별로 관리하면 서비스를 국제화 할 수 있다. 예를 들면 message_en.properties, message_kr.properties 등등

item=Item
item.id=Item ID
item.itemName=Item Name

어느 나라에서 접근했는지 인식하는 방법은 HTTP accep-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하도록 하고 , 쿠키 등을 사용해서 처리하면 된다.

BUT Spring은 이런 기본적인 메세지와 국제화 기능을 제공해준다.

 

그냥 스프링을 사용하면 MessageSource을 스프링 빈으로 등록해야한다.

@Bean
public MessageSource messageSource() {
 	ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
 	messageSource.setBasenames("messages", "errors");
 	messageSource.setDefaultEncoding("utf-8");
 	return messageSource;
}

ResourceBundleMessageSource는 구현체로 등록을 해주어야한다.

 

하지만 spring boot에서는 이것들이 이미 처리되어있다.

spring.messages.basename=messages 를 Application.properties에 등록이 기본적으로 되어 있다고 생각하면 된다.

reosurce folder에서 message.properties 와 message_en.properties 를 작성해주면 기본은 한국말로 다 나타날것이다.

hello=안녕
hello.name=안녕 {0}
hello=hello
hello=hello {0}

인자를 받을 수 있다.

 

@SpringBootTest
public class MessageSourceTest
{
    @Autowired
    MessageSource messageSource;

    @Test
    void helloMessage()
    {
        String result = messageSource.getMessage("hello", null, null);
        assertThat(result).isEqualTo("안녕");
    }

    @Test
    void notFoundMessageCode()
    {
        assertThatThrownBy(() -> messageSource.getMessage("no_code",null,null))
                .isInstanceOf(NoSuchMessageException.class);
    }

    @Test
    void notFoundMessageCodeDefaultMessage()
    {
        String result = messageSource.getMessage("no_code",null,"기본 메세지",null);
        assertThat(result).isEqualTo("기본 메세지");
    }

    @Test
    void argumentMessage()
    {
        String message = messageSource.getMessage("hello.name", new Object[]{"Spring"}, null);
        assertThat(message).isEqualTo("안녕 Spring");
    }

    @Test
    void defaultLang()
    {
        assertThat(messageSource.getMessage("hello",null,null)).isEqualTo("안녕");
        assertThat(messageSource.getMessage("hello",null, Locale.KOREA)).isEqualTo("안녕");
    }

    @Test
    void enLang()
    {
        assertThat(messageSource.getMessage("hello",null,Locale.ENGLISH)).isEqualTo("hello");

    }
}

intellij 로 돌릴경우 file > setting > editor > file encoding 에서 Global, Project Encoding , Properties file 를 다 UTF-8 로 고쳐야 문제없이 진행할 수 있다.

 

이번엔 실제 웹 애플리케이션에 적용을 해보자

설정을 다 완벽히 해주면 따로 배포를 하지않고 크롬상에서 Locale 설정만 바꿔줘도 알아서 바뀐다. 

thymeleaf에서 결국은 Spring으로 하여금 messageSource.getMessage를 호출하는것의 결과값을 뿌려주는것이다.