Locale을 사용하다 보면 은근 헷갈리는 부분이 Locale.KOREA(ko_KR)와 Locale.KOREAN(ko)이다. 쉽게 정리하면 Locale.KOREA는 국가 정보이고 Locale.KOREAN은 언어 정보이다. 국가 정보에는 언어 정보를 포함하므로 좀 더 광범위하게 사용된다.
따라서 Locale.KOREAN 처럼 언어 설정을 나타내는 객체는 언어에 따라 앱의 동작을 변경할 때 사용되는데 주로 i18N에 의해 국제화를 지원하는 경우가 대표적이다.
반면 Locale.KOREA는 국가 정보를 나타내기 때문에 지역의 설정에 따라 숫자, 날짜의 포멧을 변경할 때 사용된다. 따라서 위의 printByLocale을 Locale.KOREAN으로 호출하면 국가 정보가 없기 때문에 통화를 재대로 표시하지 못한다.
i18N을 사용하는 큰 이유는 다양한 언어로 서비스하기 위해서이다. 위와 같이 LocaleResolver와 LocaleChangeInterceptor를 작성해두었다면 이제 적절한 bundle 파일만 있으면 된다. bundle은 통상 properties 파일로 작성하는데 basename_locale.properties 형태로 작성한다.
locale은 상세한 표현이 우선 순위를 갖는다. 따라서 ko_KR > ko > 생략 의 순으로 bundle에서 property를 검색한다.
title=안녕! test=ko_KR
test=en_US
title=Hello test=default
message_ko_KR.properties
message_en_US.properties
message.properties
위와 같이 property가 설정된 상태에서 ko_KR로 요청하면 "안녕"과 "ko_KR"이 출력된다. en_US로 요청하는 경우 "Hello"와 "en_US"가 출력된다. 마지막으로 ja_JP 처럼 전혀 매핑되는 속성이 없을 경우는 system의 default locale이 적용되어 ko_KR과 동일한 결과가 나온다.
bundle 작성 및 지정
bundle 파일들은 일반적으로 src/main/resources 아래에 작성한다.
그리고 이 번들 파일을 지정하기 위해서는 spring.messages.basename 속성을 이용한다.