properties 파일을 message 에 등록
▫︎ properties 의 값을 jsp 에서 사용 가능
▫︎ 다국어 처리 가능
▫︎ MessageSource 객체를 이용해 properties 파일을 등록해주면 message 로 등록 가능
▫︎ 원래 properties 로 지정하면 서버가 가동되는 동안에는 값 변경이 불가하지만
ReloadableResourceBundleMessageSource 를 이용하면 서버를 중지하지 않더라도 properties 를 갱신해서 사용 가능
▫︎ properties 를 message 에 등록하는 방법 2가지
- Java 로 설정 세팅
- xml 로 설정 세팅
1. Java 로 Spring MVC 설정 세팅
ServletAppContext.java
ReloadableResourceBundleMessageSource 형을 리턴하는 메소드를 @Bean 으로 등록해줍니다.
properties 가 1개인 경우 res.setBasename("/WEB-INF/properties/파일명") 사용
properties 가 여러개인 경우 res.setBasenames("/WEB-INF/properties/파일명1", "/WEB-INF/properties/파일명2") 사용
(확장자명 .properties 는 생략해서 사용)
@ComponentScan("com.my.spring.controller")
public class ServletAppContext implements WebMvcConfigurer{
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
// res.setBasename("/WEB-INF/properties/data1"); //1개인 경우
res.setBasenames("/WEB-INF/properties/data1", "/WEB-INF/properties/data2"); //여러개인 경우
return res;
}
}
2. xml 로 Spring MVC 설정 세팅
servlet-context.xml
ReloadableResourceBundleMessageSource 클래스를 bean 으로 등록합니다.
properties 가 1개인 경우
<beans:property name="basename" value="/WEB-INF/properties/파일명"></beans:property> 사용
properties 가 여러개인 경우
<beans:property name="basenames">
<beans:list>
<beans:value>/WEB-INF/properties/파일명1</beans:value>
<beans:value>/WEB-INF/properties/파일명2</beans:value>
</beans:list>
</beans:property> 사용
등록한 messageSource 객체를 통해서 properties 파일에 접근할 수 있는 MessageSourceAccessor 를 지정해야 합니다.
MessageSourceAccessor 클래스의 빈을 등록하고 그 빈의 생성자에 위에서 만든 messageSource 빈을 주입합니다.
<!-- MessageSource 를 등록한다. -->
<beans:bean class="org.springframework.context.support.ReloadableResourceBundleMessageSource" id="messageSource">
<!-- <beans:property name="basename" value="/WEB-INF/properties/data1"></beans:property> 1개인 경우 -->
<beans:property name="basenames"> <!-- 여러개인 경우 -->
<beans:list>
<beans:value>/WEB-INF/properties/data1</beans:value>
<beans:value>/WEB-INF/properties/data2</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- MessageSource 를 사용하기 위한 Accessor 등록 -->
<beans:bean id='messageSourceAccessor' class='org.springframework.context.support.MessageSourceAccessor'>
<beans:constructor-arg ref='messageSource'/>
</beans:bean>
3. properties
########## data1.properties ##########
aaa.a1 = 문자열1
aaa.a2 = 나이는 {0} 세 이고 이름은 {1} 입니다.
자바소스에서 res.getMessage(String code, Object[] args, Locale locale); 의 두번째 매개변수 Object[] 배열에 properties 의 {0}, {1}, ... 변수값을 변경할 수 있습니다.
########## data2.properties ##########
bbb.b1 = 문자열2
########## data1_ko.properties ##########
aaa.a3 = 한국어
########## data1_en.properties ##########
aaa.a3 = english
4. TestController.java
message 로 등록된 properties 데이터를 java 코드에서 사용할 떄 MessageSource 를 주입받아 사용합니다.
@Autowired
ReloadableResourceBundleMessageSource res;
res.getMessage(String code, Object[] args, Locale locale);
1. res.getMessage("aaa.a1", null, null); //properties 파일의 aaa.a1 이라는 이름의 변수값을 가져옴
2. res.getMessage("aaa.a2", args, null); //args 의 매개변수를 통해 Object[] 배열에 properties 의 {0}, {1}, ... 변수값을 변경할 수 있습니다.
3. res.getMessage("aaa.a3", null, locale); //다국어 처리를 위한 Locale 클래스를매개변수로 받아 세번째 변수로 전달합니다.
locale 이 en/en_US 인 경우 data1_en.properties 의 값을 가져오고
locale 이 ko 인 경우 data1_ko.properties 의 값을 가져옵니다.
package com.my.spring.controller;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestController {
private String TAG = "===== "+TestController.class.getSimpleName()+" >> ";
// MessageSource를 주입받는다.
@Autowired
ReloadableResourceBundleMessageSource res;
@GetMapping("/test01")
public String test01(Model model, Locale locale) {
String a1 = res.getMessage("aaa.a1", null, null);
String b1 = res.getMessage("bbb.b1", null, null);
System.out.printf(TAG+"test01() - a1 : %s\n", a1);
System.out.printf(TAG+"test01() - b1 : %s\n", b1);
//{} 부분에 세팅할 값 배열
Object [] args = {30, "유야호"};
String a2 = res.getMessage("aaa.a2", args, null);
System.out.printf(TAG+"test01() - a2 : %s\n", a2);
String a3 = res.getMessage("aaa.a3", null, locale);
System.out.printf(TAG+"test01() - locale : %s\n", locale);
System.out.printf(TAG+"test01() - a3 : %s\n", a3);
model.addAttribute("args", args);
return "test01";
}
}
5. test01.jsp
JSP(View)에서 taglib를 선언하여 사용합니다.
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>test1</h1>
<h3>aaa.a1 : <spring:message code='aaa.a1'/></h3>
<h3>bbb.b1 : <spring:message code='bbb.b1'/></h3>
<h3>aaa.a2 : <spring:message code='aaa.a2' arguments="${args}"/></h3>
<h3>aaa.a3 : <spring:message code='aaa.a3'/></h3>
</body>
</html>
크롬(Chrome) 에서 언어 변경 및 결과화면
'📗 스프링 Spring' 카테고리의 다른 글
[스프링/Spring] Interceptor (0) | 2021.05.17 |
---|---|
[스프링/Spring] Spring MVC 유효성 검사 (0) | 2021.05.17 |
[스프링/Spring] Properties (0) | 2021.05.14 |
[스프링/Spring] 요청방식 (@RequestMapping / @GetMapping / @PostMapping) (0) | 2021.05.13 |
[스프링/Spring] URL Mapping (0) | 2021.05.13 |