메시지
만약, 프로젝트를 진행하던 중 기획자가 화면에 보이는 문구를 바꿔달라는 요청이 들어왔는데 이를 고치려면 어떻게 해야할까?
개발자 입장에서는 하드코딩으로 되어있는 문구를 일일히 바꾸려면 매우 번거로운 일이 아닐 수 없다. 여러 화면에 보이는 문구를 다 찾아가면서 변경해야 하기 때문이다.
스프링은 이러한 다양한 메시지를 관리하도록 하는 기능을 제공하는 데 이를 '메시지 기능'이라 한다.
예를 들어서 messages.properties라는 메시지 관리용 파일을 만들고
==messages.properties==
sports=스포츠
sportsId=스포츠 ID
sports.sportName=스포츠명
sports.type=스포츠 유형 {0}
각 HTML들은 다음과 같이 해당 데이터를 key값으로 불러서 사용한다.
addForm.html
<label for="sportName" th:text="#{sports.sportName}"></label>
국제화
국제화는 메시지를 각 나라마다 그 나라에서 사용하는 언어로 대체해줄 수 있는 기능을 의미한다. 즉, messages.properties 파일을 각 나라별로 관리하는 것을 의미한다.
국제화를 위한 메시지 파일을 작성할 때, 메시지 파일명은 messages + '_'(언더스코어)+ 해당 국가 언어코드(ISO 639-1) 로 작성한다.
- messages.properties :기본 값으로 사용(한글)
- messages_en.properties : 영어 국제화 사용
- messages_zh.properties : 중국어 국제화 사용
스프링 메시지 소스 설정
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource 를 스프링 빈으로 등록하면 된다.
MessageSource는 인터페이스이기 때문에 이를 구현한 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하면 된다.
직접 스프링 빈을 등록
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- beannames : 설정 파일의 이름을 지정한다.
- 파일 이름을 messages 로 지정하면 'messages.properties' 파일을 읽어서 사용한다.
- 추가로 국제화 기능을 적용하려면 'messages_en.properties , messages_ko.properties' 와 같 이 파일명 마지막에 언어 정보를 주면된다. 만약 찾을 수 있는 국제화 파일이 없으면 messages.properties (언어정보가 없는 파일명)를 기본으로 사용한다.
- 해당 파일 위치는 resources 경로 하위에 둔다. => /resources/messages.properties
- 여러 파일을 한번에 지정할 수 있다. 여기서는 messages , errors 를 지정했다.
- defaultEncoding : 인코딩 정보를 지정한다. 주로 UTF-8을 사용한다.
스프링 부트
스프링 부트는 위의 작업 없이 자동으로 MessageSource를 스프링빈으로 등록한다.
스프링 부트 메시지 소스 설정
application.properties에 다음과 같이 설정하면 메시지 소스를 설정할 수 있다.
spring.messages.basename=messages
MessageSource 를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages 라 는 이름으로 기본 등록된다. 따라서 'messages_en.properties , messages_ko.properties , messages.properties'의 형식으로 파일만 등록하면 자동으로 인식된다.
스프링 메시지 소스 사용
MessageSource 인터페이스
public interface MessageSource {
String getMessage(String code, @Nullable Object[] args, @Nullable String
defaultMessage, Locale locale);
String getMessage(String code, @Nullable Object[] args, Locale locale)
throws NoSuchMessageException;
...
}
- String code : 입력할 커맨드 (key)
- messages.properties 등의 메시지 관리용 파일에 저장한 key 값이 들어간다. (sports = 스포츠)
- messages.properties에 code 값이 없을 때, NoSuchMessageException 예외가 발생한다.
- 만약, defaultMessage를 설정하면 값이 없을 때, 예외가 발생하지 않고 defaultMessage값으로 대체 된다.
- Object[ ] args : 파라미터 값
- 메시지 파일에는 파라미터도 설정이 가능하기 때문에 파라미터 값을 넣을 수 있다.
- ex) messageSource.getMessage("sports.type", new Object[]{"tennis"}) , sports.type=스포츠 유형 {0}
- 결과 : "스포츠 유형 tennis"
- String locale : 지역 정보
- 국제화 시, 해당 국가의 메시지 파일 찾아 거기에 해당하는 키(Code) 값으로 메시지를 뿌려준다.
- Locale.KOREA => messages_ko.properties
- Locale.ENGLISH => messages_en.properties
- Local에 맞추어 구체적 -> 일반적 순서로 파일을 찾는다.
- 파일 찾는 순서 : messages_en_US.properties - messages_en.properties - messages.properties
- Locale 정보가 없는 경우 Locale.getDefault()을 호출해서 시스템의 기본 로케일을 사용한다.
- 국제화 시, 해당 국가의 메시지 파일 찾아 거기에 해당하는 키(Code) 값으로 메시지를 뿌려준다.
locale = null 인 경우 → 시스템 기본 locale 이 ko_KR 이므로 messages_ko.properties 조회 시도 → 조회 실패 → messages.properties 조회
타임리프에서의 적용
타임리프의 메시지 표현식 ' #{...} '을 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
- th : text = "#{sports.sportsName}"
- th : placeholder = "#{sports.sportsName}"
렌더링 전
<div th:text="#{sports}"></div>
렌더링 후
<div>스포츠</div>
'Spring > SpringMVC' 카테고리의 다른 글
검증 - Validation 2 (1) | 2024.01.21 |
---|---|
검증 - Validation (1) | 2024.01.15 |
스프링 MVC 기본 기능 2 (0) | 2023.12.18 |
스프링MVC의 기본 기능 (0) | 2023.12.07 |
스프링 MVC 구조 (0) | 2023.10.24 |