티스토리 뷰
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (5)
zepinos 2019. 2. 1. 14:172019/02/01 - [Programming/Spring Boot 시작하기] - Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (4)
Spring Boot 에서 messages.properties 을 이용해서 다국어를 쉽게 view 에서 사용할 수 있습니다. 하지만, Java 코드 내에서 이 다국어 메세지를 불러오려면 어떻게 해야 할까요? 물론 CookieLocaleResolver 등으로 상태를 저장하고 있다면 request 에서 Cookie value 을 가져와서 messages_(언어코드) 에 해당하는 properties 을 읽어오면 되겠죠.
그렇다면, 이 때 파일명을 직접 생성해서 properties 파일을 열어야 할까요? 당연히 Spring 에서는 Locale 에 따른 파일 선택을 자동으로 해주는 기능이 존재합니다. 바로 org.springframework.context.MessageSource 인터페이스입니다.
@Autowired private MessageSource messageSource;
이렇게 주입을 받은 뒤 MessageSource#getMessage method 을 이용해서 메세지 정보를 가져올 수 있습니다.
그런데, 이 getMessage 에는 Locale 을 반드시 입력받게 되어 있습니다. 그렇기 때문에 Cookie 등에서 Locale 문자열을 가져와야 합니다. 그런데 이전 글에서 얘기했지만 Cookie 등에 저장된 Locale 정보 중 언어와 국가 사이의 구분 문자가 다를 수 있습니다.
내부에서 Locale 정보를 가지고 있을 때에는 ko_KR 이든 ko-KR 이든 정상적으로 동작합니다. 하지만, 직접 문자열을 받아서 Locale 을 생성할 때에는 우리가 생각하는 것과 다르게 동작합니다. 이 모든게 Java 탓입니다. (흑흑 T.T)
다음과 같은 예제를 실행해보겠습니다.
참고로 LocaleUtils 는 Java Locale 객체를 만들어주는 Apache Commons Lang 의 class 인데, 아래 예제의 1 번의 문제를 해결하기 위해 1 번처럼 한 문자열로 입력된 것을 언더스코어(_) 기준으로 잘라서 4 번처럼 생성해주는 기능을 가지고 있습니다.
Locale locale; locale = new Locale("ko_KR"); System.out.println("1 : " + locale); locale = new Locale("ko_kr"); System.out.println("2 : " + locale); locale = new Locale("ko-KR"); System.out.println("3 : " + locale); locale = new Locale("ko", "KR"); System.out.println("4 : " + locale); locale = Locale.forLanguageTag("ko_KR"); System.out.println("5 : " + locale); locale = Locale.forLanguageTag("ko-KR"); System.out.println("6 : " + locale); locale = Locale.forLanguageTag("ko-kr"); System.out.println("7 : " + locale); locale = LocaleUtils.toLocale("ko_KR"); System.out.println("8 : " + locale); locale = LocaleUtils.toLocale("ko-KR"); System.out.println("9 : " + locale);
어떤 결과를 예상하시나요?
결과는 다음과 같습니다.
1 : ko_kr
2 : ko_kr
3 : ko-kr
4 : ko_KR
5 :
6 : ko_KR
7 : ko_KR
8 : ko_KR
Exception in thread "main" java.lang.IllegalArgumentException: Invalid locale format: ko-KR
at org.apache.commons.lang3.LocaleUtils.parseLocale(LocaleUtils.java:158)
at org.apache.commons.lang3.LocaleUtils.toLocale(LocaleUtils.java:126)
at com.zepinos.i18ntest.I18nTestApplication.main(I18nTestApplication.java:41)
어떤 문자열이냐에 따라 처리해야 하는 방식이 다르기 때문에, 잘 고려해서 프로그래밍 해야 합니다.
이 문제에 대해서는 ICU 문서와 한국어(대한민국)에 대한 내용을 확인해보시면 됩니다.
http://www.localeplanet.com/icu/ko-KR/
http://userguide.icu-project.org/locale
위 내용들을 참고하여 Locale 객체를 생성했다면 다음과 같이 현재 Locale 에 맞는 properties 정보를 가져올 수 있습니다.
Locale locale = LocaleUtils.toLocale("ko_KR"); String testOk = messageSource.getMessage("test_ok", null, locale);
'Programming > Spring Boot 시작하기' 카테고리의 다른 글
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (4) (0) | 2019.02.01 |
---|---|
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (3) (0) | 2019.01.29 |
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (2) (0) | 2019.01.28 |
Spring Boot 에서 messages.properties 을 이용한 다국어 처리 (1) (0) | 2019.01.28 |
Spring Boot 실행과 종료 시 특정 동작을 실행하도록 해보기 (2) | 2019.01.25 |
- Total
- Today
- Yesterday
- 도입기
- manjaro
- Nas
- 내장 WAS
- Redmine
- Phabricator
- 워드프레스
- 페이징
- RestTemplate
- jooq
- Spring
- 엘지
- docker
- 프로젝트 규모
- boot
- Spring Boot
- 시니어 프로그래머
- OracleJDK
- NoSQL
- java config
- paging
- KDE
- 외장 WAS
- messages.properties
- couchbase
- Spring MVC
- git
- SI
- proxmox
- 클라우드플레어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |