스프링 시큐리티를 데모 애플리케이션을 만드는 중에 

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 INFO  com.test.messagesource.Application - Translated messages: 
11:36:39.544 INFO  com.test.messagesource.Application - Erde 
11:36:39.545 INFO  com.test.messagesource.Application - Earth 
11:36:39.545 INFO  com.test.messagesource.Application - Translated parameterized messages: 
11:36:39.546 INFO  com.test.messagesource.Application - Hallo Paul Smith, wie gehts? 
11:36:39.546 INFO  com.test.messagesource.Application - Hello Paul Smith, how are you? 

응용 프로그램을 실행합니다.

이 튜토리얼에서는 스프링 어플리케이션에서 ResourceBundleMessage를 사용하는 방법을 보여줬습니다.

블로그 이미지

uchacha

개발자 일지

,