기술 스택
- JDK 11.0.2
- Spring boot 2.4.4
- ThymeLeaf
메시지란?
개요
만약 기획자가 화면에 보이는 문구가 마음에 들지 않는다고 상품명이라는 단어를 모두 상품이름으로 고쳐달라고 하면 여러 화면에 보이는 단어들을 모두 변경해야 한다. 이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
개념
스프링 부트에서 제공하는 메시지 기능은 애플리케이션에서 텍스트 메시지를 별도의 파일로 관리하여 다양한 언어와 상황에 맞춰 텍스트를 쉽게 변경할 수 있게 한다. MessageSource라는 인터페이스를 통해 애플리케이션은 텍스트 메시지를 코드에 하드코딩하지 않고 별도의 메시지 파일에서 로드할 수 있다.
국제화란?
개요 및 개념
국제화 (i18n) 기능은 애플리케이션을 여러 언어와 지역에 맞게 확장할 수 있도록 지원하는 기능이다. 이 기능을 통해 애플리케이션 내 텍스트와 메시지를 다양한 언어로 번역하여 사용자에게 제공할 수 있다. 일반적으로 i18n이라 줄여 부르며, 이는 'internationalization'의 첫 글자(i)와 마지막 글자(n) 사이에 18개의 문자가 있기 때문에 생긴 용어이다.
사용 방법
1. 먼저 스프링 부트를 사용하면 스프링 부트가 MessageSource를 자동으로 빈으로 등록한다. 직접등록을 원하면 아래와 같은 코드로 Bean 등록을 하면 된다.
@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.properties를 기본으로 사용한다.
- 파일 위치는 /resoureces/messages,properties에 두면 된다.
- 여러 파일을 한번에 지정할 수 있다. 여기서는 messages, errors 둘을 지정했다.
- defaultEncoding: 인코딩 정보를 지정한다. utf-8 사용
2. application.properties 파일에 다음과 같은 코드를 추가한다.
spring.messages.basename=messages
3. resoureces 폴더에 'messages.properties', 'messages_en.properties' 파일을 추가한다.
그리고 각 파일에 다음과 같은 코드를 추가하면 된다.
messages.properties에 추가한 코드
label.item.id=상품 ID
label.item.itemName=상품명
label.item.price=가격
label.item.quantity=수량
page.items=상품 목록
page.item=상품 상세
page.addItem=상품 등록
page.updateItem=상품 수정
button.save=저장
button.cancel=취소
messages_en.properties에 추가한 코드
label.item=Item
label.item.id=Item ID
label.item.itemName=Item Name
label.item.price=price
label.item.quantity=quantity
page.items=Item List
page.item=Item Detail
page.addItem=Item Add
page.updateItem=Item Update
button.save=Save
button.cancel=Cancel
※ MessageSource 를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 'messages_en.properties', ' messages.properties ' 파일만 등록하면 자동으로 인식된다.
MessageSource 인터페이스이다. getMessage메서드가 오버로딩 되어있는 것을 볼 수 있다.
public interface MessageSource {
@Nullable
String getMessage(String var1, @Nullable Object[] var2, @Nullable String var3, Locale var4);
String getMessage(String var1, @Nullable Object[] var2, Locale var3) throws NoSuchMessageException;
String getMessage(MessageSourceResolvable var1, Locale var2) throws NoSuchMessageException;
}
4. 이제 타임리프 코드를 수정하면 된다. 다음과 같은 형식으로 수정한다.
<h2 th:text="#{page.addItem}">상품 등록</h2>
Request Header의 accept-language에서 ko가 우선순위라면 'messages.properties'에서 코드를 읽어들인뒤 사용자에게 렌더링을 해준다.
다음은 Request Header의 accept-language를 변경해보자. 크롬을 사용중이면 설정 - 언어 에서 영어를 맨위로 올려주면 된다.
Reference
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'Spring Framework' 카테고리의 다른 글
[Spring] Bean Validation (검증) - 2 (0) | 2024.11.04 |
---|---|
[Spring] Bean Validation (검증) - 1 (4) | 2024.10.31 |
[Spring] Argument Resolver 란? (0) | 2024.10.24 |
@Transactional을 선언해도 내부 메서드를 실행 시 ROLLBACK이 되지 않는 문제 (0) | 2024.08.03 |
(실습)객체지향 설계 원칙를 지키면서 설계하기 (0) | 2024.03.30 |