메시지 국제화 - messages.properties가 무시되고 messages_ko.properties가 적용되는 이유
김영한 스프링 MVC 2편 - 메시지, 국제화 파트를 수강하다가 이해가 안가는 부분이 생겼다.
현재 내 상황:
메시지 국제화 설정 파일
[messages.properties]
page.addItem=상품 등록2222
[messages_ko.properties]
page.addItem=상품 등록
[messages_en.properties]
page.addItem=Item Add
스프링 부트 테스트 코드
package hello.itemservice.message;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import java.util.Locale;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, Locale.US);
System.out.println("Default Locale = " + Locale.getDefault()); // en_US
assertThat(result).isEqualTo("hello");
}
}
JVM Default Locale이 "en_US" 로 나오는 상황!
thymeleaf
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<link th:href="@{/css/bootstrap.min.css}"
href="../css/bootstrap.min.css" rel="stylesheet">
<style>
.container {
max-width: 560px;
}
</style>
</head>
<body>
<div class="container">
<div class="py-5 text-center">
<h2 th:text="#{page.addItem}">상품 등록</h2>
</div>
</div> <!-- /container -->
</body>
</html>
JVM의 Default Locale이 en_US 였기 때문에, #{page.addItem} 부분이 "addItem" 으로 대치될 줄 알았다.
하지만!!
"상품 등록" 이라는 텍스트가 나왔다...! 그렇다면
1. thymeleaf 텍스트 대치가 문제가 있다 → html을 수정해도 "상품 등록" 이라는 텍스트가 표출됨!
2. messages_ko.properties가 적용되었다 ⭕
찾아보니 messages_ko.properties가 적용되는 것이었다.
스프링 부트가 클라이언트 요청의 Locale에 따라 message 파일을 선택하고 있기 때문!!
스프링 부트의 MessageSource는 서버의 Locale.getDefault()가 아니라, 클라이언트(브라우저)의 요청에 포함된 Locale 정보 (Accept-Language 헤더) 를 기준으로 메시지를 선택함
➡️ 브라우저가 서버에 요청할 때 한국어(Korean)를 우선적으로 보여달라고 명시하고 있다는 뜻
- messages_ko_KR.properties ← 없음
- messages_ko.properties ← 있음 → ✅ 여기서 page.addItem=상품 등록
- messages.properties ← fallback (사용되지 않음)
그렇다면! messages.properties가 적용되는 경우는?!
1. 클라이언트 요청의 Locale에 해당하는 messages_xx.properties 파일이 없을 때
예:
클라이언트가 Accept-Language: fr (프랑스어)로 요청했는데,
messages_fr.properties 파일이 없으면,
➡️ messages.properties 가 사용됨
2. 해당 키가 특정 Locale 파일에 없을 때
예:
클라이언트가 Accept-Language: ko로 요청했고
messages_ko.properties에는 label.item.price가 빠져 있는데,
messages.properties에는 정의돼 있다면,
➡️ fallback으로 messages.properties의 label.item.price가 사용됨