티스토리 뷰

study/Spring

chap 12 - MVC 메세지 처리

xoxowo 2023. 2. 13. 23:50

초보 웹 개발자를 위한 스프링 5 프로그램 입문을 보고 복습 겸 개인 학습 정리입니다. (windows 기준)

 

 

chap 11에서 만든 회원가입, 설문조사 뷰는 JSP에 직접 문자열을 작성했었는데, 만약 문자를 변경해야 할 경우 각 폼을 출력하는 JSP을 모두 찾아 수정해야 하는 번거로움이 생긴다. 또는 다국어를 지원할 경우 각 언어에 맞게 문자열을 표시해야 하기 때문에 이 점도 고려해야 한다.

 

이러한 문제를 해결하기 위해 chap 12에서는 문자열을 별도 파일에 작성하고 JSP 코드에서 값을 불러와 메시지를 출력하는 예제를 만들어보았다.

 

예제 프로젝트 만들기 (메이븐 기준)  예제 코드

sp5-chap12 프로젝트 폴더 생성

+ chap11의 src 파일 복붙

+ chap11의 pom.xml 복붙 후 <artifactId> 12로 변경

이클립스에서 sp5-chap12 폴더에 생성한 메이븐 프로젝트 import

 

 

<spring:message> 태그로 출력하기

 

- 문자열을 담은 메시지 파일 작성

- 메세지 파일에서 값을 읽어오는 MessageSource 빈 설정

- JSP 코드에서 <spring:message> 태그를 사용하여 메세지 출력

 

 

1. 메시지를 처리할 label.properties 파일 만들기

main/resources 폴더 내부에 message폴더를 만들고 message 폴더 안에 label.properies 파일을 만든다.

파일 작성 시 UTF-8 인코딩을 사용하여 작성하기

member.register=회원가입

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

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

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

go.main=메인으로 이동

 

 

2. 설정 파일에 MessageSource 타입 빈 추가하기

setBasenames 프로퍼티 값으로 ("message.label")을 주었는데, massage패키지에 속한 label 프로퍼티 파일로부터 메세지를 읽어온다고 설정한 것

DefualtEncoding 프로퍼티 값을 ("UTF-8")로 설정한 것도 label.properties파일 작성 시 UTF-8 인코딩을 사용했기 때문

→ chap12/src/main/java/config/MvcConfig.java

import org.springframework.context.MessageSource;
import org.springframework.context.support.ResourceBundleMessageSource;

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

... 생략 ...
    
    @Bean
    public MessageSource messageSource() {
    	ResourceBundleMessageSource ms = new ResourceBundleMessageSource();
    	ms.setBasenames("message.label");
    	ms.setDefaultEncoding("UTF-8");
    	return ms;
    }
    
}

 

3. MessageSource를 사용해 메세지를 출력하도록 JSP코드 모두 수정하기 (접은 글로 대체)

 chap11/src/main/webapp/WEB-INF/view/register/step1.jsp  

더보기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="spring" uri="http://www.springframewokr.org/tags" %>
<!DOCTYPE html>
<html>
<head>
    <title><spring:massage code="member.register" /></title>
</head>
<body>
    <h2><spring:massage code="term" /></h2>
    <p>약관 내용</p>
    <form action="step2" method="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>

 chap11/src/main/webapp/WEB-INF/view/register/step2.jsp

더보기
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ 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="member.info" /></h2>
    <form:form action="step3" modelAttribute="registerRequest">
    <p>
        <label><spring:message code="email" />:<br>
        <form:input path="email" />
        </label>
    </p>
    <p>
        <label><spring:message code="name" />:<br>
        <form:input path="name" />
        </label>
    </p>
    <p>
        <label><spring:message code="password" />:<br>
        <form:password path="password" />
        </label>
    </p>
    <p>
        <label><spring:message code="password.confirm" />:<br>
        <form:password path="confirmPassword" />
        </label>
    </p>
    <input type="submit" value="<spring:message code="register.btn" />">
    </form:form>
</body>
</html>

 chap11/src/main/webapp/WEB-INF/view/register/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="member.register" /></title>
</head>
<body>
    <p>
        <spring:message code="register.done" arguments="${registerRequest.name}" />
    </p>
    <p>
        <a href="<c:url value='/main'/>">
            [<spring:message code="go.main" />]
        </a>
    </p>
</body>
</html>

 

 기존 jsp 코드를 살펴보면 직접 작성한 메시지가 화면에 출력되는 형태

 

📌 메세지 처리

- <spring:massage> 커스텀 태그를 사용하기 위해 태그 라이브러리 추가

- 화면에 출력되는 한글 대신 <spring:massage> 커스텀 태그를 이용해서 메세지 출력

 

 

3.  서버 실행

[Run As] → [Run on Server] → [톰캣😺 서버 실행] 

 

서버를 실행시키면 위에서 설정한 <spring:message> 태그 위치에 알맞은 메시지가 출력된다.

 

 

📌 <spring:message> 태그 메시지 인자 처리

→ chap12/src/main/java/resources/message/label.properties

메세지 폴더의 label.properties 파일을 살펴보면

메시지가 있는데 이 메시지의 {0} 은 인덱스 기반 변수 중 0번 인덱스값으로 대치되는 부분을 표시한다.

 

만약, 두 개 이상의 값을 전달해야 할 경우 아래 방법 중 하나를 사용한다.

 

- 콤마로 구분한 문자열

- 객체 배열

 

- <spring:argument> 태그 사용

 

 

 

댓글