ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][JSP] JSTL(표준 태그 라이브러리) 2부 - fmt Tag (국제화 태그)
    JSP 2020. 3. 22. 19:57

    1. JSTL의 국제화 태그 

     국제화 태그는 특정 지역에 따라서 적절한 메시지를 출력하고 싶은 경우 사용합니다. 한글 브라우저에서는 한글 메시지를 출력하고, 영문 브라우저에서는 영문 메시지를 출력할 때를 말합니다. 국제화 태그는 하나의 JSP 페이지에서 다양한 언어를 지원할 수 있도록 해주는 태그입니다. 국제화 태그 라이브러리의 목록은 아래와 같습니다. 

    기능 태그 설명
    Locale 지정 setLocale Locale을 지정
    requestEncoding 요청 파라미터의 캐릭터 인코딩 지정
    Message 처리

    bundle 사용할 Bundle 지정
    message 지역에 맞는 메시지 출력
    setBunble 리소스 Bundle을 읽어와 특정 변수에 저장
    숫자 및 날짜 포멧팅

    formatNumber 숫자를 포맷팅
    formatDate Date 객체를 포맷팅
    parseDate 문자열로 표시된 날짜를 분석해 Date 객체로 변환
    parseNumber 문자열로 표시된 날짜를 분석해 숫자로 변환
    setTimeZone 시간대 정보를 특정 변수에 저장
    timeZone 시간대 지정

     

     

    2. 국제화 태그 라이브러리 - Locale 지정 태그

     국제화 태그 라이브러리의 Locale 지정 태그는 아래의 두 가지 종류의 태그가 존재합니다. 

    • <fmt:setLocale> - 국제화 태그에서 사용할 Locale을 지정한다.
    • <fmt:requestEncoding> - 요청 파라미터의 캐릭터 인코딩을 지정한다.

    웹 브라우저는 Accept-Language 헤더라는 것을 사용해서 수용 가능한 언어 목록을 전송합니다. 이때 JSTL의 국제화 태그는 이 헤더의 값을 사용해 언어별로 적절한 처리를 하게되는 것입니다. 이해를 돕기위해 예를 들면, 차후 설명할 message 태그는 Accept-Language 헤터의 값이 ko 일 경우 한글 메시지를 우선 순위로 출력합니다. 

     

    2-1. <fmt:setLocale> 태그

    <fmt:setLocale> 태그는 국제화 태그가 Accept-Language 헤더에서 지정한 언어가 아닌 다른 언어를 사용하도록 지정하는 기능을 제공합니다. 사용방법은 아래와 같습니다. 

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <fmt:setLocale value="en" scope="request" />

    국제화 태그 라이브러리를 사용하기 위해서는 다른 태그 라이브러리를 사용할 때와 마찬가지로 JSP 페이지에 taglib 디렉티브를 추가해줘야 합니다. prefix 속성에 국제화 태그 라이브러리를 호출할 때 사용할 접두어로 fmt를 지정해주었습니다. 이 접두어는 정해진 것은 아니기 때문에 반드시 fmt로 지정하지 않아도 됩니다. 

     

    <fmt:setLocale> 태그의 value 속성에는 Locale을 '언어코드-국가코드'형식으로 지정합니다. 언어코드는 반드시 지정을 해주어야 하며, 국가 코드는 선택사항입니다. 이때 언어코드와 국가코드는 '-'이나 '_'로 구분해야합니다. value의 값이 지정되지 않았을 때의 Default 값은 기본 Locale입니다. 기본 Locale은 web.xml 파일에서 설정한 Locale이나 JVM의 기본 Locale입니다. 

     

    <fmt:setLocale> 태그의 scope 속성은 지정한 Locale이 영향을 미치는 범위를 지정하며, Default 값은 page 영역입니다. 

     

     위에서 주저리주저리 설명은 했지만 웹 브라우저가 전송한 Accept-Language 헤더의 값에 따라서 메시지를 출력하기 때문에 <fmt:setLocale> 태그는 일반적으로 잘 사용되지 않습니다. 

     

     

     

    2-2. <fmt:requestEncoding> 태그

    <fmt:requestEncoding> 태그는 요청 파라미터의 캐릭터 인코딩을 지정하는 태그입니다. 사용방법은 아래와 같습니다.

    <fmt:requestEncoding value="utf-8" />

    위의 태그는 요청 파라미터의 인코딩을 utf-8 로 지정하는 사용 예입니다. 위 태그는 아래의 코드와 동일한 기능을 수행합니다. 

    <%
    	request.setCharacterEncoding("utf-8");
    %>

     

     

     

    3. 국제화 태그 라이브러리 - Message 처리 태그

    Message 처리 태그에는 아래의 세 가지 종류의 태그가 존재합니다. 

    • <fmt:bundle> - 태그 몸체에서 사용할 리소스 Bundle을 지정한다.
    • <fmt:message> - Message를 출력한다.
    • <fmt:setBundle> - 특정 Message Bundle을 사용할 수 있도록 로딩한다.

    Message 처리 태그를 설명하기에 앞서, 설명을 위한 리소스 Bundle 파일을 아래와 같이 작성해 주겠습니다. 

     

    WEB-INF/classes/resource/message.properties

    TITLE = MESSAGE TAG
    NAME = NAME is {0}.
    AGE = Age is {1}.

    리소스 Bundle 파일은 이클립스에서 진행할 경우 프로젝트의 src 디렉터리에 resource 패키지를 생성한 뒤 resource 패키지에 리소스 Bundle 파일을 넣어주면 됩니다. 

     

    Java의 리소스 Bundle은 java.util.Properties 클래스에 정의된 방법으로 파일을 읽어오고, 이 클래스는 영문, 숫자, 라틴문자 등을 제외한 나머지 문자에 대해서는 유니코드에서의 코드값으로 변경해 표현하도록 하고 있습니다. 그렇기 때문에 리소스 번들에서는 한글을 직접 사용할 수 없습니다. 그렇기 때문에 한글을 유니코드 숫자로 표시한 형태로 변환해 줘야합니다. 변환은 JDK에서 제공하는 native2ascii.exe 파일을 사용해서 할 수 있습니다.

     

    Message 처리 태그는 <fmt:bundle>태그와 <fmt:Message>태그, 그리고 <fmt:setBundle> 태그와 <fmt:Message>태그로 나눠서 설명하겠습니다.  

     

     

     

    3-1. <fmt:bundle> 태그와 <fmt:Message> 태그

    3-1-1. <fmt:bundle> 태그

    <fmt:bundle>태그는 사용할 Message Bundle을 지정하며 아래와 같은 방법으로 사용할 수 있습니다. 

    <fmt:bundle basename="resource.message">
    . . .
    	<fmt:message key="ANIMAL_NAME">
    . . .
    </fmt:bundle>

    <fmt:bundle> 태그에는 basename 속성과, 위에서 사용하지는 않았지만 prefix 라는 속성이 있습니다.

     

    <fmt:bundle> 태그의 basename 속성에는 사용할 리소스 Bundle의 이름이 String 타입으로 올 수 있으며, 표현식 및 EL(표현언어)을 사용 가능합니다. 

     

    <fmt:bundle> 태그의 prefix 속성에는 <fmt:bundle>태그내부에서 사용되는 <fmt:message> 태그의 key 속성 값의 앞에 자동으로 붙게 될 문자열을 지정합니다. prefix 속성도 basename 속성과 마찬가지로 표현식 및 EL의 사용이 가능합니다.

     

    prefix 속성을 사용했을 때의 예제는 아래와 같으며, 아래의 코드와 <fmt:bundle> 태그를 설명하기 위해 보였던 위의 코드는 동일한 결과를 출력합니다.

    <fmt:bundle basename="resource.message" prefix="ANIMAL_">
    . . .
    	<fmt:message key="NAME">
    . . .
    </fmt:bundle>

     

    3-1-2. <fmt:message> 태그

    <fmt:message> 태그는 지정한 리소스 Bundle로부터 메시지를 읽어와 출력하는 기능을 합니다. <fmt:message> 태그의 속성은 아래와 같습니다. 

    • key - 읽어올 메시지의 Key값.
    • var - 메시지를 저장할 변수.
    • scope - 변수가 저장되는 영역.
    • bundle - <fmt:bundle> 태그를 사용해서 로딩한 Bundle로부터 메시지를 읽어올 때 사용.

    <fmt:message> 태그의 var 속성을 지정해주면 <fmt:message> 태그는 메시지를 출력하지 않고 var 속성에 지정한 변수에 메시지를 저장하게 됩니다. 

     

    <fmt:message> 태그의 bundle 속성은 <fmt:setBundle> 태그를 사용해서 생성한 Bundle로부터 메시지를 읽어올 때 사용합니다. 

     

     리소스 Bundle에서 제공하는 메시지 중에서는 {0}, {1}과 같은 변경 가능한 요소가 있을 수 있습니다. 위에서 설명할 때 생성했던 message.properties 파일을 확인해보면 {0}과 {1}이 존재하는 것을 확인할 수 있습니다. 

     {0}과 {1} 부분에 값을 지정하기 위해서는 <fmt:message> 태그의 내부에서 <fmt:param>태그를 사용합니다. <fmt:param> 태그를 사용한 예는 아래와 같습니다. 

    <fmt:message key="ANIMAL">
    	<fmt:param value="${name}"/>
        	<fmt:param value="${age}"/>
    </fmt:message>

     위의 경우 ${name}의 값이 {0} 부분에 들어가고, {1} 부분에 ${age}의 값이 들어가게 됩니다. 시작 번호는 배열과 동일하게 0부터 시작합니다. 

     

    <fmt:bundle> 태그와 <fmt:Message> 태그를 사용한 예제 코드

    <%@ page contentType = "text/html; charset=utf-8" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <fmt:bundle basename="resource.message">
    <fmt:message key="TITLE" var="title"/>
    <html>
    <head><title>${title}</title></head>
    <body>
    
    <fmt:message key="NAME" />
    <br>
    <c:if test="${! empty param.age}">
    <fmt:message key="AGE">
    	<fmt:param value="${param.age}" />
    </fmt:message>
    </c:if>
    
    </body>
    </html>
    </fmt:bundle>
    

     

    3-2. <fmt:setBundle> 태그와 <fmt:Message> 태그

    <fmt:bundle> 태그가 태그 안에서 사용될 리소스 Bundle을 지정했다면, <fmt:setBundle> 태그는 리소스 Bundle을 변수로 저장한 후에 어디서나 사용할 수 있도록 하는 기능을 제공합니다. <fmt:setBundle> 태그의 사용 방법은 아래와 같습니다. 

    <fmt:setBundle ver="message" basename="resource.message" />
    . . .
    <fmt:message bundle="${message}" key="NAME"/>

    <fmt:setBundle> 태그에서 리소스 Bundle을 지정하고, <fmt:message> 태그에서 bundle 속성을 사용해 <fmt:setBundle>태그에서 지정한 리소스 번들을 사용할 수 있게되는 것입니다. 

     

    <fmt:setBundle> 태그의 속성은 아래와 같습니다.

    • basename - 읽어올 리소스 Bundle 이름
    • var - 리소스 Bundle을 저장할 변수
    • scope - 변수를 저장할 영역

    <fmt:setbundle> 태그와 <fmt:Message> 태그를 사용한 예제 코드

    <%@ page contentType = "text/html; charset=utf-8" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <fmt:setBundle var="message" basename="resource.message" />
    
    <fmt:message bundle="${message}" key="TITLE" var="title"/>
    <html>
    <head><title>${title}</title></head>
    <body>
    
    <fmt:message bundle="${message}" key="NAME" />
    <br>
    <c:if test="${! empty param.age}">
    <fmt:message bundle="${message}" key="AGE">
        <fmt:param value="${param.age}" />
    </fmt:message>
    </c:if>
    
    </body>
    </html>
    

     

     

     

    4. 국제화 태그 라이브러리 - 숫자 및 날짜 포맷팅 처리 태그

    숫자 및 날짜 포맷팅 처리 태그에는 위에서 설명했듯이 총 6가지의 태그가 존재합니다. 그 목록은 아래와 같습니다. 

    • <fmt:formatNumber>
    • <fmt:parseNumber>
    • <fmt:formatDate>
    • <fmt:parseDate>
    • <fmt:setTimeZone>
    • <fmt:timeZone>

     

    4-1. <fmt:formatNumber> 태그

    <fmt:formatNumber> 태그는 숫자를 양식에 맞춰서 문자열로 변환하는 기능을 제공합니다. 사용방법은 아래와 같습니다. 

    <fmt:formatNumber value="숫자" [type="타입"] [pattern="패턴"] 
    	[currencyCode="통화코드"] [currencySymbol="통화심볼"] 
    	[groupingUsed="true or false"] [var="변수"] [scope="영역"]/>

    <fmt:formatNumber> 태그의 var 속성과 scope 속성을 제외한 속성에는 표현식 및 EL을 사용할 수 있으며, 속성에 대한 설명은 아래의 표를 참고하시길 바랍니다. 

    속성 지정가능 타입 설명
    value String or Number 출력할 양식에 맞는 숫자.
    type String 출력할 양식을 지정. ex) number, percent, currency
    pattern String 직접 숫자가 출력되는 양식을 지정. java.text.DecimalFormat 클래스에 정의되어 있는 패턴을 사용한다.
    currencyCode String 통화 코드 지정. type 속성이 currency일 때만 사용. ex) '원'화 = KRW
    currencySymbol String 통화 코드를 표현할 때 사용할 기호를 표시. type 속성이 currency일 때만 사용.
    groupingUsed boolean 단위를 구분할 때 사용되는 기호를 사용할지에 대한 여부를 결정. true일 경우 10000은 10,000과 같이 구분 기호가 사용된다. Default 값은 true. 
    var String 포맷팅한 결과를 저장할 변수. 저장되는 변수의 타입은 String 형이다. 만약 var 속성을 사용하지 않는다면 바로 출력된다. 표현식 및 EL 사용불가.
    scope String 변수를 저장할 영역. Default 값은 page 영역. 표현식 및 EL 사용불가.

     

    <fmt:formatNumber> 태그 사용 예제 코드

    <%@ page contentType = "text/html; charset=utf-8" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head><title>formatNumber Tag</title></head>
    <body>
    
    <c:set var="price" value="10000" />
    <fmt:formatNumber value="${price}" type="number" var="numberType" />
    <br/>
    Currency : <fmt:formatNumber value="${price}" 
                type="currency" currencySymbol="원" />
    <br/>
    Percent: <fmt:formatNumber value="${price}" 
                type="percent" groupingUsed="false" />
    <br/>
    Number: ${numberType}
    <br/>
    Pattern: <fmt:formatNumber value="${price}" pattern="00000000.00"/>
    </body>
    </html>
    

     

     

     

    4-2. <fmt:parseNumber> 태그

    <fmt:parseNumber> 태그는 <fmt:formatNumber> 태그와 반대로, 문자열을 숫자로 변환하는 기능을 제공합니다. 사용 방법은 아래와 같습니다. 

    <fmt:parseNumber value="값" [type="타입"] [pattern="패턴"] 
    [parseLocale="Locale"] [integerOnly="true or false"] [var="변수"] [scope="영역"] />
    <fmt:parseNumber value="1,000.12" pattern="0,000.00" var="num" />
    ${num}
    속성 지정가능 타입 설명
    value String 파싱할 문자열.
    type String

    value 속성의 문자열 타입을 지정. Default 값은 number.

    ex) number, currency, percentage 

    pattern String 파싱할 때 사용할 양식 지정.
    parseLocale

    String,

    java.util.Locale

    파싱할 때 사용할 Locale 지정.

    integerOnly boolean 정수 부분만 파싱할 때는 true. Default 값은 false.
    var String 파싱한 결과를 저장할 변수. 표현식 및 EL 사용불가.
    scope String 변수를 저장할 영역. Default 값은 page 영역. 표현식 및 EL 사용불가.

     

     

    4-3. <fmt:formatDate> 태그

    <fmt:formatDate> 태그는 날짜 정보를 담고 있는 객체를 포맷팅하여 출력할 때 사용합니다. 사용방법은 아래와 같습니다. 

    <fmt:formatDate value="날짜" [type="타입"] [dateStyle="날짜스타일"] [timeStyle="시간스타일"] 
    	[pattern="패턴"] [timeZone="타임존"] [var="변수"] [scope="영역"]/>

    <fmt:formatDate> 태그의 var 속성과 scope 속성을 제외한 속성에는 표현식 및 EL을 사용할 수 있으며, 속성에 대한 설명은 아래의 표를 참고하시길 바랍니다. 

    속성 지정가능 타입 설명
    value java.util.Date 포맷팅할 날짜 및 시간 지정.
    type String

    날짜, 시간의 포맷팅 여부를 지정. Default 값은 date.

    ex) date, time, both

    dateStyle String

    날짜에 대래 미리 정의되 포맷팅 스타일을 지정. Default 값은 default.

    ex) default, short, medium, long, full

    timeStyle String

    시간에 대래 미리 정의되 포맷팅 스타일을 지정. Default 값은 default.

    ex) default, short, medium, long, full

    pattern String 직접 파싱할 때 사용할 양식을 지정. java.util.DateFormat 클래스에 있는 양식을 사용.
    timeZone

    String, 

    java.util.TimeZone

    시간대를 변경하고자 할 때 사용.

    <fmt:setTimeZone> 태그에서 생성한 TimeZone 객체를 사용.

    var String 파싱한 결과를 저장할 변수. 저장되는 변수의 타입은 String 형이다. 만약 var 속성을 사용하지 않는다면 바로 출력된다. 표현식 및 EL 사용불가.
    scope String 변수를 저장할 영역. Default 값은 page 영역. 표현식 및 EL 사용불가.

     

    <fmt:formatDate> 태그 사용 예제 코드

    <%@ page contentType = "text/html; charset=utf-8" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head><title>formatNumber Tag</title></head>
    <body>
    
    <c:set var="price" value="10000" />
    <fmt:formatNumber value="${price}" type="number" var="numberType" />
    <br/>
    Currency : <fmt:formatNumber value="${price}" 
                type="currency" currencySymbol="원" />
    <br/>
    Percent: <fmt:formatNumber value="${price}" 
                type="percent" groupingUsed="false" />
    <br/>
    Number: ${numberType}
    <br/>
    Pattern: <fmt:formatNumber value="${price}" pattern="00000000.00"/>
    </body>
    </html>
    

     

     

    4-4. <fmt:parseDate> 태그

    <fmt:parseDate> 태그는 문자열로 표시된 날짜 및 시간을 Date로 파싱해주는 기능을 제공합니다. 사용 방법은 아래와 같습니다. 

    <fmt:parseDate value="날짜" [type="타입"] [dateStyle="날짜스타일"] [timeStyle="시간스타일"] 
    	[pattern="패턴"] [timeZone="타임존"] [parseLocale="Locale"] [var="변수"] [scope="영역"]/>
    <fmt:parseDate value="2020-03-23 20:00:30" pattern="yyyy-MM-dd HH:mm:ss" var="date" />
    ${date}
    속성 지정가능 타입 설명
    value String 파싱할 문자열.
    type String

    날짜, 시간의 포맷팅 여부를 지정. Default 값은 date.

    ex) date, time, both

    dateStyle String

    날짜에 대래 미리 정의되 포맷팅 스타일을 지정. Default 값은 default.

    ex) default, short, medium, long, full

    timeStyle String

    시간에 대래 미리 정의되 포맷팅 스타일을 지정. Default 값은 default.

    ex) default, short, medium, long, full

    pattern String 파싱할 때 사용할 양식 지정.
    timeZone

    String, 

    java.util.TimeZone

    시간대를 변경하고자 할 때 사용.

    <fmt:setTimeZone> 태그에서 생성한 TimeZone 객체를 사용.

    parseLocale

    String,

    java.util.Locale

    파싱할 때 사용할 Locale 지정.

    var String 파싱한 결과를 저장할 변수. 표현식 및 EL 사용불가.
    scope String 변수를 저장할 영역. Default 값은 page 영역. 표현식 및 EL 사용불가.

     

     

     

    4-5. <fmt:timeZone> 태그 & <fmt:setTimeZone> 태그

     JSTL의 포맷팅 기능을하는 국제화 태그에는 시간대별로 시간을 처리할 수 있는 기능을 제공합니다. 그 태그가 바로 <fmt:timeZone> 태그와 <fmt:setTimeZone> 태그입니다. 

     

    4-5-1. <fmt:timeZone> 태그

    <fmt:timeZone> 태그는 value 라는 속성에 시간대를 지정하면 <fmt:timeZone> 태그 내에서만 영향을 주게됩니다. value 속성에는 String이나 TimeZone 객체가 지정될 수 있습니다. 사용방법은 아래와 같습니다. 

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head><title>timeZone</title></head>
    <body>
    
    <c:set var="now" value="<%= new java.util.Date() %>" />
    
    <fmt:formatDate value="${now}" type="both" 
                    dateStyle="full" timeStyle="full" />
    
    <br>
    <fmt:timeZone value="Hongkong">
    <fmt:formatDate value="${now}" type="both" 
                    dateStyle="full" timeStyle="full" />
    </fmt:timeZone>
    
    </body>
    </html>
    

     

    4-5-2. <fmt:setTimeZone> 태그

    <fmt:setTimeZone> 태그는 value 라는 속성에 시간대를 지정하면 태그 내에서만 영향을 주는 <fmt:timeZone> 태그와 달리, <fmt:setTimeZone> 태그를 사용한 이후 TimeZone이 변경됩니다. value 속성에는 String이나 TimeZone 객체가 지정될 수 있습니다. 사용방법은 아래와 같습니다.

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head><title>setTimeZone</title></head>
    <body>
    
    <c:set var="now" value="<%= new java.util.Date() %>" />
    
    <fmt:formatDate value="${now}" type="both" 
                    dateStyle="full" timeStyle="full" />
    
    <br>
    <fmt:setTimeZone value="Hongkong"/>
    <fmt:formatDate value="${now}" type="both" 
                    dateStyle="full" timeStyle="full" />
    
    </body>
    </html>
    

     

    댓글

Camel`s Tistory.