Web

Ch12. MVC 2 : 메시지

tose33 2022. 7. 19. 16:46

지금까지 작성한 jsp 파일을 보면 문자 출력을 아래와 같이 했다. 

<head>
<title>설문조사</title> 
</head>

title에 설문조사 라고 출력하고 싶다면 설문조사라고 태그에 입력했다.

하지만 만약 설문조사 라는 title을 갖는 곳이 여러 군데이고, 일괄적으로 설문조사 라는 이름을 예를들어 설문목록으로 바꾸고 싶다면, 모든 곳에 가서 일일히 바꿔줘야 한다. 

 

또한 웹이 다국어를 지원하게 되면 사용자의 언어 설정에 따라 출력되는 언어가 바뀌어야 한다. 

 

이런 문제를 해결하기 위해 스프링에서는 <spring:message> 태그와 MessageSource를 지원한다. 

 

 


<spring:message> 태그와 MessageSource를 이용해 문자를 출력하는 방법은 다음과 같다. 

 

1. 문자열들을 담을 메시지 파일 (.properties)을 작성한다. 

2. 위의 .properties 파일에서 문자열을 읽어오는 MessageSource 빈 객체를 설정한다.

3. jps 파일에서 <spring:message> 태그를 이용해 메시지를 출력한다.

 

 


1. 문자열들을 담을 메시지 파일 (.properties)을 작성한다.

label.properties 

member.register=회원가입 

term=약관 
term.agree=약관동의 
next.btn=다음단계 

member.info=회원정보 
email=이메일 
name=이름 
password=비밀번호 
password.confirm=비밀번호 확인 
register.btn=가입 완료 

register.done=<strong>{0}님</strong>, 회원 가입을 완료했습니다.

go.main=메인으로 이동

 

 

2. 위의 .properties 파일에서 문자열을 읽어오는 MessageSource 빈 객체를 설정한다.

package config;

// .. 생략

// Spring MVC 설정 
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer
{
	// .. 생략 
    
	@Bean 
	public MessageSource messageSource() 
	{
		ResourceBundleMessageSource ms =
				new ResourceBundleMessageSource();
		ms.setBasename("message.label"); // src/main/resources/message/label.properties
		ms.setDefaultEncoding("UTF-8");
		return ms;
	}
}

MessageSource를 빈 객체로 등록하고 있다.

주의할점은 빈의 이름은 "messageSource" 여야 한다. 

messageSource 인터페이스의 구현체로는 자바의 프로퍼티 파일로부터 메시지를 읽어오는 ResourceBundleMessageSource 클래스를 사용한다. 

이 클래스는 자바의 리소스번들을 사용하기 때문에 해당 프로퍼티 파일이 클래스 패스에 위치해야 한다.

 

 

 

3. jps 파일에서 <spring:message> 태그를 이용해 메시지를 출력한다.

아래와 같은 jsp 파일을 

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
	<title>회원가입</title>
</head>
<body>
	<h2>약관</h2>
	<p>약관 내용</p>
	<form action="step2" method="post"> <%-- "register/step2", post 방식 요청  --%>
	<label>
		<input type="checkbox" name="agree" value="true"> 약관 동의
	</label>
	<input type="submit" value="다음 단계" />
	</form>
</body>
</html>

 

아래와 같이 <spring:message> 태그를 이용해 문자열을 출력하도록 할수 있다. 

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<!DOCTYPE html>
<html>
<head>
	<title> <spring:message code="member.register"/> </title> 
</head>
<body>
	<h2><spring:message code="term" /></h2>
	<p>약관 내용</p>
	<form action="step2" method="post"> <%-- "register/step2", post 방식 요청  --%>
	<label>
		<input type="checkbox" name="agree" value="true">
		<spring:message code="term.agree" />
	</label>
	<input type="submit" value="<spring:message code="next.btn" />" />
	</form>
</body>
</html>

 

 라이브러리를 추가하고, <spring:message>의 code 속성에 이전에 만든 .properties 파일의 값을 넣으면 된다. 

 

 


<spring:message> 태그를 사용할 때 arguments 속성을 사용해 변수를 전달할수 있다.

 

step3.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

<!DOCTYPE html>
<html>
<head>
	<title><spring:message code="register"/></title>
</head>
<body>
	<p><spring:message code="register.done" arguments="${registerRequest.name }, ${registerRequest.email }"/></p> 
	<p><a href="<c:url value='/main'/>">[<spring:message code="go.main"/>]</a></p>
</body>
</html>

 

 

아래 행을 보면 arguments 속성에 두개의 변수를 전달하고 있다.

<p><spring:message code="register.done" arguments="${registerRequest.name }, ${registerRequest.email }"/></p>

label.properties 파일의 register.done 프로퍼티는 다음과 같다

register.done=<strong>{0}님 ({1})</strong>, 회원 가입을 완료했습니다.

 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저)