스프링 시큐리티를 데모 애플리케이션을 만드는 중에
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/
Spring MessageSource tutorial - using MessageSource in a Spring application
Home Subscribe Spring MessageSource tutorial Spring MessageSource tutorial shows how to translate messages using MessageSource in a Spring application. Spring is a popular Java application framework for creating enterprise applications. Spring MessageSourc
zetcode.com
스프링 메세지소스 튜토리얼은 스프링 어플리케이션에서 메세지소스를 사용하여 메세지를 번역하는 방법을 보여줄 것입니다.
스프링은 엔터프라이즈 어플리케이션을 만드는데 널리 사용되는 자바 어플리케이션 프레임워크입니다.
스프링 메세지소스
MesssageSource는 메세지의 매개 변수화 및 국제화를 지원하여 메세지를 해결하는데 사용됩니다. 스프링은 두 개의 내장 MessageSource 구현을 갖습니다. 바로 ResourceBundleMessageSoource와 ReloadableResourceBundleMessageSource입니다. 후자는 가상 머신의 재시작 없이 메세지 정의를 리로드 할 수 있습니다.
스프링 메세지소스 예제
다음 애플리케이션은 영어와 독일어 메세지를 포함하고 있습니다. 내장 ResourceBundleMesssageSource를 사용합니다.
pom.xml src ├───main │ ├───java │ │ └───com.test.messagesource │ │ │ Application.java │ │ └───config │ │ AppConfig.java │ └───resources │ │ logback.xml │ └───messages │ label.properties │ label_de.properties └───test └───java |
이것이 프로젝트 구조입니다.
📄 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>messagesource</artifactId>
<name>MessageSourceTest</name>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<org.springframework-version>5.1.3.RELEASE</org.springframework-version>
</properties>
<dependencies>
<!-- Logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
pom.xml 파일에는 기본 스프링 의존성인 spring-core, spring-context와 로깅에 관한 logback-classic 의존성이 있습니다.
exec-maven-plugin은 메이븐에서 커맨드로 스프링 애플리케이션을 실행하는데 사용됩니다.
📄 resource/logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<logger name="org.springframework" level="ERROR" />
<logger name="com.test" level="INFO" />
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n</Pattern>
</encoder>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="consoleAppender" />
</root>
</configuration>
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를 사용하는 방법을 보여줬습니다.
'Spring' 카테고리의 다른 글
[Spring] @Configuration @Bean vs @Component (0) | 2021.12.14 |
---|---|
[Spring] 스프링 프레임워크 실행 순서 (0) | 2021.01.15 |
Spring MVC Swagger(스웨거) 샘플 프로젝트 만들기 (0) | 2020.06.17 |
[Spring-MVC JUnit Test Error] No qualifying bean of type [javax.servlet.ServletContext] found for dependency.. (0) | 2020.06.17 |
spring 5로 응답에 헤더 설정하는 방법 (1) | 2019.12.27 |