-
[김영한 스프링] 16. 메시지, 국제화 - 스프링 메시지 소스Spring/스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 2023. 8. 25. 05:03
스프링 메시지 소스 설정
스프링은 기본적인 메시지 관리 기능을 제공한다.
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 되는데, 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(언어정보가 없는 파일명)를 기본으로 사용한다.
- 파일의 위치는 /resources/messages.properties에 두면 된다.
- 여러 파일을 한번에 지정할 수 있다. 여기서는 messages, errors 둘을 지정했다.
- defaultEncoding : 인코딩 정보를 지정한다. utf-8을 사용하면 된다.
스프링 부트
스프링 부트를 사용하면 스프링 부트가 MessageSource를 자동으로 스프링 빈으로 등록한다.
spring.messages.basename=messages,config.i18n.messages
application.properties에 입력
스프링 부트 메시지 소스 기본 값
spring.messages.basename=messages
MessageSource를 스프링 빈으로 등록하지 않고, 스프링 부트와 관련된 별도의 설정을 하지 않으면 messages라는 이름으로 기본 등록된다. 따라서 messages_en.properties, messages_ko.properties, messages.properties 파일만 등록하면 자동으로 인식된다.
메시지 파일 만들기
메시지 파일을 만들어보자. 국제화 테스트를 위해서 messages_en파일도 추가하자.
- messages.properties :기본 값으로 사용(한글)
- messages_en.properties : 영어 국제화 사용
주의! 파일명은 massage가 아니라 messages다! 마지막 s에 주의하자
application.properties
spring.messages.basename=messages
messages.properties
hello=안녕 hello.name=안녕 {0}
main/resources/messages.properties 생성
messages.properties
hello=hello hello.name=hello {0}
main/resources/messages_en.properties 생성
자동으로 리소스 번들 'messages'를 만들어 버린다.
스프링 메시지 소스 사용
MessageSourceTest
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("안녕"); } }
test/java/hello/itemservice/message/MessageSourceTest 생성
- ms.getMessage("hello", null, null)
- code : hello
- args : null
- locale : null
가장 단순한 테스트는 메시지 코드로 hello를 입력하고 나머지 값은 null을 입력했다.
locale 정보가 없으면 basename에서 설정한 기본 이름 메시지 파일을 조회한다. basename으로 messages를 지정했으므로 messages.properties 파일에서 데이터 조회한다.
Locale 정보가 없는 경우 Locale.getDefault()을 호출해서 시스템의 기본 로케일을 사용합니다.
예) locale = null인 경우 시스템 기본 locale이 ko_KR이므로 messages_ko.properties 조회 시도
-> 조회 실패 -> messages.properties 조회실행
MessageSourceTest 추가 - 메시지가 없는 경우, 기본 메시지
notFoundMessageCode
@Test void notFoundMessageCode() { assertThatThrownBy(() -> ms.getMessage("no_code", null, null)) .isInstanceOf(NoSuchMessageException.class); }
메시지가 없는 경우에는 NoSuchMessageException이 발생한다.
실행
notFoundMessageCodeDefaultMessage
@Test void notFoundMessageCodeDefaultMessage() { String result = ms.getMessage("no_code", null, "기본 메시지", null); assertThat(result).isEqualTo("기본 메시지"); }
메시지가 없어도 기본 메시지(defaultMessage)를 사용하면 기본 메시지가 반환된다.
실행
MessageSourceTest 추가 - 매개변수 사용
@Test void argumentMessage() { String message = ms.getMessage("hello.name", new Object[]{"Spring"}, null); assertThat(message).isEqualTo("안녕 Spring"); }
다음 메시지의 {0} 부분은 매개변수를 전달해서 치환할 수 있다.
hello.name=안녕 {0} -> Spring 단어를 매개변수로 전달 -> 안녕 Spring
실행
국제화 파일 선택
locale 정보를 기반으로 국제화 파일을 선택한다.
- Locale이 en_US의 경우 messages_en_US -> messages_en -> messages 순서로 찾는다.
- Locale에 맞추어 구체적인 것이 있으면 구체적인 것을 찾고, 없으면 디폴트를 찾는다고 이해하면 된다.
MessageSourceTest 추가 - 국제화 파일 선택1
@Test void defaultLang() { assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕"); assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕"); }
- ms.getMessage("hello", null, null) : locale 정보가 없으므로 messages를 사용
- ms.getMessage("hello", null, Locale.KOREA) : locale 정보가 있지만, message_ko가 없으므로 messages를 사용
결과
MessageSourceTest 추가 - 국제화 파일 선택2
@Test void enLang() { assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello"); }
ms.getMessage("hello", null, Locale.ENGLISH) : locale 정보가 Locale.ENGLISH이므로 messages_en을 찾아서 사용
실행
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
'Spring > 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 카테고리의 다른 글
[김영한 스프링] 18. 검증1 Validation - 검증 요구사항 & 프로젝트 설정 V1 & 세팅 (0) 2023.08.29 [김영한 스프링] 17. 메시지, 국제화 - 웹 애플리케이션에 메시지, 국제화 적용하기 (0) 2023.08.28 [김영한 스프링] 15. 메시지, 국제화 - 프로젝트 설정 & 세팅 & 메시지, 국제화 소개 (0) 2023.08.25 [김영한 스프링] 14. 타임리프 스프링 통합과 폼 - 라디오 버튼 & 셀렉트 박스 (0) 2023.08.25 [김영한 스프링] 13. 타임리프 스프링 통합과 폼 - 멀티 체크 박스 (0) 2023.08.23 - basenames : 설정 파일의 이름을 지정한다.