본문 바로가기
Backend, Server/Spring MVC

[Spring MVC] 메시지와 국제화

by ggyongi 2022. 2. 1.
반응형

메시지 : 화면에 보이는 문구를 한번에 설정하고 관리할 수 있게 하도록 하는 기능

국제화 : 나라 별 다른 언어로 보이도록 하는 기능

 

 

메시지 기능 사용

 

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편 - 백엔드 웹 개발 활용 기술)

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글