-
메시지 국제화 - messages.properties가 무시되고 messages_ko.properties가 적용되는 이유카테고리 없음 2025. 5. 15. 23:14
김영한 스프링 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가 사용됨