티스토리 뷰

반응형

2019/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);


반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함