사용자 화면에 보일 문자열은 JSP나 html등에 직접 코딩하는 경우
예를 들어 로그인 폼을 보여줄 때 '아이디', '비밀번호' 등의 문자열을 직접 삽입하는 경우
<label>이메일</label>
<input type="text" name="email"/>
이메일 이라는 문자열을 사용하는 모든 JSP 파일을 모두 찾아서 변경해야하는 문제점
다국어 지원 문제 : 전 세계대상 서비스의 경우 사용자의 언어 설정에 따라 이메일, E-mail과 같이 각 언어에 맞게 문자열을 표시해야하는 문제점
해결법 : 뷰 코드에서 사용할 문자열을 언어별로 파일에 보관하고 뷰 코드는 언어에 따라 알맞은 파일에서 문자열을 읽어와 출력
- 문자열을 담은 메시지 파일을 작성한다.
- 메시지 파일에서 값을 읽어오는 MessageSource 빈을 설정한다.
- JSP 코드에서
<spring:message>
태그를 사용해서 메시지를 출력한다.
src/main/resources/message에 label.properties 파일을 작성
member.register=회원가입
term=약관
term.agree=약관동의
next.btn=다음단계
member.info=회원정보
email=이메일
name=이름
password=비밀번호
password.confirm=비밀번호 확인
register.btn=가입 완료
register.done=<strong>{0}님 ({1})</strong>, 회원 가입을 완료했습니다.
go.main=메인으로 이동
required=필수항목입니다.
bad.email=이메일이 올바르지 않습니다.
duplicate.email=중복된 이메일입니다.
nomatch.confirmPassword=비밀번호와 확인이 일치하지 않습니다.
UTF-8 인코딩을 사용해서 label.properties 파일을 작성한다.
label.properties를 Text Editor를 통해 작성한다. 저장은 Properties 메뉴를 other의 UTF-8로 저장한다.(STS 기준)
MessageSource 타입의 빈 추가
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main").setViewName("main");
}
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource ms =
new ResourceBundleMessageSource();
ms.setBasenames("message.label");
ms.setDefaultEncoding("UTF-8");
return ms;
}
}
ms.setBasenames를 통해 basenames 프로퍼티 값으로 message.label을 주었다.
src/main/resources/message 폴더에 속한 label 프로퍼티 파일로부터 메시지를 읽어온다고 설정하였다.
setBasenames() 메서드는 가변 인자이므로 사용할 메시지 프로퍼티 목록을 전달한다.
label.properties 파일은 UTF-8 인코딩을 사용하므로 defaultEncoding 속성의 값으로 UTF-8로 설정한다.
<%@ 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">
<label>
<input type="checkbox" name="agree" value="true1">
<spring:message code="term.agree"/>
</label>
<input type="submit" value="<spring:message code="next.btn"/>"/>
</form>
</body>
</html>
<spring:message>
커스텀 태그를 사용하기 위해 태그 라이브러리 설정 추가 :<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<spring:message>
태그를 이용해서 메시지 출력
다국어 지원 위한 메시지 파일
다국어 메시지를 지원하려면 각 프로퍼티 파일 이름에 언어에 해당하는 로케일 문자를 추가한다.
예를 들어 한국어와 영어에 대한 메시지를 지원하려면 다음의 두 프로퍼티 파일을 사용하면 된다.
- label_ko.properties
- label_en.properties
특정 언어에 해당하는 메시지 파일이 존재하지 않으면 언어 구분이 없는 label.properties 파일의 메시지를 사용한다.
브라우저는 서버에 요청을 전송할 때 Accept-Language 헤더에 언어 정보를 담아 전송한다. 예를 들어 브라우저의 언어 설정이 한글인 경우 브라우저는 Accept-Language 헤더의 값으로 "ko"를 전송한다.
스프링 MVC는 웹 브라우저가 전송한 Accept-Language 헤더를 이용해서 Locale을 구하고, MessageSource에서 메시지를 구할 때 사용한다.
'Spring' 카테고리의 다른 글
[Spring] <spring:message> 메시지 인자 처리 (0) | 2024.05.11 |
---|---|
[Spring] 메시지 처리 : MessageSource, <spring:message> (0) | 2024.05.11 |
[Spring] GET , POST 방식에 동일 이름 커맨드 객체 사용하기 (0) | 2024.04.29 |
[Spring] ModelAndView 이용해서 뷰 선택하고 모델을 전달해보기 (0) | 2024.04.29 |
[Spring] MVC 주요 에러 발생 원인 알아보기 (Logback 설정) (0) | 2024.04.17 |