메시지는 메시지 코드와 메시지 콘텐츠를 정리하여, 메시지 코드를 통해 메시지 콘텐츠를 호출하는 방법입니다.
메시지 코드와 메시지 콘텐츠는 아래와 같은 구조입니다.
// {messageCode}={messageContent}
range.distance="Too Far"
application.properties와 닮지 않았나요? 이러한 메시지는 message.properties 파일에서 관리합니다.
이렇게 메시지를 사용하는 방법은 다음의 경우에 사용됩니다.
(1) 클라이언트에서 보여줘야하는 문자 관리
(2) 클라이언트의 언어 설정에 따른 문자 관리(국제화)
(3) 에러코드와 에러메시지를 관리
이번 포스팅에서는 메시지를 사용하는 방법을 다루겠습니다.
메시지를 활용하기 위해서는 Spring 활용이 필수적입니다.
MessageSource 의 구현체인 ResourceBundleMessageSource를 직접 Bean에 등록을 해줘야합니다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource MS = new
ResourceBundleMessageSource();
// MesageSource의 인코딩 방식 설정
MS.setDefaultEncoding("utf-8");
// 메시지를 관리할 파일 이름 지정
// messages라고 지정하면 src/main/resources/messages.properties 로 설정
MS.setBasenames("messages");
return MS;
}
SpringBoot에서는 ResourceBundleMessageSource가 이미 bean으로 등록되어 있기 때문에 Message를 관리할 파일의 경로만 application.properties에서 경로 설정만 해주면 됩니다.
application.properties 설정은 MessageSourceAutoConfiguration
을 사용한 INTERNATIONALIZATION
설정 에 따른 것인데, 그 내용은 다음과 같습니다.
# INTERNATIONALIZATION (MessageSourceAutoConfiguration)
spring.messages.always-use-message-format=false # Set whether to always apply the MessageFormat rules, parsing even messages without arguments.
spring.messages.basename=messages # Comma-separated list of basenames, each following the ResourceBundle convention.
spring.messages.cache-seconds=-1 # Loaded resource bundle files cache expiration, in seconds. When set to -1, bundles are cached forever.
spring.messages.encoding=UTF-8 # Message bundles encoding.
spring.messages.fallback-to-system-locale=true # Set whether to fall back to the system Locale if no files for a specific Locale have been found.
이 중에서 지금 설정할 내용은 spring.messages.basename
으로, 어느 파일을 message관리 파일로 할 것인지 설정하되, ','
를 이용해서 여러 경로를 설정할 수 있다는 것입다. 만약 아무런 경로도 설정하지 않는다면 default로 messages.properties 를 참조합니다.
// application.properties
spring.messages.basename=messages,config.i18n.messages
spring.messages.encoding=UTF-8
주의
파일 이름이 ' . ' 를 넣으면 안된다. spring.messages.basename 설정을 파싱하는 코드는 ' . '를 기준으로 파일 경를 나누기 때문이다. ' / ' 와 같은 의미를 갖는 것이다.`
경로를 설정했다면 그 내용물을 채워주면 됩니다. message.properties 파일에 다음과 같이 내용을 입력하겠습니다.
// messages.properties
hello=안녕
bye=잘가
arg=이 물건은 {0}원 입니다.
메시지의 주된 목적은 클라이언트에 문자를 동적으로 표시하기 위함입니다. 에러코드는 메시지의 특수한 경우로 따로 사용하는 방법이 존재합니다.
이번에는 메시지의 주된 목적을 살려서 클라이언트에 표시하는 방법을 서버사이드 랜더링 뷰 템플릿인 thymeleaf를 이용해서 해보겠습니다.
application.properties와 message.properties 설정은 그대로 유지한채로 html 파일과, Controller를 추가하겠습니다.
// 의존성
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
//Controller
@Controller
public class mycontroller {
@GetMapping("/message")
public String messagePageRender(Model model) {
model.addAttribute("price" , 1000);
return "/message";
}
}
<!-- templates/message.html-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>message</title>
</head>
<body>
<sapn th:text="#{hello}"> 123 </sapn> <br>
<sapn th:text="#{bye}"> 123 </sapn> <br>
<sapn th:text="#{arg(${price})}"> 213 </sapn> <br>
</body>
</html>
springboot application을 실행하고 localhost:8080/message url을 치고 들어가면 123이 아니라 message code에 맞는 콘텐츠들이 출력되는걸 확인할 수 있습니다.
안녕
잘가
이 물건은 1000원 입니다.
thymeleaf 에서 메시지를 매칭하는 방법은 다음과 같습니다.
이제 클라이언트의 언어 설정에 따라 메시지가 달라지는 것을 확인해보겠습니다. 클라이언트의 언어 설정을 읽어오는 역할은 인터셉터가 맡고, LocaleResolver는 그 언어 설정을 해석하여 ResourceBundleMessageSource에 전달하는 역할을 맡습니다.
Spring에서는 인터셉터, LocaleResolver, ResourceBundleMessageSource에를 모두 설정해줘야 하는데 SpringBoot는 이러한 설정들이 모두 내재되어, message 파일 이름으로 언어를 매칭합니다.
따라서 message 관리 파일은 일정한 작명 규칙을 따라야 합니다.
그 규칙은 다음과 같습니다.
messages_ko.properties
messages_en.properties
messages_jp.properties
messages_en.properties 파일을 다음과 같이 만들고 클라이언트의 언어 정보를 변경하면 영어로 출력되는 것을 확인할 수 있습니다.
//messages_en.properties
hello=hello
bye=bye
arg=the price is {0}