Spring MessageSource 튜토리얼
Spring MessageSource 튜토리얼
스프링 시큐리티를 데모 애플리케이션을 만드는 중에
ERROR: org.springframework.web.servlet.tags.form.ErrorsTag - No message found under code 'duplicate.newUser.name' for locale 'ko_KR'.
org.springframework.context.NoSuchMessageException: No message found under code 'duplicate.newUser.name' for locale 'ko_KR'.
이러한 에러메세지를 맞닥뜨리게 되어 messageSource에 알아봐야 할 필요성을 느껴 관련 문서를 번역해보게 되었습니다.
-@참고 : http://zetcode.com/spring/messagesource/
스프링 메세지소스 튜토리얼은 스프링 어플리케이션에서 메세지소스를 사용하여 메세지를 번역하는 방법을 보여줄 것입니다.
스프링은 엔터프라이즈 어플리케이션을 만드는데 널리 사용되는 자바 어플리케이션 프레임워크입니다.
스프링 메세지소스
MesssageSource는 메세지의 매개 변수화 및 국제화를 지원하여 메세지를 해결하는데 사용됩니다. 스프링은 두 개의 내장 MessageSource 구현을 갖습니다. 바로 ResourceBundleMessageSoource와 ReloadableResourceBundleMessageSource입니다. 후자는 가상 머신의 재시작 없이 메세지 정의를 리로드 할 수 있습니다.
스프링 메세지소스 예제
다음 애플리케이션은 영어와 독일어 메세지를 포함하고 있습니다. 내장 ResourceBundleMesssageSource를 사용합니다.
이것이 프로젝트 구조입니다.
📄 pom.xml
4.0.0 com.test messagesource MessageSourceTest 1.0.0-BUILD-SNAPSHOT UTF-8 11 11 5.1.3.RELEASE ch.qos.logback logback-classic 1.2.3 org.springframework spring-context ${org.springframework-version} org.springframework spring-core ${org.springframework-version} org.codehaus.mojo exec-maven-plugin 1.2.1 org.test.int1.Main
pom.xml 파일에는 기본 스프링 의존성인 spring-core, spring-context와 로깅에 관한 logback-classic 의존성이 있습니다.
exec-maven-plugin은 메이븐에서 커맨드로 스프링 애플리케이션을 실행하는데 사용됩니다.
📄 resource/logback.xml
%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
logback.xml은 로그백 로깅 라이브러리에 대한 구성파일입니다.
📄 resources/messages/label.properties
l1=Earth l2=Hello {0}, how are you?
이것은 영어 메세지입니다. 두번째 속성은 매개 변수를 받습니다.
📄 resources/messages/label_de.properties
l1=Erde l2=Hallo {0}, wie geht's?
이것은 독일어 메세지입니다.
📄 com/test/messagesource/config/AppConfig.java
package com.test.messagesource.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; @Configuration public class AppConfig { @Bean public ResourceBundleMessageSource messageSource() { ResourceBundleMessageSource source= new ResourceBundleMessageSource(); source.setBasenames("messages/label"); source.setUseCodeAsDefaultMessage(true); return source; } }
AppConfig는 ResourceBundleMessage를 구성합니다. setBasenames()는 메세지 정의를 찾을 위치를 알려줍니다.
📄 com/test/messagesource/Application.java
package com.test.messagesource; import java.util.Locale; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; @ComponentScan(basePackages = "com.test.messagesource") public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); @Autowired private MessageSource messageSource; public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Application.class); Application app = ctx.getBean(Application.class); app.run(); ctx.close(); } public void run() { logger.info("Translated messages:"); logger.info("{}", messageSource.getMessage("l1", null, Locale.GERMAN)); logger.info("{}", messageSource.getMessage("l1", null, Locale.ENGLISH)); logger.info("Translated parameterized messages:"); logger.info("{}", messageSource.getMessage("l2", new Object[] {"Paul Smith"}, Locale.GERMAN)); logger.info("{}", messageSource.getMessage("l2", new Object[] {"Paul Smith"}, Locale.ENGLISH)); } }
이 어플리케이션은 콘솔에 일반 메세지와 매개변수가 있는 메세지를 프린트합니다.
@Autowired private MessageSource messageSource;
AppConfig에서 생성된 MessageSource를 주입합니다.
logger.info("{}", messageSource.getMessage("l1", null, Locale.GERMAN));
getMessage()는 프로퍼티 이름을 첫번째 매개변수로 사용합니다. 메세지에 매개변수가 없으므로 두번째 매개변수는 널입니다. 세번째 매개변수는 해당 로케일입니다.
logger.info("{}", messageSource.getMessage("l2", new Object[] {"Paul Smith"}, Locale.GERMAN));
여기서는 메세지에 매개변수를 제공합니다.
💻 출력
11:36:39.541 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Translated messages:
11:36:39.544 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Erde
11:36:39.545 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Earth
11:36:39.545 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Translated parameterized messages:
11:36:39.546 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Hallo Paul Smith, wie gehts?
11:36:39.546 [34mINFO [0;39m [35mcom.test.messagesource.Application[0;39m - Hello Paul Smith, how are you?
응용 프로그램을 실행합니다.
이 튜토리얼에서는 스프링 어플리케이션에서 ResourceBundleMessage를 사용하는 방법을 보여줬습니다.
from http://great-developer.tistory.com/54 by ccl(A) rewrite - 2020-03-07 11:22:09
댓글
댓글 쓰기