메시지
다양한 메시지를 한 곳에서 관리하도록 하는 기능을 의미한다.
사용 예시
messages.properties라는 메시지 관리용 파일을 생성
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
각 HTML에서 다음과 같이 해당 데이터를 key 값으로 불러서 사용
<label for="itemName" th:text="#{item.itemName}"></label>
<label for="itemName" th:text="#{item.itemName}"></label>
국제화
messages.properties를 나라별로 별도로 관리하면 서비스를 국제화 할 수 있다.
사용 예시
messages_en.properties
item=Item
item.id=Item ID
item.itemName=Item Name
item.price=price
item.quantity=quantity
messages_ko.properties
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
스프링 메시지 소스 설정
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록한다. 이는 인터페이스이다.
따라서 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하면 된다.
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
- basenames: 설정 파일의 이름을 지정한다.
- messages로 지정하면 messages.properties 파일을 읽어서 사용한다.
- 추가로 국제화 기능을 적용하려면 messages_en.properties, messages_ko.properties와 같이 파일명 마지막에 언어 정보를 주면 된다. 만약 국제화 파이리이 없으면 messages.properties(언어정보가 없는 파일명)를 기본으로 사용한다.
- 파일의 위치는 /resource/messages.properties
- 여러 파일을 한번에 지정할 수 있다. 여기서는 messages, errors 둘을 지정했다.
- defaultEncoding: 인코딩 정보를 지정한다. utf-8을 사용하면 된다.
스프링 부트에서의 사용
- 스프링 부트를 사용하면 스프링 부트가 MessageSource를 자동으로 스프링 빈에 등록한다.
- 스프링 부트 메시지 소스 설정 (application.properties)
spring.messages.basename=messages,config,i18n.messages
스프링 부트 메시지 소스 기본 값
spring.messages.basename=messages
MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 message라는 이름으로 기본 등록된다. 따라서 message_en.properties, message_ko.properties, message.properties 파일만 등록하면 자동으로 인식된다.
package hello.itemservice.message;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
}
- ms.getMessage("hello", null, null)
- code: hello
- args: null
- locale: null
MessageSourceTest 추가 - 매개변수 사용
@Test
void argumentMessage() {
String result = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(result).isEqualTo("안녕 Spring");
}
- 다음 메시지의 {0} 부분은 매개변수를 전달해서 치환할 수 있다.
- hello.name = 안녕 {0} → Spring 단어를 매개변수로 전달 → 안녕 Spring
타임리프 메시지 적용
- 타임리프의 메시지 표현식 #{. . .}를 사용하면 스프링의 메시지를 편리하게 조회할 수 있다.
- 예를 들어서 방금 등록한 상품이라는 이름을 조회하려면 #{label.item}이라고 하면 된다.
렌더링 전
<div th:text="#{label.item}"></h2>
렌더링 후
<div>상품</h2>
타임리프 메시지에서 파라미터 사용
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
웹으로 확인하는 법 (chrome 크롬)
크롬 브라우저 → 설정 → 언어를 검색하고, 우선 순위를 변경하면 된다.
'Spring Study > MVC 패턴' 카테고리의 다른 글
[MVC 패턴] 검증2 - Bean Validation (0) | 2023.08.24 |
---|---|
[MVC 패턴] 검증1 - Validation (0) | 2023.08.24 |
[MVC 패턴] 타임리프 (Thymeleaf) - 스프링 통합과 폼 (0) | 2023.08.18 |
[MVC 패턴] 타임리프 (Thymeleaf) (0) | 2023.08.16 |
[MVC 패턴] MVC 기본 기능 (0) | 2023.08.15 |
댓글