JSTL(JSP Standard Tag Library)의 <fmt:setLocale> 태그는 지정한 로케일(locale) 정보를 로케일 구성 변수에 저장하는 역할을 합니다. 이렇게 저장된 로케일은 이후 국제화(i18n) 관련 태그들이 어떤 언어와 지역 설정을 기준으로 동작할지 결정하는 데 사용됩니다.
fmt:setLocale 태그의 주요 속성
<fmt:setLocale> 태그는 다음과 같은 속성을 제공합니다.
| 속성 | 설명 | 필수 여부 | 기본값 |
|---|---|---|---|
| value | ISO-639 언어 코드와 ISO-3166 국가 코드로 구성된 두 부분의 코드를 지정합니다. | 필수 | en_US |
| variant | 브라우저별 변형(variant)을 지정합니다. | 선택 | 없음 |
| scope | 로케일 구성 변수의 적용 범위(scope)를 지정합니다. | 선택 | page |
리소스 번들(Resource Bundle)이란?
리소스 번들은 로케일별로 필요한 객체들을 담아두는 컨테이너입니다. 내부적으로 키(key)/값(value) 쌍으로 구성되며, 프로그램이 특정 로케일에 맞는 리소스가 필요할 때 모든 로케일에서 공통으로 사용되는 키는 그대로 유지하고, 값만 각 언어·지역에 맞게 번역해서 담아둘 수 있습니다. 덕분에 하나의 애플리케이션에서도 사용자의 언어 환경에 맞는 콘텐츠를 손쉽게 제공할 수 있습니다.
자바 리소스 번들 파일은 일련의 키-문자열 매핑(key-to-string mapping)으로 이루어집니다. 여기서 소개하는 방식은 java.util.ListResourceBundle 클래스를 상속받는 컴파일된 자바 클래스를 직접 작성하는 것입니다. 작성한 클래스 파일은 반드시 컴파일한 뒤 웹 애플리케이션의 클래스패스(classpath)에 포함시켜야 합니다.
1. 기본(영어) 리소스 번들 정의하기
먼저 기본이 되는 영어 리소스 번들을 다음과 같이 정의합니다.
package com.tutorialspoint;
import java.util.ListResourceBundle;
public class Example_En extends ListResourceBundle {
public Object[][] getContents() {
return contents;
}
static final Object[][] contents = {
{"count.one", "One"},
{"count.two", "Two"},
{"count.three", "Three"},
};
}
2. 스페인어(es_ES) 리소스 번들 정의하기
이번에는 스페인어 로케일에서 사용할 리소스 번들을 추가로 정의합니다. 키는 동일하게 유지하고 값만 스페인어로 바꾼 점에 주목하세요.
package com.tutorialspoint;
import java.util.ListResourceBundle;
public class Example_es_ES extends ListResourceBundle {
public Object[][] getContents() {
return contents;
}
static final Object[][] contents = {
{"count.one", "Uno"},
{"count.two", "Dos"},
{"count.three", "Tres"},
};
}
JSP에서 fmt:setLocale로 로케일 전환하기
위에서 작성한 두 클래스를 컴파일해 생성된 Example_En.class와 Example_es_ES.class 파일을 웹 애플리케이션의 CLASSPATH에 배치합니다. 그다음 아래와 같이 JSTL 태그를 사용하면 로케일 변경 전후의 출력 결과를 비교할 수 있습니다.
<%@ taglib uri = "https://java.sun.com/jsp/jstl/core" prefix = "c" %> <%@ taglib uri = "https://java.sun.com/jsp/jstl/fmt" prefix = "fmt" %> <html> <head> <title>JSTL fmt:setLocale Tag</title> </head> <body> <fmt:bundle basename = "com.tutorialspoint.Example"> <fmt:message key = "count.one"/><br/> <fmt:message key = "count.two"/><br/> <fmt:message key = "count.three"/><br/> </fmt:bundle> <!-- 로케일 변경 --> <fmt:setLocale value = "es_ES"/> <fmt:bundle basename = "com.tutorialspoint.Example"> <fmt:message key = "count.one"/><br/> <fmt:message key = "count.two"/><br/> <fmt:message key = "count.three"/><br/> </fmt:bundle> </body> </html>
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
One Two Three Uno Dos Tres
처음에는 기본 로케일(en_US)이 적용되어 영어 단어가 출력되고, <fmt:setLocale value="es_ES"/>로 로케일을 스페인어로 변경한 이후에는 같은 키를 조회했음에도 스페인어 단어가 출력되는 것을 확인할 수 있습니다. 이처럼 <fmt:setLocale> 태그와 리소스 번들을 함께 활용하면 별도의 페이지 분기 없이도 다국어 콘텐츠를 깔끔하게 처리할 수 있습니다.