카테고리 없음

메시지 국제화 - messages.properties가 무시되고 messages_ko.properties가 적용되는 이유

happyst 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가 사용됨