스프링 시큐리티를 데모 애플리케이션을 만드는 중에
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 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 |