쌓고 쌓다
메시지, 국제화 사용하기 본문
사용자에게 보이는 HTML 화면에 "상품명"이라는 단어를 모두 "상품 이름"으로 바꾸길 원한다.
하지만 "상품명"은 아래처럼 하드코딩되어 있다.
<h2>상품명</h2>
"상품명"을 "상품 이름"으로 바꾸길 원한다면 모든 파일을 하나하나 열어서 수정해야 한다.
이 문제를 해결할 좋은 메시지 기능이 있다.
이런 문자열 메시지를 한 곳에서 관리하는 것이다.
resources 아래에 messages.properties로 관리 파일을 만들자.
그리고 아래의 내용을 작성해 보자.
messages.properties
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명
Key와 Value 형식이다.
{0}로 파라미터를 받을 수 있다.
test.html
<th th:text="#{label.item.id}">TEST</th>
<th th:text="#{label.item.itemName}">TEST</th>
타임리프의 #{...}를 통해 메시지식을 사용할 수 있다.
그러면 <th>TEST</th>에 TEST 부분의 텍스트가 #{...} 메시지 식으로 넣어진다.
이렇게 messages.properties를 통해 모든 파일의 메시지를 관리할 수 있다.
파라미터는 아래와 같이 사용할 수 있다.
hello.name=안녕 {0}
<p th:text="#{hello.name(${item.itemName})}"></p>
스프링 메시지 소스 등록
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
메시지 관리 기능을 사용하려면
스프링이 제공하는 MessageSource 인터페이스를 스프링 빈으로 등록해야 한다.
구현체로 ResourceBundleMessageSource를 사용한다.
- setBasenames: 설정 파일의 이름을 지정한다. 예로 messages, errors를 등록함.
- 파일의 위치는 /resources/messages.properties이다.
- 국제화 기능을 사용하면 messages_en.properties처럼 끝에 언어 정보를 적는다.
스프링부트 메시지 소스 등록
스프링부트는 MessageSource를 자동으로 스프링 빈으로 등록한다.
메시지 소스 설정은 아래와 같이 한다.
application.properties
spring.messages.basename=messages,...
messages는 기본값이다.
국제화
messages.properties: 기본 값으로 한글을 Value로 적음.
messages_en.properties: 영어. 값으로 영어를 적음
*찾는 국제화 파일이 없다면 messages.properties(언어정보가 없는 파일)를 기본으로 사용한다.
-- messages.properties --
label.item=상품
label.item.id=상품 ID
label.item.itemName=상품명
-- messages_en.properties --
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name
이제 요청 메시지의 헤더에 있는 Accept-Language에 따라 언어를 선택하여 렌더링 한다.
'프로그래밍 > spring' 카테고리의 다른 글
유효성 검사 직접 처리 및 폼 데이터 유지 방법 (0) | 2023.08.27 |
---|---|
[스프링 부트] 게시글 상단 고정(공지사항) - 24 (0) | 2023.08.22 |
컨트롤러 모든 메서드 Model에 값 넣기 - @ModelAttribute (0) | 2023.08.20 |
빈 순환 참조 발생 (The dependencies of some of the beans in the application context form a cycle) (0) | 2023.08.18 |
PRG(Post-Redirect-Get) 패턴 (0) | 2023.08.15 |