특별한 일상

[jsp/servlet] JSTL 사용법 : 국제화 태그 <fmt: 본문

IT•개발 끄적/Jsp&Servlet

[jsp/servlet] JSTL 사용법 : 국제화 태그 <fmt:

소다맛사탕 2021. 5. 3. 22:20
반응형

안녕하세요. 소다맛사탕 입니다.

지난 포스팅인 '코어 태그', 'XML 태그'에 이어 오늘은 국제화 태그(fmt) 라이브러리에 대한 사용법을 알아 보겠습니다.

국제화 태그 라이브러리를 사용하려면 앞서서 상단 선언에 이와 같이 선언한다.

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

국제화 태그 라이브러리

특정 지역에 따라서 알맞은 메시지를 출력해주고 싶은 경우에 사용.
기능 분류 태그 설명
로케일 지정(Locale) setLocale Locale을 지정.
requestEncoding 요청 파라미터의 캐릭터 인코딩을 지정.
메시지 처리 bundle 사용할 번들을 지정.
message 지역에 알맞은 메시지를 출력.
setBundle 리소스 번들을 읽어와 특정 변수에 저장.
숫자 및 날짜 포맷팅 formatNumber 숫자를 포맷팅.
formatDate Date 객체를 포맷팅.
parseDate 문자열로 표시된 날짜를 분석해 Date객체로 변환.
parseNumber 문자열로 표시된 날짜를 분석해 숫자로 변환.
setTimeZone 시간대 정보를 특정 변수에 저장.
timeZone 시간대를 지정.

 

 

1. 로케일 지정(Locale)

1-1. <fmt:setLocale>

; 국제화 태그들이 사용할 로케일을 지정한다.

<fmt:setLocale value="ko" scope="request" />
<%--
    헤더값이 'ko'일 경우 한글 메시지를 우선순위로
    'en'일 경우 영문 메시지를 우선순위로 처리.
    value : 국가코드 형식으로 지정
    value 값이 없으면 기본 로케일.
    scope : Locale이 영향을 미치는 범위. 기본값 page
--%>

일반적으로 웹 브라우저가 전송한 Accept-Header의 갑세 따라서 메시지를 출력하기에 거의 쓰지 않는다.

 

1-2. <fmt:requestEncoding> 태그

; 요청 파라미터의 캐릭터 인코딩을 지정한다.

<fmt:requestEncoding value="euc-kr" />
<%--
    request.setCharacterEncoding("euc-kr");
    과 동일
    
    한글 euc-kr
    기본 및 국제(영어) utf-8
--%>

 

2. 메시지 처리

메시지 처리 태그에서 사용할 리소스 번들 파일을 작성해야 한다.
클래스 패스에 위치해야 하기 때문에 웹에서 사용할 메시지 번들 파일은
WEB-INF/classes 또는 WEB-INF/lib에 포함된 jar파일에 포함시키면 된다.
-- WEB-INF/classes/resources/message.properties
TEST1 = this is test1
TEST2 = this is message
TEST3 = this name is {0}

2-1. <fmt:bundle> 태그

; 태그 몸체에서 사용할 리소스 번들을 지정한다.

2-2. <fmt:message>

; 메시지를 출력한다.

 

기본적으로 위의 두 태그가 동시에 쓰이기에 예시를 같이 작성합니다.

<fmt:bundle basename="resources.message">
     <fmt:message key="TEST2" />
</fmt:bundle>

<%--
     this is message 출력
     basename : String 타입. 사용할 리소스 번들의 이름.
     prefix : String 타입. bundle 태그의 내부에서 사용되는
     message 태그의 key 속성의 값 앞에 자동으로 붙게 될 문자열.
--%>
<fmt:bundle basename="resources.error" prefix="SYSTEM_">
     <fmt:message key="001" />
</fmt:bundle>
<fmt:bundle basename="resources.error">
     <fmt:message key="SYSTEM_001" />
</fmt:bundle>

<%-- 출처 : 쌍용강북교육센터 --%>

리소스 번들이 제공하는 메시지 중에서는 message.properties에서 TEST3와 같이

{0}, {1}, {2}와 같이 변경 가능한 요소를 제공하는 메세지도 존재.

<fmt:message key="TEST3">
    <fmt:param value="${name}"/>
</fmt:message>
<%-- 메시지에 n개이상 존재시 --%>
<fmt:message key="TEST3">
    <fmt:param value="${name}"/>
    <fmt:param value="${phone}"/>
    <fmt:param value="${detail}"/>
</fmt:message>
<%-- 
     순서대로
     {0}, {1}, {2}값
--%>

 

2-3. <fmt:setBundle> 태그

; 리소스 번들을 변수로 저장한 후, 어디서나 사용할 수 있도록 함.

<fmt:setBundle var="message" basename="resources.message" />
    ...
<fmt:message bundle=${message}" key="TEST1" />
<%--
    setBundle을 지정하면 message 태그를 사용해
    setBundle에 지정한 번들을 사용할 수 있다.
    basename : String 타입. 읽어올 리소스 번들의 이름.
    var : String 타입. 리소스 번들을 저장할 변수명.
    scope : String 타입. 변수를 저장할 영역.
--%>

 

3. 숫자 및 날짜 포맷팅

3-1. <fmt:formatNumber> 태그

; 숫자를 양식에 맞춰 문자열(String)로 변환해준다.

<fmt:formatNumber value="숫자" [type="값타입"][pattern="패턴"]
     [currentCode="통화코드"][currencySymbol="통화심볼"]
     [groupingUsed="(true|false)"][var="변수명"][scope="영역"] />
---ex>
<c:set var="price" value="10000" />
<fmt:formatNumber value="${price}" type="number" var="valNum" />
통화 : <fmt:formatNumber value="${price}"
           type="currency" currencySymbol="원" />
퍼센트 : <fmt:formatNumber value="${price}"
           type="percent" groupingUsed="false" />
숫자 : ${valNum}
패턴 : <fmt:formatNumber value="${price}" pattern="00000000.00" />
<%-- 출력값 
통화 : 원10,000
퍼센트 : 10000%
숫자 : 10,000
패턴 : 00010000.00
--%>

 

3-2. <fmt:formatDate> 태그

; 날짜 정보를 담고 있는 객체를 포맷팅하여 출력한다.

<fmt:formatDate value="날짜값" [type="값타입"]
     [dateStyle="날짜스타일"][timeStyle="시간스타일"]
     [pattern="패턴"][timeZone="타임존"]
     [var="변수"][scope="영역"] />
<%--
    type : time, date, both 중 한가지 값
    dateStyle : default, short, medium, long, full 중 한가지 값
    timeStyle : default, short, medium, long, full 중 한가지 값
--%>
---ex>
<c:set var="now" value="<%= new Java.util.Date() %>" />
<br>
<fmt:formatDate value="${now}" type="date" dateStyle="full" />
<br>
<fmt:formatDate value="${now}" type="date" dateStyle="short" />
<br>
<fmt:formatDate value="${now}" type="time" /><br>
<fmt:formatDate value="${now}" type="both" 
      dateStyle="full" timeStyle="full" /><br>
<fmt:formatDate value="${now}" type="date" pattern="z a h:mm" />
<%-- 출력값
     2021년 5월 2일 일요일
     21.5.2
     오전 11:01:03
     2021년 5월 2일 일요일 오전 11시 01분 03초 KST
     KST 오전 11:01
--%> 

 

3-3. <fmt:parseDate> 태그

; 문자열로 표시된 날짜 및 시간 값을 데이트 형식으로 파싱해주는 기능을 제공한다.

<fmt:parseDate value="날짜값"
   [type="타입"][dateStyle="날짜스타일][timeStyle="시간스타일"]
   [pattern="패턴"][timeZone="타임존"][parseLocale="로케일"]
   [var="변수"][scope="영역"] />
<%--
    type : time, date, both 중 한가지 값
    dateStyle : default, short, medium, long, full 중 한가지 값
    timeStyle : default, short, medium, long, full 중 한가지 값
--%>
---ex>
<fmt:parseDate value="2010-01-05 11:11:42"
    pattern="yyyy-MM-dd HH:mm:ss" var="date" />
${date}
<%-- 출력값
     2010-01-05 11:11:42
--%>

 

3-4. <fmt:parseNumber> 태그

; 문자열을 숫자로 변환해준다.

<fmt:parseNumber value="값" [type="값타입"][pattern="패턴"]
     [parseLocale="통화코드"][integerOnly="true|false"]
     [var="변수명"][scope="영역"] />
---ex>
<fmt:parseNumber value="1,234.56" pattern="0,000.00" var="num" />
${num}
<%-- 출력값
123456
--%>

 

3-5. <fmt:setTimeZone> 태그

; 시간대별로 시간을 처리할 수 있는 기능을 제공한다.

3-6. <fmt:timeZone> 태그

; 마찬가지다...

 

기본적으로 timezone 태그는 비슷한 기능이고 사용법도 같기에 예시를 같이 작성한다.

<fmt:timeZone value="HongKong">
   <fmt:formatDate ... /> <%-- 사용하는 시간을 홍콩에 맞춤--%>
</fmt:timeZone>
---ex>
<c:set var="now" value="<%= new Java.util.Date() %>" />
<fmt:timeZone value="HongKong">
<fmt:formatDate value="${now}" typ="both"
     dateStyle="full" timeStyle="full" />
</fmt:timeZone>
<%-- 출력값
     2021 5월 2일 일요일 오후 1시 10분 10초 KST
     2021 5월 2일 일요일 오후 12시 10분 10초 HKT
--%>

 

 

국제화 태그 fmt 중 가장 많이 쓰는건 아무래도 String 포맷팅 또는 number 포맷팅이기에

API 문서를 통해 더 자세하게 알아봤으면 좋겠습니다.

docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/fmt/tld-summary.html

 

JSTL fmt (TLDDoc Generated Documentation)

parseNumber Parses the string representation of a number, currency, or percentage

docs.oracle.com

Comments