-
Spring MVC 2 - 국제화/메시지Web/Spring 2023. 10. 24. 14:44
1. 메시지/국제화 기능이란
- 만약 html에 출력하는 상품명 -> 상품이름으로 모두 고쳐야할 경우
- 모든 상품명에 찾아서 이를 모두 수정해야한다. (하드코딩 되어 있다)
- 메시지는 이러한 것들을 한번에 관리하도록 기능을 제공한다.
item=상품 item.id=상품 ID item.itemName=상품명 item.price=가격 item.quantity=수량 addForm.html <label for="itemName" th:text="#{item.itemName}"></label> editFrom.html <label for="itemName" th:text="#{item.itemName}"></label>
- 국제화는 이러한 메시지 기능에서 한발 더 나아가, 나라별로 보여줄 메시지를 한번에 관리할 수 있게한다.
- acept-language값을 사용하거나, 사용자가 선택하도록하여 쉽게 다른 언어로 치환할 수 있다.
2. 스프링 메시지 소스 설정
- 스프링은 기본적인 메시지 관리 기능을 제공한다. MessageSource를 스프링 빈으로 등록하면된다.
(구현체 ResourceBundleMessageSource)
@Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); return messageSource; }
- basenames: 메시지 파일 이름 지정 (messages -> messages.properties)
파일명 마지막에 언어정보 추가하면, 국제화 기능 실행 -> 없으면 언어정보 없는 파일 실행함
파일 위치는 /resources밑에 두자
2.1 스프링부트 : 스프링부트는 자동으로 MessageSource를 자동으로 등록함! 따라서 다음과 같이 메시지 소스 설정 가능
//application.properties spring.messages.basename=messages,config.i18n.messages
- 기본값이 messages로 되어 있다.
2.2 messages.properties파일 만들기
hello=안녕 hello.name=안녕 {0}
- {} 메시지 매개변수로 전달될 값
3. 스프링 메시지 소스 사용
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;
- MessageSource는 파라미터를 통해 메시지를 읽어오는 기능 제공
- code는 hello나 hello.name같은 키 값, Object는 {0}값에 넣어줄 것, default나, Locale정보 넣을 수 있다.
- 해당 코드에 메시지가 없는 경우 NoSuchMessageException 발생한다.!
- Locale정보는 en_US면 -> messages_en_US -> message_en 순서 (구체적 -> 단순한것)
*Locale정보가 null이면 Locale.getDefault()를 호출해서 알아서 사용함!
4. 웹 애플리케이션 메시지 적용하기
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=취소
- 메시지 등록, 해당 메시지 코드로 값을 읽어오면됨!!
4.1 타임리프 메시지 적용
메시지 표현식 #{}을 사용하면 스프링 메시지를 편리하게 조회할 수 있다.
ex #{page.addItem}
-> 메시지 넣으려는 태그에 th:text="#{label.item.itemName}" 사용하면 렌더링시에 content를 바꿔줌
4.2 타임리프에서 메시지에 파라미터 넣기
<p th:text="#{hello.name(${item.itemName})}"</p>
메시지 코드에 파라미터 전달하듯이 넣어주면 된다.
위와 같이 메시지를 효율적으로 관리할 수 있다.
5. 국제화 적용하기
- messages_en.properties같은 파일 추가
- 요청시 Accept-Language 값을 변경하면됨
- 스프링은 Locale정보를 알아야 선택 -> 기본으로 Accept-Laguage 헤더 값 사용
5.1 LocaleResolver
스프링은 Locale 선택 방식을 변경할 수 있도록 LocaleResolver인터페이스 제공
이때 기본적으로 AcceptHeaderLocaleResolver사용 (Accept 헤더값 사용)
5.2 LocaleResolver 인터페이스
public interface LocaleResolver { Locale resolveLocale(HttpServletRequest request); void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale); }
만약 Locale 선택 방식을 변경하려면, LocaleResolver 구현체 변경하거나, 쿠키나 세션 기반으로 Locale 선택
기능을 사용할 수 있다. -> 나중에 더 찾아보자(필요시)
'Web > Spring' 카테고리의 다른 글
Spring MVC 2 - 검증 (2) BeanValidation (0) 2023.10.25 SpringMVC 2 - 검증 (0) 2023.10.24 스프링 MVC - 웹 페이지 만들기 (0) 2023.10.15 Spring MVC (6) - 스프링 MVC 기본기능 (2) : Http Body (0) 2023.10.14 Spring MVC (6) - 스프링 MVC 기본 기능 (0) 2023.10.09