김영한님의 스프링 mvc2편 - 벡엔트 웹 개발 활용 기술 을 듣고 정리한 내용입니다.
메세지
여러 화면에 보이는 상품명, 가격, 수량 등, label 에 있는 단어를 변경하려면 다음 화면들을 다 찾아가면서
모두 변경해야 한다. 지금처럼 화면 수가 적으면 문제가 되지 않지만 화면이 수십개 이상이라면 수십개의
파일을 모두 고쳐야 한다.
이런 다양한 메시지를 한 곳에서 관리하도록 하는 기능을 메시지 기능이라 한다.
예를 들어서 messages.properties 라는 메시지 관리용 파일을 만들고
item=상품
item.id=상품 ID
item.itemName=상품명
item.price=가격
item.quantity=수량
각 HTML들은 다음과 같이 해당 데이터를 key 값으로 불러서 사용하는 것이다.
addForm.html
<label for="itemName" th:text="#{item.itemName}"></label>
editForm.html
<label for="itemName" th:text="#{item.itemName}"></label
국제화
메세지에서 설명한 message.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=수량
영어를 사용하면 en properties을
한국어를 사용하면 ko properties를 사용하게 개발하면 된다.
HTTP accept-language 헤더 값을 사용하거나 사용자가 직접 언어를 선택하게 하고 , 쿠기를 이용해 처리함녀 된다.
스프링 메세지 소스 설정
메세지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 된다.
직접등록의 경우
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new
ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors");
messageSource.setDefaultEncoding("utf-8");
return messageSource;
}
스프링 부트의 경우
application.properties
spring.messages.basename=messages,config.i18n.messages
MessageSoruce를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면
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;
MessageSoruce 인터페이스를 보면 코드를 포함한 일부 파라미터를 메세지로 읽어오는 기능 제공한다.
@SpringBootTest
public class MessageSourceTest {
@Autowired
MessageSource ms;
@Test
void helloMessage() {
String result = ms.getMessage("hello", null, null);
assertThat(result).isEqualTo("안녕");
}
// 메세지가 없는 경우에는 Exception 발생
@Test
void notFoundMessageCode() {
assertThatThrownBy(() -> ms.getMessage("no_code", null, null))
.isInstanceOf(NoSuchMessageException.class);
}
// 메세지가 없어도 defaultMessage 있을 경우에는 defaultMessage 반환
@Test
void notFoundMessageCodeDefaultMessage() {
String result = ms.getMessage("no_code", null, "기본 메시지", null);
assertThat(result).isEqualTo("기본 메시지");
}
//매개변수 사용. 메세지의 {0}부분은 매개변수를 전달하여 치환 가능하다.
@Test
void argumentMessage() {
String message = ms.getMessage("hello.name", new Object[]{"Spring"}, null);
assertThat(message).isEqualTo("안녕 Spring");
}
//국제화 파일 선택 가능. locale 이 en_US 인경우 messages_en -> messages 순서로 찾는다.
@Test
void defaultLang() {
//locale 정보 없으므로 messages 사용
assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕");
//locale 정보가 있지만, message_ko 가 없으므로 messages 를 사용
assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕");
}
@Test
void enLang() {
//ms.getMessage("hello", null, Locale.ENGLISH) : locale 정보가 Locale.ENGLISH 이므로 messages_en 을 찾아서 사용
assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello");
}
}
Locale 정보가 없는 경우 Locale.getDefault() 을 호출해서 시스템의 기본 로케일을 사용합니다.
예) locale = null 인 경우 시스템 기본 locale 이 ko_KR 이므로 messages_ko.properties 조회 시도
조회 실패 시 messages.properties 조회
웹 어플리케이션에 메세지 적용하기
메세지를 추가 등록한다
messages.properties
label.item=상품
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=취소
타임리프 메세지 적용
타임리프의 메세지 표현식 #{...}을 사용하면 스프링의 메세지를 편리하게 조회 가능하다.
랜더링 전
<div th:text="#{label.item}"></h2>
렌더링 후
<div>상품</h2>
웹 애플리케이션에 국제화 적용하기
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
영어메세지 properties를 추가한다.
그 후 브라우저 언어 우선순위를 변경하여 확인 가능하다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
'스터디 > 2023_스프링부트' 카테고리의 다른 글
[study] 스프링MVC2 - 5. 쿠키, 세션 (0) | 2023.08.13 |
---|---|
[study] 스프링MVC2 - 4. 검증 (0) | 2023.08.08 |
[study] 스프링MVC2 - 2. 타임리프 스프링 통합과 폼 (0) | 2023.08.08 |
[study] 스프링MVC2 - 1. 타임리프 (0) | 2023.08.08 |
[study] 스프링MVC 정리 2 (0) | 2023.08.01 |