[Spring] 메시지, 국제화
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의 설정 - 고급 - 언어
에서 언어를 영어로 바꾸면 다국어 테스트가 가능하다.
Leave a comment