상세 컨텐츠

본문 제목

메세지 다국어 처리 / 공통 Message 처리 (MessageSource)

Spring/개념

by Chan.94 2022. 9. 19. 21:02

본문

반응형

화면으로 Message를 전달해야 하는 경우가 있을 것이다.

Message를 처리하는 몇가지 방법을 나열해보겠다.

  • 전달하고자 하는 Message 내용을 하드 코딩한다.
    => Spring의 장점을 사용하지 못하고 있다.
  • Enum으로 MessageCode와 내용을 관리하여 사용한다.
    => Spring의 장점을 사용하지 못하고 있다. 하지만 Enum을 사용함으로써 내용을 하드 코 등 하는 것이 아닌 코드로서 관리한다.
  • MessageSource를 사용한다.
    => Spring에서 제공하는 라이브러리로 Message를 Code로 관리하기 때문에 관리에 용이하고 추가적으로 다국어 처리까지 지원한다.

MessageSource

사용자의 언어 선택에 맞게 페이지가 번역되어 보여야 한다면 어떻게 할 것인가?

언어별로 화면을 개발할 것인가? 이것은 매우 비효율 적이고 유지보수가 어려워진다.

Message 템플릿을 정한 후 다국어 처리된 파일을 작성하면 Srping이 알아서 텍스트를 다국어 처리해준다.

 

Message Property 파일 작성

Property파일은 {basename}_언어코드_국가코드.properties Naming Rule을 지켜야 한다.

basename은 Configuration파일에 정의한다.

{basename].properties Default Message로 시스템의 언어 및 지역에 맞는 Property 파일이 존재하지 않을 경우 사용
{basename]_en.properties 시스템 언어 코드가 영어일 때 사용
{basename}_ko.properties 시스템 언어 코드가 한글일 때 사용
{basename}_en_UK.properties 시스템 언어 코드가 영어일때 영국(국가코드)를 위한 메시지

 

#Message_ko_KR.properties
DEFAULT=관리자에게 문의 하세요.
ERROR001=에러입니다.
ERROR002={0}은 {1}입니다.

Naming Rule에 따라서 properties파일의 내용을 각 언어에 맞게 정의하여 사용하면 된다.


ReloadableResourceBundleMessageSource

property 설정을 통해 Reloading 정보를 입력해 주기적인 Message Reloading을 수행한다.

Application 종료 없이도 실행 도중에 변경이 가능한 장점이 있다.


Java Configuration

@Configuration
public class MessageConfiguration {
	@Bean    
	public MessageSource messageSource() throws IOException {
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		
		messageSource.setBasenames("classpath:/messages/message");        
		
		messageSource.setDefaultEncoding("UTF-8");    
                
		return messageSource;
	
	}
	
	@Bean    
	public MessageSourceAccessor messageSourceAccessor() throws IOException {        
		return new MessageSourceAccessor(messageSource());    
	}
}

 

 

basenames 메세지 Property파일의 위치와 이름을 지정
defaultEncoding 기본 인코딩 방법
defaultLocale 기본 Location
cacheSeconds Reload Cache 설정
useCodeAsDefaultMessage true : system locale 사용
false : {basename}.properties 파일 사용

실행결과

String [] messageParam = {"Dev Log","Best"};
System.out.println(messageSourceAccessor.getMessage("ERROR001", Locale.KOREA));
System.out.println(messageSourceAccessor.getMessage("ERROR002", messageParam, Locale.KOREA));
System.out.println(messageSourceAccessor.getMessage("ERROR003", messageSourceAccessor.getMessage("DEFAULT", Locale.KOREA), Locale.KOREA));

Configuration 단계에서 DefaultLocale을 설정하였다면 뒤에 Locale부분을 생략하여도 된다.

String 배열을 함께 넘겨주면 해당 인덱스의 값으로 변환하여준다.

코드를 넘겼는데 정의되어있지 않은 경우가 존재할 수 있다. 정의되어있지 않은 코드라면 Default 값을 정의해주면 된다.

에러입니다.
Dev Log은 Best입니다.
관리자에게 문의 하세요.

 

반응형

관련글 더보기

댓글 영역

>