📗 스프링 Spring

[스프링/Spring] Message

핑크빛연어 2021. 5. 14. 16:56

 

 

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) 에서 언어 변경 및 결과화면

 

728x90
반응형