Updated:

1. 개요

스프링에서는 다양한 메시지를 한 곳에서 관리하여 필요할 때 가져다 쓸 수 있도록 메시지 기능을 지원한다. 또한 각 나라의 언어별로 메시지를 관리할 수 있도록 국제화 기능도 제공한다. 이번에는 Spring Boot에서 메시지, 국제화를 사용하는 방법에 대해 알아보도록 하자.

2. 개발 환경

  • Java 11

  • Spring Boot 2.7.5

3. 메시지

메시지 기능을 사용하기 위해 MessageSource를 빈으로 등록해야 하는데, Spring Boot에서는 따로 빈으로 등록해주지 않아도 자동으로 빈으로 등록된다.

3-1. application.yml 설정

spring.messages.basename을 통해 메시지 파일의 이름을 설정할 수 있다. 기본값이 messages이므로 추가하지 않으면 messages라는 이름을 가진 파일을 사용한다.

1
2
3
spring:
  messages:
    basename: messages

3-2. 메시지 파일 생성

resources 밑에 messages.properties 파일을 생성한다. messages.properties는 언어에 해당하는 메시지 파일이 존재하지 않을 때 기본으로 사용하게 된다.

[messages.properties]

1
2
hello=안녕
hello.name=안녕, {0}

3-3. 스프링 MessageSource 사용

MessageSource 인터페이스를 통해 메시지 파일의 내용을 가져와서 사용할 수 있다.

[MessageSourceTest.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootTest
class MessageSourceTest {

    @Autowired MessageSource messageSource;

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

    @Test
    void getNameWithParameter() {
        String name = messageSource.getMessage("hello.name", new Object[]{"스프링"}, null);
        assertThat(name).isEqualTo("안녕, 스프링");
    }
}

3-3-1. 한글이 깨지는 경우

인코딩 문제로 인해 한글이 ???로 표시되는 경우 File - Settings... - Editor - Code Style - File Encodings에서 인코딩 설정을 UTF-8로 변경 후 messages.properties 파일을 다시 저장하고 실행하면 된다.

3-4. Thymeleaf 사용

타임리프의 메시지 표현식 #{...}를 사용하여 스프링의 메시지를 조회할 수 있다.

[index.html]

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2 th:text="#{hello}"></h2>
<h2 th:text="#{hello.name('Spring')}"></h2>
</body>
</html>

[실행 결과]

4. 국제화

메시지 파일을 각 나라의 언어별로 구성하면, 해당 언어의 메시지 파일 내용을 표시하도록 할 수 있다. 해당 나라의 언어에 해당하는 메시지 파일이 존재하지 않는 경우 기본 설정 파일의 내용으로 표시된다.

4-1. 메시지 파일 생성

resources 밑에 messages_en.properties 파일을 생성한다. 영어를 사용하는 환경에서 접속하면 해당 파일의 언어로 표시된다.

[messages_en.properties]

1
2
hello=Hello
hello.name=Hello, {0}

4-2. 스프링 MessageSource 사용

MessageSource 인터페이스를 통해 메시지 파일의 내용을 가져와서 사용할 수 있다.

[MessageSourceTest.java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@SpringBootTest
class MessageSourceTest {

    @Autowired MessageSource messageSource;

    @Test
    void getName() {
        String name = messageSource.getMessage("hello", null, Locale.ENGLISH);
        assertThat(name).isEqualTo("Hello");
    }

    @Test
    void getNameWithParameter() {
        String name = messageSource.getMessage("hello.name", new Object[]{"Spring"}, Locale.ENGLISH);
        assertThat(name).isEqualTo("Hello, Spring");
    }
}

4-3. Thymeleaf 사용

타임리프의 메시지 표현식 #{...}를 사용하여 스프링의 메시지를 조회할 수 있다.

[index.html]

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2 th:text="#{hello}"></h2>
<h2 th:text="#{hello.name('Spring')}"></h2>
</body>
</html>

[실행 결과]

4-3-1. Chrome 언어 변경 방법

Chrome의 설정 - 고급 - 언어에서 언어를 영어로 바꾸면 다국어 테스트가 가능하다.

Updated:

Leave a comment