ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 메시지 국제화 - 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가 사용됨

Designed by Tistory.