본문 바로가기
Spring 프레임워크/이론

Spring 프레임워크 - 다국어 처리 기능

by Hwanii_ 2023. 8. 24.
728x90

과거에는 다른 언어로 웹 브라우저 서비스를 제공 해야 할 때, 

.jsp 파일 자체를 여러개 제작 해서 서비스를 했었다.

 

하지만,

Spring 프로젝트 에서는, "메세지 파일" 을 제작 해서,

하나의 Xxx.jsp 파일에서 버튼을 간단하게 클릭 하는 것으로,

사용자가 원하는 언어로 서비스를 제공 할 수 있는 기능이 존재 한다.

 

1.

src/main/resources 에 message 라는 이름으로 패키지 생성.

 

 

2.

message 페키지 내부에 언어에 관한 파일을 생성.

 

이때, 파일 이름은 크게 상관 없지만,

파일 이름 곧바로 나오는 _ (언더바) 뒤의 "언어형식" 은 반드시 지켜 줘야 하고,

파일 생성시, 파일 형식은 반드시 .properties 로 생성 한다.

 

예시)

 

 

messageFile_ 까지는 공통이지만, 

_ (언더바) 뒤에는 확실 하게 작성 해주면 된다.

 

ar : 아라비아어

en : 영어

ko : 한국어

zh : 중국어

..

 

그밖에 다양한 언어가 있고, 추가적으로 궁금하면 구글에 검색 하면 된다.

 

3.

messageFile_"언어형식".properties 파일에서,

영어 이외에 모든 글씨는 유니코드로 표현 된다.

 

예시)

 

 

 

유니코드 또한 검색을 통해 해결 하면 된다.

 

(이클립스는 영어 외에 글씨를 입력 하면, 자동으로 유니코드화 됬음)

 

 

 

4.

본격적으로 코드를 작성 해보자.

 

1)

주석은 # 으로 작성 한다.

 

2)

.properties 파일 내부에서 코드를 작성 할 때,

키의 이름을 헷갈리지 않게 정확히 입력 하자.

 

3)

key = value

메세지 키 = 메세지 값

 

형식이다.

 

5.

.properties 파일 작성이 완료 되었으면,

이 메세지 파일을 서블릿이 읽을 수 있도록 해야 한다.

 

어디에, 무엇을 설정 해야 할까 ?

 

DispatcherServlet-servlet.xml 설정 파일에,

MessageSource 라는 이름으로 Resolver 인터페이스를 객체화 해줘야 한다.

 

즉,

메세지 파일은 MessageSource 라는 Resolver 를 반드시 거쳐야만 볼 수 있다.

 

특이점은, XxxResolver 인데, 이름이 XxxResolver 가 아니라,

MessageSource 이다.

 

또한, XxxResolver 이기 때문에, 서블릿의 멤버이고,

서블릿의 멤버라는것은 DS-servlet.xml 에 객체화를 해줘야 한다는 의미가 된다.

 

초기화는 setter 주입 방식 이다.

 

참고 링크 : 

https://hwanii96.tistory.com/309

 

스프링 컨테이너 어노테이션 메모

1. com.spring.biz 하위 폴더에, 모든 자료형을 (클래스 파일) 대상으로 객체화를 해주게 하는 코드 이다. 위와 같이 applicationContext.xml 기능 설정 파일 내부에, 코드를 작성 하고, 자바에서 @ (어노테이

hwanii96.tistory.com

 

 

<bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource">
   	  		<property name = "basenames">
				<list>
					<value>message.messageFile</value>				
				</list>   	  		
   	  		</property>
   	  </bean>

 

<list> 태그 내부에 <value> 태그가 있고, 

message.messageFile 이라고 작성 되어 있다.

 

<list> 태그의 형식을 가지기도 하고 해서, 왠지 아래와 같이 작성 해야 할듯 하지만, 그렇지 않다.

 

 

위의

MessageSource 라는 이름을 가진 Resolver 는 언어 설정 및 확장자를 붙히지 않고 작성 한다.

 

즉, 

en.properties

ko.properties

..

등을 작성 하지 않는다.

 

확장자 (.properties) 는 패키지 경로와 혼동 될 수 있기 때문이고,

 

MessageSource 라는 이름을 가진 Resolver가,

언어 설정 (en, ko, ..) 은 자동으로 붙혀 준다.

 

그렇다는것은, 파일을 만들때마다 == 언어를 추가 할 때마다,

설정을 새롭게 추가 하지 않아도 된다는것을 의미 한다.

 

MessageSource 자체로 다국어 처리를 완전히 구현 하는데 한계가 있기 때문에,

아래의 LocaleResolver 도 추가 해보자.

 

6.

LocaleResolver 인터페이스 란 ?

 

위의 LocaleResolver 인터페이스는 사용자의 Locale을 결정하는

역할을 담당하는 인터페이스 이다.

 

Locale 이란 ?

언어 및 지역 설정 정보 이다.

 

웹 브라우저 --- 요청 >>> 서버

 

HTTP 요청 헤더에 브라우저의 Locale 정보가 존재 한다.

이때, 브라우저의 Locale 정보를 추출할,

LocaleResolver 인터페이스가 존재 한다.

 

Spring 에서 제공하는 여러 LocaleResolver 중에서, 대표적으로 아래와 같은 구현체가 있다.

 

1)

AcceptHeaderLocaleResolver :

브라우저의  Accept-Language 헤더 값을 기반으로 사용자의 로케일을 결정.

 

2)

CookieLocaleResolver : 

쿠키 값을 사용하여, 사용자의 로케일을 결정.

 

3)

SessionLocaleResolver :

세션 값을 사용하여 사용자의 로케일을 결정.

 

LocaleResolver의 주요 메서드는 아래와 같다.

 

Locale resolverLocale(HttpServletRequest request)

 

:

HTTP 요청에서 사용자의 로케일을 판별하여 반환.

 

void setLocale(HttpServletRequest request, HttpServletResponse resonse, Locale locale)

 

:

사용자의 로케일을 설정.

 

7.

LocaleResolver 을 왜 사용할까 ?

 

(현업에서는 사실 잘 안쓰는 Resolver 이다)

 

일단,

MessageSource에 LocaleResolver 를 연계 해야지, 완전한 다국어 처리 기능을 구현 할 수 있다.

 

그리고,

연습 할 때, 여러 외국어 실습을 위해서,

인위적으로 언어 설정을 변경 하기 위해서 사용해보려고 한다.

(실제로 미국, 일본, 중국, .. 등에서 접속 하는 상황이 아니니까)

 

그중에서, SessionLocaleResolver 을 사용해보려고 한다.

 

 

<bean id = "localeResolver" class = "org.springframework.web.servlet.i18n.SessionLocaleResolver"></bean>

 

위와 같이 DS-servlet 에 작성 하면 된다.

 

추가로, LocaleChangeInterceptor 을 설정해준다.

 

요청 헤더의 어떤 정보를 인위적으로 바꾸는 기능을 하는것을 Interceptor (인터셉터) 라고 한다.

 

마찬가지로, DS-servlet 에 작성하고, 코드는 아래와 같다.

 

 

사용자가 지정한 파라미터명으로 언어를 변경 할 수 있다.

일반적으로, 요청 URL에 lang 이라는 파라미터명을 사용 한다.

 

그런데, 위의 코드를 작성 하기 전에 선행 되어야 설정이 있다.

 

 

DispatcherServlet-servlet.xml의 namespaces에서 mvc를 추가한 후 등록 해줘야 한다.

 

8.

에러 이슈 해결

 

메세지 파일 설정을 적용한 순간,

모든 메세지 파일은 Resolver 을 통해서만 정상적으로 동작 할 수 있다.

따라서,

필요한 Locale 정보가 Resolver을 통해서 전달 된다.

 

이때, 보내는 요청에 :redirect 가 붙어 있으면 안된다.

 

이게 붙어있으면, Locale 정보가 다 죽어버린다.

 

그래서, Locale 정보가 살아있으려면 :redirect 를 사용 하지 않아야 한다.

 

(이 부분 개념 공부 하기)

 

9.

위의 실습을 마무리 하며 얻어 가는 개념

 

1) 다른 다양한 언어도 웹 브라우저에 구현 할 수 있고,

 

2) .xml에 어떤 설정을 해야하는지, 스프링의 구조 파악을 할 수 있었다.

 

10.

웹 브라우저에서 확인 하기.

 

 

Xxx.jsp 페이지 내부 코드에, 위의 코드를 반드시 작성해 줘야 한다.

 

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>

 

메세지를 사용하는 방법은 아래와 같다.

 

<spring:message code = "메세지키" /> 식으로 사용 한다.

 

 

 

 

 

 

 

 

 

 

++ 추가하기

 

MessageSource 를 사용 하면 아래와 같은 장점이 있다.

 

1. 다국어 지원

서비스가 다국어를 지원 해야 할 때, 메세지 소스를 사용 하여,

각 언어별로 다른 메세지를 제공 할 수 있다.

예를들어, 사용자에게 표시되는 에러 메세지, 안내 문구 등을 제공 할 수 있다.

 

2. 중앙 집중화된 메세지 관리

모든 메세지가 한 곳에서 관리될 수 있다.

유지보수가 용이해지고, 하드코딩된 메세지를 피할 수 있다.

 

3. 유연성과 확장성

메세지를 불러 오는 방법을 다양한 형태로 구현 할 수 있다.

파일, 데이터베이스, 외부 서비스 등,

다양한 소스로부터 메세지를 가져올 수 있다.

 

4. 로케일 관리

로케일 (언어 및 지역 설정) 에 기반하여, 적절한 메세지를 가져온다.

반응형