JSTL fmt:bundle 태그란?
<fmt:bundle> 태그는 지정된 리소스 번들을 해당 태그의 시작과 종료 태그 사이에 위치한 모든 <fmt:message> 태그에 적용할 수 있도록 해줍니다. 이를 활용하면 각각의 <fmt:message> 태그마다 일일이 리소스 번들을 지정할 필요가 없어 코드가 훨씬 간결해집니다.
예를 들어, 아래의 두 <fmt:bundle> 블록은 동일한 결과를 출력합니다.
<fmt:bundle basename = "com.tutorialspoint.Example"> <fmt:message key = "count.one"/> </fmt:bundle> <fmt:bundle basename = "com.tutorialspoint.Example" prefix = "count."> <fmt:message key = "title"/> </fmt:bundle>
두 번째 방식처럼 prefix 속성을 사용하면 키 이름 앞에 공통 접두사를 붙여 반복을 줄일 수 있습니다.
fmt:bundle 태그의 주요 속성
<fmt:bundle> 태그는 다음과 같은 속성을 제공합니다.
| 속성 | 설명 | 필수 여부 | 기본값 |
|---|---|---|---|
| basename | 로드할 리소스 번들의 기본 이름(base name)을 지정합니다. | 필수 | 없음 |
| prefix | 하위 <fmt:message> 태그의 각 키 이름 앞에 붙일 접두사 값을 지정합니다. | 선택 | 없음 |
리소스 번들의 개념 이해하기
리소스 번들은 로케일(locale)에 특화된 객체들을 담고 있는 컨테이너입니다. 내부적으로는 키/값(key/value) 쌍 형태로 데이터를 저장합니다. 프로그램이 특정 로케일에 맞는 리소스가 필요할 때, 키는 모든 로케일에서 공통으로 유지하고 값만 로케일별로 번역하여 관리할 수 있습니다. 이러한 방식 덕분에 다국어 지원 웹 애플리케이션을 효율적으로 구축할 수 있습니다.
Java 리소스 번들 파일은 일련의 키-문자열 매핑으로 구성됩니다. 여기서 소개하는 방식은 java.util.ListResourceBundle 클래스를 상속받는 컴파일된 Java 클래스를 생성하는 것입니다. 이 클래스 파일들을 컴파일한 후, 웹 애플리케이션의 클래스패스(classpath)에 포함시켜야 합니다.
기본 리소스 번들 정의하기
먼저 기본(default) 리소스 번들을 다음과 같이 정의해 보겠습니다.
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"},
};
}위 클래스를 컴파일하여 생성된 Example.class 파일을 웹 애플리케이션의 CLASSPATH에 배치합니다. 이제 JSTL 태그를 사용해 세 개의 숫자를 화면에 출력할 수 있습니다.
예제 1: prefix 속성 사용하기
<%@ 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:bundle Tag</title>
</head>
<body>
<fmt:bundle basename = "com.tutorialspoint.Example" prefix = "count.">
<fmt:message key = "one"/><br/>
<fmt:message key = "two"/><br/>
<fmt:message key = "three"/><br/>
</fmt:bundle>
</body>
</html>위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
One Two Three
prefix = "count." 속성 덕분에 각 키에 "count."를 직접 작성하지 않아도 자동으로 접두사가 붙어 번들에서 올바른 값을 찾아오게 됩니다.
예제 2: prefix 없이 전체 키 사용하기
이번에는 prefix 속성 없이 전체 키 이름을 직접 지정하는 방식으로 동일한 예제를 작성해 보겠습니다.
<%@ 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:bundle 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>
</body>
</html>이 코드 역시 동일한 결과를 출력합니다.
One Two Three
정리
<fmt:bundle> 태그와 <fmt:message> 태그를 조합하면 JSP 페이지에서 다국어 메시지를 체계적으로 관리할 수 있습니다. prefix 속성을 활용하면 키 이름의 중복을 줄여 가독성을 높일 수 있으며, 로케일별 리소스 번들 클래스만 추가하면 손쉽게 현지화(localization)를 확장할 수 있습니다.