Spring MVC - Message

2020. 9. 16. 23:14Java/Spring

반응형

Message

- Properties 파일을 Message로 등록하면 이 데이터는 JSP에서도 사용할 수 있다.

- Properties 파일을 Message로 등록하면 다국어 처리가 가능하다.

 

MessageSource

- MessageSource 객체를 이용해 properties 파일을 등록해주면 Message로 등록할 수 있다.

- 여기에서는 일정 시간마다 한번씩 갱신되는 ReloadableResourceBundleMessageSource를 사용한다.


Java 세팅

Java에서 Message를 사용하기 위해 ServletAppcontext에 다음 메소드를 추가한다.

//Properties 파일을 Message로 등록한다.
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
		
	ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
	res.setBasenames("/WEB-INF/properties/data1", "/WEB-INF/properties/data2");
	return res;
}

ReloadableResourceBundleMessageSource를 불러와 사용할 properties를 등록해준다.

 

XML 세팅

servlet-context.xml에 아래 태그를 추가한다.

	<!-- 정적파일 경로 세팅 -->
	<resources mapping="/**" location="/resources/"></resources>
	<!-- MessageSource를 등록해준다. -->
	<beans:bean class='org.springframework.context.support.ReloadableResourceBundleMessageSource' id="messagesource">
		<beans:property name="basename">
			<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>

ReloadableResourceBundleMessageSource에 자동주입으로 위에서 설정된 빈 객체를 사용가능하다.

@Controller
public class TestController {
	@Autowired
	ReloadableResourceBundleMessageSource res;
	
	@GetMapping("/test1")
	public String test1() {
		String a1 = res.getMessage("aaa.a1",null,null);
		String a2 = res.getMessage("bbb.b1",null,null);
		
		System.out.println("aaa.a1"+a1);
		System.out.println("bbb.b1"+a2);
		return "test1";
	}
}

JSP에서는 아래와 같이 데이터를 받아와 표현 가능하다.

<%@ 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>
	<h3>aaa.a1: <spring:message code='aaa.a1'/></h3>
	<h3>bbb.b1: <spring:message code='bbb.b1'/></h3>
</body>
</html>

data.properties의 값 중 일부만 바꿔서 사용이 가능하다. 그러기 위해서는 data.properties를 아래와 같이 {숫자}를 줌으로써 매개변수로 넘겨 줄 수 있다.

 

aaa.a1 = data1
aaa.a2 = 나이 {0} 이름 {1}

Controller를 아래와 같이 수정한다.

배열을 getMessage의 두 번째 인자로 넘겨주면 값이 배열의 순서대로 넘어간다.

@Controller
public class TestController {
	@Autowired
	ReloadableResourceBundleMessageSource res;
	
	@GetMapping("/test1")
	public String test1() {
		String a1 = res.getMessage("aaa.a1",null,null);
		String a2 = res.getMessage("bbb.b1",null,null);
		
		Object [] args = {30,"쿠킹코딩"};
		String a3 = res.getMessage("aaa.a2",args,null);
		
		System.out.println("aaa.a1"+a1);
		System.out.println("bbb.b1"+a2);
		System.out.println("aaa.a2"+a3);
		return "test1";
	}
}

위와 같이 주입 된 값이 출력된다.

 

JSP에서의 출력은 arguments를 주어 값을 받는다.

<h3>aaa.a2: <spring:message code='aaa.a2' arguments="${args }"/></h3>

Locale

Locale을 지정하면 다국어 처리가 가능하다.

 

먼저 data1_ko.properties, data1_eng.properties를 아래와 같이 생성한다.

controller 메소드를 아래처럼 수정해준다.

@Controller
public class TestController {
	@Autowired
	ReloadableResourceBundleMessageSource res;
	
	@GetMapping("/test1")
	public String test1(Locale locale) {
		String a1 = res.getMessage("aaa.a1",null,null);
		String a2 = res.getMessage("bbb.b1",null,null);
		
		Object [] args = {30,"쿠킹코딩"};
		String a3 = res.getMessage("aaa.a2",args,null);
		String a4 = res.getMessage("aaa.a3",null,locale);
		System.out.println(locale);
		System.out.println("aaa.a1"+a1);
		System.out.println("bbb.b1"+a2);
		System.out.println("aaa.a2"+a3);
		return "test1";
	}
}

String a4 = res.getMessage("aaa.a3",null,locale); 을 통해서 locale이 한글, 영어를 구분해서 언어에 맞게 파일을 선택하여 출력한다.

 

 

반응형

'Java > Spring' 카테고리의 다른 글

Spring MVC - JSR-303 어노테이션 정리  (0) 2020.09.19
Spring MVC - 유효성 검사(@Valid,JSR-303)  (0) 2020.09.17
Spring MVC - Properties  (0) 2020.09.15
Spring MVC - Cookie  (0) 2020.09.14
Spring MVC - ApplicationScope  (0) 2020.09.14