01. 다국어 처리의 개요
다국어 처리는 웹 브라우저를 사용하는 국가에 따라 다양한 언어 및 지역을 지원하는 서비스를 말한다. 즉 다른 언어와 지역적 차이를 기술 변경 없이 소프트웨어에 바로 적용하는 것이다. 예전에는 국제적인 환경에서 서비스될 웹 사이트를 구축할 ㅒㄸ 국가별로 페이지를 만들어야 했다. 이렇게 국가별 언어로 변형하여 웹 사이트를 제작하고 유지 관리하는 일은 시간이 오래 걸리고 어렵다.
하지만 jsp 페이지에 JSTL 의 FMT 태그를 이용하면 언어별로 페이지를 따로 만들 필요 없이 아주 간단하게 다국어를 지원할 수 있다. 다국어는 다양한 언어와 지역에 적용 될 수 있도록 하는 국제화(internationalization,i18n)와 언어별 구성 요소를 추가하여 특정 지역의 언어나 문화에 맞추는 지역화(localization.L10n)를 포함한다.
NOTE_i18n 과 L10n의 의미
국제화를 I18n 또는i18n으로 표기하고 지역화를 L10N 또는l10n으로 표기하기도 한다. 이는 internationalization 과 localization 의 첫 글자와 마지막 글자를 제외한 나머지 글자를 그 수로 표현한 것이다.
1.1 지역화
지역화(localization)는 사용 국가별 환경에서 특정 언어와 지역에 맞게 적합화하는 것으로 줄여서 L10n으로 표기하기도 한다. 지역화에 주로 고려되는 사항은 다음과 같다
- 숫자, 날짜,시간의 형식
- 화폐의 표시
- 키보드의 지원
- 문자열의 순서와 정렬
- 심벌, 아이콘, 색상
- 문화에 따라 오해의 소지가 있거나 의미가 없는 문자, 그림
- 지역별 법률의 차이
1.2국제화
국제화(internationalization)는 여러 국가에서 사용할 수 있도록 다국어를 지원하는 것으로, 줄여서 i18n으로 표기하기도 한다. 국제화는 어느 국가에서나 사용할 수 있게 하는 지역화 기능을 포함한다. 국제화는 주로 다음과 같은 처리를 포함하여 지원해야 한다.
- 국제화 지원은 유니코드의 사용이나 기존의 인코딩을 적절히 처리하고 사용자 인터페이스에 표시할 문자열에는 문자코드가 포함되지 않도록 설계 및 개발해야 한다.
- 국제화를 처리하는 정보에 언어 정보를 포함하거나, 세로쓰기/가로쓰기/ 우측에서 좌측으로의 가로쓰기 등 언어의 특성을 반영하는 처리 등을 지원해야 한다.
- 날짜와 시간표시, 지역 달력, 숫자표시, 리스트의 정렬과 표시, 인명이나 주소의 처리 등 언어의 특성(언어적, 지역적, 문화적 특성 등)에 대한 사용자 설정을 지원해야 한다
- 국제화는 사용자의 요청이나 설정에 따라 필요시 사용되도록 지역화 정보를 코드와 분리해야 한다.
02. Locale 클래스를 이용한 다국어 처리
Locale 클래스는 특정 지리적, 정치적, 문화적 지역을 나타내는 클래스로, 사용자의 지역 환경에 따라 결정되는 지역적 문화(언어, 날짜 ,시간 등)의 정보를 담고 있다. 예를 들어 웹 페이지에 보이는 메시ㅣ지가 여러 가지 언어로 주어졌을 때 사용자가 어떤 언어로 출력할 것인지 결정 할수있게하는 수단이 바로 Locale 클래스이다. Locale 클래스는 단순한 메시지 뿐 아니라 숫자, 날짜, 시간 등을 표현하는 데 사용한다
Locale 객체의 생성은 request 내장 객체를 이용하여 현재 웹 브라우저에 미리 정의된 언어나 국가 정보를 가져오는 방법으로 형식은 다음과 같다. Locale 클래스를 사용하려면 jsp 페이지에 page 디렉티브 태그의 import 속성으로 패키지 java.util.Locale을 설정해야한다.
java.util.Locale request.getLocale();
//인스턴스화 방법
Locale locale = new Locale("ko","KR");
//미리 정의된 필드 값을 사용하는 방법
Locale locale = Locale.KOREA;
2.1 로케일 감지하기
사용자가 웹 브라우저를 사용할 때는 웹 브라우저에 설정된 국가와 언어 이름을 통해 해당 국가의 언어로 볼 수 있다. 이처럼 웹 브라우저에 설정된 국가와 언어 이름을 알아내는 것을 로케일 감지라고 한다. 다음의 메소드를 이용하면 웹 브라우저에 설정된 국가나 언어 정보를 얻어올 수 있다.
로케일 감지 메소드의 종류
메소드 | 반환 유형 | 설명 |
getDefault() | static Locale | 디폴트 로케일의 현재 값을 가져온다 |
getCountry() | String | 현재 로케일의 국가/지역 코드(대문자)를 가져온다 |
getDisplatCountry() | String | 현재 로케일의 국가 이름을 가져온다 |
getLanguage() | String | 현재 로케일의 언어 코드 (소문자)를 가져온다 |
getDisplayLanguage() | String | 현재 로케일의 언어 이름을 얻어온다 |
다음은 웹 브라우저에서 jsp 페이지 요청 시 현재 로케일의 언어 및 국가를 표시하는 예이다.
[로케일 감지 메소드 사용 예]
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.Locale"%>
<%
Locale locale = request.getLocale();
String displayLanguage = locale.getDisplayLanguage();
String language = locale.getLanguage();
String displayCountry = locale.getDisplayCountry();
String country = locale.getCountry();
%>
<html>
<head>
<title>Localization</title>
</head>
<body>
<%
out.println("로케일 언어 : "+displayLanguage +"<br/>");
out.println("로케일 언어 코드 : " +language + "<br />");
out.println("로케일 국가 : " + displayCountry + " <br />");
out.println("로케일 국가 코드 : " +country+"<br/>");
%>
</body>
</html>
2.2 ㅣ로케일 표현하기
언어설정
다양한 국가별 언어를 제대로 표현하기 위해 response 내장 객체의 setHeader()메소드를 사용한다. 이 메소드에 Content-Sanguage 헤더 값을 언어 코드로 설정하고 HTML 엔티티 코드나 이름을 사용하면 모든 특수문자를 출력할 수 있다.
다음은 스페인어를 출력하는 예이다. response 내장 객체의 setHeader()메소드를 이용하여 Content-Language 헤더 값에 스페인어 코드 es 설정한다. 그리고 스페인어의 ñ, ¡ ,같은 특수문자를 출력하기 위해 HTML 엔티티의 이름을 사용한다.
[로케일 언어 설정의 예]
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.Locale"%>
<%
response.setContentType("text.html");
response.setHeader("Content-Language","es");
String title = "Español";
%>
<html>
<head>
<title>
<% out.print(title); %>
</title>
</head>
<body>
<p>Idioma : Español</p>
<p>¡Hola Mundo!</p>
</body>
</html>
날짜와 시간 설정
사용자의 로케일에 따라 특정 날짜와 시간 형식을 표현하기 위해 DateFomat 클래스의 getDateTimeInstance()메소드를 사용한다. DateFomat 클래스를 사용하려면 jsp 페이지에 page디렉티브 태그의 import 속성으로 패키지 java.text.DateFomat 을 설정해야 한다.
다음은 웹 브라우저에 설정된 로케일의 특정 날짜와 시간 형식을 출력하는 예이다
[로케일의 날짜와 시간 설정 예]
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.Locale,java.util.Date" %>
<%@ page import="java.text.DateFormat" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<%
Locale locale = request.getLocale();
String date = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.SHORT, locale).format(new Date());
%>
<p>로케일의 날짜 형식
<p> <%out.print(date); %>
</body>
</html>
통화와 숫자 설정
사용자의 로케일에 따라 특정 통화와 숫자를 표현하기 위해 NumberFormat 클래스의 getCurrencyInstance()메소드를 사용한다. 또한 특정 비율을 표현하는 데에는 getPercentInstance()메소드를 사용한다. NumberFormat 클래스를 사용하려면 jsp 페이지에 page 디렉티브 태그의 import 속성으로 패키지 java.text.NumberFormat 을 설정해야 한다.
다음은 웹 브라우저에 설정된 로케일의 특정 통화와 숫자 형식을 출력하는 예이다
[로케일의 통화와 숫자 설정 예]
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.Locale,java.util.Date" %>
<%@ page import="java.text.NumberFormat" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<%
Locale locale = request.getLocale();
NumberFormat curency = NumberFormat.getCurrencyInstance(locale);
NumberFormat percentage = NumberFormat.getPercentInstance(locale);
String fcurency = curency.format(1234567);
String fpercentage = percentage.format(0.25);
%>
<p>로케일의 통화 형식 : <% out.print(fcurency); %>
<p>로케일의 비율 형식 : <% out.print(fpercentage); %>
</body>
</html>
=사용자의 로케일에 따라 국가, 날짜, 통화 형식 출력하기=
/cho9/locale01.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.text.NumberFormat" %>
<%@ page import="java.text.DateFormat" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<h3>현재 로케일의 국가, 날짜, 통화</h3>
<%
Locale locale = request.getLocale();
Date currentDate = new Date();
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL, locale);
NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
%>
<p> 국가 : <%= locale.getDisplayCountry() %>
<p> 날짜 : <%= dateFormat.format(currentDate)%>
<p> 숫자 (12345.67) :<%=numberFormat.format(12345.67)%>
</body>
</html>
03. JSTL fmt 태그를 이용한 다국어 처리
JSTL fmt 태그는 다국어 문서 처리를 위한 국제화 및 지역화 태그이다. 날짜와 숫자등을 형식화하는 기능을 제공하는 JSTL 라이브러리인 JSTL fmt 태그는 특정 지역에 따라 다른 메시지를 출력할 때 사용한다. 예를 들면 한글 웹 브라우저는 한글 메시지를 출력할때 , 영문 웹 브라우저는 영어 메시지를 축력할 때 유용하다.
이와 같이 JSTL fmt 태그는 중복 작업을 없애고 하나의 jsp 페이지에서 다양한 언어에 맞는 메시지를 출력하게 한다. JSTL fmt 태그 라이브러리를 사용하려면 다음과 같이 jsp 페이지에 taglib 디렉티브 태그로 서식 라이브러리를 포함해얗 ㅏㄴ다. 또한 JSTL 라이브러리인 jstl.jar 파일이 필요하다
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
여기서 uri속성은 사용자가 정의한 태그의 설정 정보가 담긴 경로 주소이다. prefix 속성은 uri 에 설정한 주소를 사용자가 정의한 태그로 식별하는 데 쓰이는 고유 이름이다. uri 속성 값을 그대로 사용하면 복잡하므로 prefix 속성 값이 대신 식별할 수 있게 해주는 것이다.
- 배포 사이트 : https://mvnrepository.com/
- 다운로드 파일 : jstl-1.2.jar
JSTL fmt 태그의 종류
구분 | 태그유형 | 설명 |
Locale 설정 | setLocale | 로케일을 설정한다 |
requestEncoding | 요청 파라미터의 문자 인코딩을 설정한다 | |
메시지 처리 | bundle | 사용할 리소스번들을 설정한다 |
message | 리소스번들에서 로케일에 맞는 메시지를 가져와 출력한다 | |
setBundle | 리소스번들을 읽어와 특정 변수에 저장한다 |
날짜 | formatDate | 날짜 형식을 표현한다 |
parseDate | 문자열에서 원하는 패턴의 날짜 형식으로 변환한다 | |
숫자 | parseNumber | 문자열에서 원하는 패턴의 숫자 형식으로 변환한다 |
formatNumber | 숫자 형식을 표현한다 | |
시간 | setTimeZone | 특정 범위의 시간대를 설정한다 |
timeZone | 시간대를 설정한다 |
JSTL 라이브러리 JSTL-1.1 버전 설치 링크
https://archive.apache.org/dist/jakarta/taglibs/standard
Index of /dist/jakarta/taglibs/standard/source
archive.apache.org
들어가서 jakarta-taglibs-standard-1.1.2.zip 파일을 다운로드 받는다
압축을 풀고 lib 폴더에 있는 jstl.jar , standard.jar 파일을 찾아서 /Webcontet/WEB-INF/lib 폴더에 넣는다.
3.1 로케일 설정 태그의 기능과 사용법
setLocale 태그
setLocale 태그는 국제화 태그가 사용할 로케일을 설정하는 태그로 형식은 다음과 같다. setLocale 태그는 다국어를 지원하는 웹 페이지를 만들 때 리소스번들(ResourceBundle)인 *.properties 파일과 연계하여 사용한다.
<fmtLsetLocale
vale="언어 코드[_국가 코드]"
[scope="{page|request|session|application}"]/> //기본 값은 page
value 속성 값에서 언어코드는 두 글자로 된 수문자로서 필수이고, 국가코드는 두 글자로 된 대문자로서 추가로 설정한다. 언어코드와 국가코드를 모두 설정하려면 붙임표(-)나 밑줄(_)로 구분해야 한다. scope 속성 값으로 page,request,session, application 중 하나를 설정하거나 생략할 수 있는데, 생략하면 기분 값인 page 로 설정된다
다음은 setLocale 태그에 언어코드를 한국어, 일본어, 스페인어 등으로 설정할 때마다 변경된 로베일 값을 가져와 출력하는 예이다
[setLocale 태그 사용 예]
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<%=response.getLocale() %>
<fmt:setLocale value="ko"/>
<p><%=response.getLocale() %>
<fmt:setLocale value="ja"/>
<p><%=response.getLocale() %>
<fmt:setLocale value="en"/>
<p><%=response.getLocale() %>
</body>
</html>
requestEncoding 태그
requestEncoding 태그는 요청 파라미터의 문자 인코딩을 설정하는 태그로 형식은 다음과 같다. 이 태그는 request 내장 객체의 setCharacterEncoding()메소드와 동일한 역할을 한다
<fmt:requestEncoding value="문자 인코딩"/>
다음은 requestEncoding 태그에 요청 파라미터의 문자 인코딩을 euc-kr 로 설정하는 예이다
[requestEncoding 태그 사용 예]
<%@ page contentType="text/html; charset=euc-kr" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<fmt:requestEncoding value="euc-kr"/>
요청 파라미터 :
<%
out.print(request.getParameter("id"));
%>
<form method="post" action="#">
<p>아이디 <input type="text" name="id">
<input type="submit" value="전송">
</form>
</body>
</html>
3.2 메시지 처리 태그의 기능과 사용법
리소스번들
리스소번들은 메시지 처리 태그에서 사용하는 파일로 메시지번들 이라고도 한다. 리소스번들로 사용하는 파일은 보통 WEB-INF/classes.폴더에 있다. 리로스번들은 java.util.Properties 클래스에 정의된 방법으로 메시지를 읽어오기 때문에 확장자가 properties 인 파일이 반드시 있어야 한다. java.util.Properties 클래스는 알파벳이나 숫자, 라틴 문자 외의 언어를 유니코드 값으로 표현한다.
리소스번들로 사용하는 *.properties 파일의 종류
*.properties 파일 | 설명 |
파일 이름.properties | 기본 메시지일때 사용한다 |
파일이름_ko.properties | 한글 메시지일때 사용한다 |
파일이름_en.properties | 영어 메시지일때 사용한다 |
다음은 리소스번들로 사용하는 *.properties 파일에 한글과 영어 메시지를 작성하는 예이다.
[한글, 영문 리소스 번들 작성 예]
//message_ko.properties 파일인 경우
NAME = 허시아
//message_en.properties 파일인 경우
NAME = sia
NOTE_ 리소스번들로 사용하는 *.properties 파일
리소스번들로 사용하는 *.properties 파일은 보통 WEB-INF/classes/폴더 안에 위치하며 디렉터리의 깊이에 따라서 패키지 형식의 이름으로 되어있다. 로케일이 ko이면 testBundle_ko.properties 파일을 읽어오고, 로케일이 맞지않으면 testBundle.properties 처럼 언어 코드가 붙지 않은 파일을 읽어온다.
*.properties 파일의 내용은 한글로 직접 입력할 수 없기 때문에 한글에 해당하는 유니코드로 변환해서 입력해야 한다. 또는 이클립스에스 PropertiesEditor 플러그인을 사용하면 좀 더 쉽게 작성 할 수 있다
bundle 태그
bundle 태그는 사용할 리소스번들을 설정하는 태그로 형식은 다음과 같다. 이 태그는 리소스번들로 사용할 *.properties 파일을 읽어오는 역할을 하며 message 태그와 함께 사용한다.
<fmt:bundle basename="리소스번들" [prefix="key 이름"]>
//body 내용
</fmt:bundle>
여기서 basename 속성 값의 리소스 번들에는 반드시 확장자가 properties 인 파일을 설정해야 한다. profix 속성 값은 bundle 태그 내부에서 사용되는 message 태그의 key 속성 값앞에 자동으로 붙는 문자열을 의미한다
message 태그
message 태그는 bundle 태그에 설정한 리소스번들에서 메시지를 읽어와 출력하는 태그로 형식은 다음과 같다
<fmt:message
ket="메시지 key 이름"
[bundle="setBundle 태그의 변수 이름"]
[var="메시지를 저장하는 변수 이름"]
[scope="{page|request|session|application}"]/> //기본값은 page
여기서 key 속성 값은 리소스번들로 사용하는 *.poroperties 파일에서 메시지를 읽어와 var 속성값인 메시지 변수에 저장한다
다음은 메시지 처리태그를 이용하여 리소스번들의 메시지를 가져와 출력하는 예이다. 머저 /src/ 폴더에 resourceBundle 폴더를 생성하고, 이 폴더에 영어와 한글 메시지를 저장하는 리소스번들로 각각message_en.properties, message.properties 파일을 작성한다. 그리고 bundle 태그와 message 태그로 리소스번들에서 메시지를 가져와 출력한다.
[bundle 태그와 message 태그 사용 예]
//message_en.properties 파일인 경우
name = admin
hello = How are you
//message.properties 파일인 경우
name = \uAD00\uB9AC\uC790 //"관리자" 유니코드
hello = \uC548\uB155\uC138\uC694 //"안녕하세요" 유니코드
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<fmt:bundle basename="resourceBundle.message">
<p><fmt:message key="name"/>
<fmt:message key="hello" var="msg"/>
<p>${msg}
</fmt:bundle>
</body>
</html>
setBundle 태그
setBundle 태그는 리소스번들을 가져와 변수로 저장한 후 jsp 페이지 어디에서나 사용할 수 있는 태그로 형식은 다음과 같다. 이 태그는 bundle 태그를 대체하여 사용할 수 있다
<fmt:setBundle
basename="리소스번들"
[var="리소스번들을 저장할 변수 이름"]
[scope="{page|request|session|application}"]/> //기본값은 page
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<fmt:setBundle var="message" basename="resourceBundle.message"/>
<p><fmt:message bundle="${message}" key="name" />
<fmt:message bundle="${message}" key="hello" var="msg"/>
<p>${msg}
</body>
</html>
=사용자의 로케일에 따라 리소스번들의 메시지 출력하기=
src 에 패키지 ch09.com.bundle를 만들고 그 안에 myBundle.properties파일을 생성한다.
JSPBook/src/ch09/com/bundle/myBundle.properties
title=\uC790\uBC14\uC11C\uBC84\uD398\uC774\uC9C0
username=\uAD00\uB9AC\uC790
password=1234
한글은 꺠져서 아스키코드로 나온다..
JSPBook/src/ch09/com/bundle/myBundle_en.properties
title=Java Server Pages
username=admin
password=1234
JSPBook/webContent/ch09/jstl_fmt01.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>
Internationalization
</title>
</head>
<body>
<p>_______기본 로케일____________
<fmt:setBundle basename="ch09.com.bundle.myBundle" var="resourceBundle"/>
<p> 제목 : <fmt:message key="title" bundle="${resourceBundle}"/>
<p><fmt:message key="username" var="userMsg" bundle="${resourceBundle}"/>
이름 : ${userMsg}
<p>_______영문 로케일______
<fmt:setLocale value="en"/>
<fmt:setBundle basename="ch09.com.bundle.myBundle" var="resourceBundle"/>
<p> 제목 : <fmt:message key="title" bundle="${resourceBundle}"/>
<p> 이름 : <fmt:message key="username" bundle="${resourceBundle}"/>
</body>
</html>
'JSP, Servlet, MySQL > JSP - webmarket' 카테고리의 다른 글
JSP Servlet 시큐리티 : 상품 등록 페이지의 보안 처리하기 (0) | 2023.09.15 |
---|---|
JSP Servlet 다국어 처리 : 상품 등록 페이지의 다국어 처리하기 2 (2) | 2023.09.15 |
유효성 검사 : 상품 등록 데이터의 유효성 검사하기 2 (0) | 2023.09.09 |
유효성 검사 : 상품 등록 데이터의 유효성 검사하기 (0) | 2023.09.08 |
파일 업로드 : 상품 이미지 등록하기 2 /파일업로드 상태 500 내부 서버 오류/Not a directory (0) | 2023.09.08 |