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

meteorfish·2022년 11월 6일

spring CH12 MVC 2

목록 보기
1/4

로그인 폼을 보여줄 때 다음처럼 직접 뷰 코드에 삽입한다.

<label>이메일</label>
<input type="text" name="email">

이렇게 이메일같은 문자열을 반복해서 사용하게 된다.
만약, 이렇게 반복된 문자열을 바꿔야하면 모든 코드를 하나씩 바꿔줘야한다.
또한, 다국어를 지원하는 웹페이지에서 영어로 표기를 하려면 똑같이 모든 코드를 수정해야한다.

이를 해결하기 위해 사용할 문자열을 별도의 파일로 만들어 뷰 코드에서 알맞은 문자열을 읽어와 출력하면됨.

[과정]

- 문자열을 담은 메시지 파일을 작성.
- 메시지 파일에서 값을 읽어오는 MessageSource 빈을 설정.
- JSP 코드에서 <spring:message> 태그로 메시지 출력.

1. 메시지 파일 작성

UTF-8 인코딩을 위해 Text Editor를 이용.

-> message/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. MessageSource 빈 설정

-> MvcConfig.java

	@Bean
    public MessageSource messageSource(){
        ResourceBundleMessageSource ms =
                new ResourceBundleMessageSource();
        ms.setBasenames("message.label");
        ms.setDefaultEncoding("UTF-8");
        return ms;
    }
  • setBasenames : message 패키지에 속한 label 프로퍼티 파일로부터 메시지를 읽어온다고 설정한 것. 즉, label.properties에서 메시지 읽어옴. (가변인자로 메시지를 목록으로 가져올 수 있음!)
  • defaultEncoding : UTF-8로 인코딩

주의할 점

빈 이름이 무조건 "messageSource"로 지정해야함.

3. JSP 코드에서 <spring:message> 태그로 메시지 출력

-> <step1.jsp> <step2.jsp> <step3.jsp>

다음 코드의 공통점


  • <spring:message> 사용하기 위해 라이브러리 설정 추가
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  • <spring:message> 이용해서 메시지 출력

코드 설명

  • <spring:message>의 code는 프로퍼티내의 프로퍼티 이름과 같아야함!
  • <spring:message>는 MessageSource로부터 메시지 읽어옴.
  • MessageSource는 label.properties로부터 해당하는 프로퍼티 값을 출력.

다국어 지원에 관해


다국어 메시지는 각 프로퍼티의 언어에 해당하는 로케일 문자를 추가.

  • label_ko.properties
  • label_en.properties
    브라우저는 서버 요청 시, 브라우저의 언어 설정에 따라 Accept-Language에게 해당 언어정보를 전달.

2.1 메시지 처리를 위한 MessageSource와 <spring:message> 태그

MessageSource 인터페이스 : 로케일에 상관없이 일관된 방법으로 메시지 관리.

-> MessageSource

public interface MessageSource {
	String getMessage(String code, Object[] args,
    	String defaultMessage, Locale locale);
        
    String getMessage(String code, Object[] args, Locale locale)
    	throws NoSuchMessageException;
        
    ...
    
}

getMessage()

code 파라미터 : 메시지 구분
locale : 지역 구분

ResourceBundleMessageSource

(MessageSource 구현체)

  • 메시지 코드와 일치하는 이름의 프로퍼티 값을 메시지로 제공
  • 자바의 리소스번들을 사용해서, 해당 프로퍼티 파일이 클래스 패스에 있어야함!

[메시지 출력과정]
1. <spring:message>는 'messageSource'빈을 이용.
2. 'messageSource'의 getMessage()를 통해 메시지 구함.
( ResourceBundleMessageSource가 구현 )
3. code와 일치하는 프로퍼티가 없으면 익셉션 발생!



2.2 <spring:message>의 메시지 인자 처리

-> label.properties

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

{0} : 인덱스 기반 변수 중 0번 인덱스의 값으로 대치되는 부분을 표시

[인덱스 기반 변수 전달 방법]
  1. MessageSource#getMessage()는 인덱스 기반 변수를 전달하기 위해 Object 배열 타입의 파라미터 사용.
	String getMessage(String code, Object[] args,
    	String defaultMessage, Locale locale);
        
    String getMessage(String code, Object[] args, Locale locale)

위 메서드로 MessageSource 빈 실행하면 Object 배열을 생성해서 인덱스 기반 변수값 전달 가능

Object[] args = new Object[1];
args[0] = "자바";
messageSource.getMessage("register.done", args, Locale.KOREA);
  1. <spring:message> 사용 시, arguments 속성 사용
<spring:message code="register.done" arguments="${registerRequest.name}" />
  • register.done의 {0}에 들어갈 값을 arguments에 입력.

[인덱스 기반 인자가 두 개일 때]
  1. arguments 에 ,로 전달하기
<spring:message code="register.done" arguments="${registerRequest.name},${registerRequest.email}" />
  1. <spring:argument> 태그 사용하기
		<spring:message code="register.done">
        	<spring:argument value="${registerRequest.name}" />
        	<spring:argument value="${registerRequest.email}" />
        </spring:message>

0개의 댓글