이전에는 다른 언어로 서비스를 해야 했을 때, jsp 파일을 여러개 만들어서 제작해야 했다. 하지만 Spring 프로젝트에서는 '메세지 파일' 만을 제작하여 활용할 수 있다.
그래서 오늘은 Spring 프로젝트에서 다국어 처리 방법을 활용해 볼 예정이다.
1. '다국어 처리' 를 하기 위해서 resource 안에 새로운 package 'message' 를 만든 후, 사용할 언어의 'File'을 생성한다.
(파일 생성 형식은 'messageFile_[언어 형식].properties' 으로 이름 지어야 함.)

2. 다음으로 '메세지 파일'을 작성해야 한다.
작성하는 방법
key = value
메세지 키 = 메세지 값
사용할 언어로 키와 값을 맞춰 작성해야 한다. (현재는 영어와 한국어를 사용하기 위해 2개로 작성함)
또한, 코드에서 한국어로 작성할 경우 아스키 코드로 변경되어 작성 된다.
messageFile_en.properties
header.title = INSERT TITLE
header.content = INSERT CONTENT
header.file = SELECT FILE
header.btn = INSERT
body.image = DEFAULT IMAGE
footer.gobackmain = GO BACK MAIN
messageFile_ko.properties
header.title = \uC81C\uBAA9 \uC791\uC131
header.content = \uB0B4\uC6A9 \uC791\uC131
header.file = \uD30C\uC77C \uC120\uD0DD
header.btn = \uBC84\uD2BC \uC791\uC131
body.image = \uAE30\uBCF8 \uC774\uBBF8\uC9C0
footer.gobackmain = \uBA54\uC778\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30
header, body, footer는 생략하여 작성 가능하지만, 실제 서비스는 보여줘야 할 것이 매우 많기 때문에 가독성을 높이기 위해 생략하지 않고 작성하는 것이 좋다 !
3. 메세지 파일을 읽어드릴 수 있는 Resolver 클래스(== MessageSource)를 등록해야 한다.
즉, Resolver가 필요하므로 DispatcherServlet-servlet.java 파일에서 등록해야 한다. [ Setter 주입 방식 ]
DispatcherServlet-servlet.xml
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>message.messageFile</value>
</list>
</property>
</bean>
위의 코드가 기본적인 구조이다.
위 구조의 특징
<value> 태그 뒤에 확장자가 없는 것
그 이유는 자동으로 작성해주기 때문이고, 확장자를 작성했을 경우 패키지를 햇갈릴 수도 있기 때문에 생략한다.
여기까지만 작성해도 실제 서비스에서 언어 설정이 가능하다. 하지만 자동으로 언어를 설정해주는 것을 더 공부해보려고 한다.
5. LocaleResolver
MessageSource 클래스는 _en, _ko 등을 자동으로 설정 해준다. (따로 작성하지 않음) 그럼 무엇을 보고 무슨 언어인지 파악할까 ?
바로 'LocaleResolver' 이다.
LocaleResolver란 ?
웹 브라우저가 서버에 요청할 때 HTTP 요청 헤더에 현재 접속한 브라우저의 위치(Locale) 정보가 존재한다. 따라서, LocaleResoler가 해당 정보를 알려준다. (실습용, 현업에서는 사용하지 않음)
또한, Resolver 이므로 DispatcherServlet-servlet.xml 에서 등록한다.
DispatcherServlet-servlet.xml
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
6. LocaleChangeinterceptor
요청 헤더에 있는 어떠한 정보를 인위적으로 바꿔주는 클래스를 'Interceptor' 라고 한다.
따라서 'LoclaeChangeinterceptor'은 위치 정보를 인위적으로 설정할 수 있는 클래스이다.
DispatcherServlet-servlet.xml 에서 설정해야 하고, 하위의 namespace 태그에서 mvc를 추가한 후에 사용 가능하다.
이 클래스를 사용해야 하는 이유는 우리가 영어인 페이지를 사용하고 싶다고 해서, 직접 미국으로 가서 페이지를 열어볼 수 없기 때문에 인위적으로 위치를 설정할 수 있는 'LocaleChangeinterceptor' 클래스를 사용한다.
DispatcherServlet-servlet.xml
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang" />
</bean>
</mvc:interceptors>
위의 코드에서 value의 'lang' 이란 '파라미터로 언어설정 변경 가능하다' 라는 뜻이다.
7. jsp 파일 코드 수정
먼저, 적용 시킬 파일(insertBoard.jsp)의 헤더 부분에 우리가 설정한 파일을 사용할 수 있도록 taglib을 설정해준다.
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
다음으로 변경해야할 위치에 우리가 작성한 taglib으로 변경해야 하는데, 형식은 아래와 같다.
<spring:message code='메세지 키' /> —-> <spring:message code='header.title' />
따라서, 위의 코드로 코드를 변경하면 아래와 같다.
<h3><a href="insertBoard.do?lang=en">EN</a>|<a href="insertBoard.do?lang=ko">KO</a></h3>
<hr>
<form action="insertBoard.do" method="post" enctype="multipart/form-data" method="get">
<input type="hidden" name="writer" value="${member}">
<input type="text" name="title" required placeholder="<spring:message code='header.title' />"> <br>
<input type="text" name="content" required placeholder="<spring:message code='header.content' />"> <br>
<input type="file" name="fileUpload" onchange="thumbnail(this);" value="<spring:message code='header.file' />"> <br>
<input type="submit" value="<spring:message code='header.btn' />">
</form>
<hr>
<img alt="<spring:message code='body.image' />" src="" id="thumbnailImage">
<hr>
<a href="main.do"><spring:message code='footer.gobackmain' /></a>
<script>
function thumbnail(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
document.getElementById('thumbnailImage').src = e.target.result;
};
reader.readAsDataURL(input.files[0]);
}
else {
document.getElementById('thumbnailImage').src = "";
}
}
</script>
이렇게 작성하면 끝이 나는데 실행을 해보니 500 에러가 발생했다.

에러의 원인은 'header.title' 을 찾을 수 없다는 에러였다. 이 오류의 해결방법을 찾다보니 insertBoard.do 를 진행할 때 Controller에서 redirect 형식으로 보내졌기 때문이다. 즉, 데이터가 넘어오지 않기 때문에 발생한 오류였다. 따라서 redirect를 삭제한 후 진행하면 잘 실행되는 것을 확인할 수 있다.
'Spring' 카테고리의 다른 글
| [Spring] Spring Lagacy project에서 별도의 라이브러리 없이 진행할 수 있는 비동기 처리 (0) | 2023.08.22 |
|---|---|
| [Spring] 예외 처리 페이지 (0) | 2023.08.18 |
| [Spring] MultipartFile을 활용한 파일 업로드 (0) | 2023.08.17 |
| [Spring] NULL 업데이트 이슈 (@SessionAttributes, @ModelAttribute) (0) | 2023.08.16 |
| [Spring] Spring JDBC (JDBCTemplate) (1) | 2023.08.16 |