-
Spring MVC - 스프링에서 제공하는 MessageSource 사용 방법 (메시지와 국제화 기능)Spring/Spring MVC 2022. 2. 5. 03:04728x90반응형
메시지(Message)와 국제화 기능
HTML이나 Java에서 사용하는 메시지를 관리해주는 것이 메시지 기능이다. 예를 들어 특정 메시지가 한 곳이 아닌 여러 곳에서 사용하고 있을 때, 수정이 필요하면 각 파일마다 해당 메시지를 찾아서 수정해야 한다. 1~2개면 괜찮겠지만 수십 곳에서 사용한다면 찾아서 수정하는 게 여간 불편한 게 아니다. 이러한 불편함을 스프링이 기본적인 메시지와 국제화 기능을 모두 제공하고, 타임리프도 스프링에서 제공하는 메시지와 국제화 기능을 편리하게 사용할 수 있도록 제공한다.
국제화 기능이란 메시지 파일을 각 나라별로 관리하는 기능을 말한다. 서버는 HTTP accept-language 해더 값을 이용하여 해당하는 message 언어를 선택해준다.
messages_en.propertis에서 메시지 ex) item.itemName=Item Name
messages_ko.propertis에서 메시지 ex) item.itemName=상품명
영어를 사용하는 곳에서 요청이 오면 messages_en.propertis에 등록된 메시지가 보이도록 하고
한국어를 사용하는 곳에서 요청이 오면 messages_ko.propertis에 등록된 메시지가 보이도록 하는 기능이다.
MessageSource 설정
메시지 관리 기능을 사용하려면 스프링이 제공하는 MessageSource 인터페이스를 상속 받는 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록하면 된다. 스프링 부트를 사용하면 자동으로 등록을 해준다. 따라서 메시지 기능을 사용하기 위해 따로 빈 등록은 안해줘도 된다.
@SpringBootApplication public class ItemServiceApplication { public static void main(String[] args) { SpringApplication.run(ItemServiceApplication.class, args); } /* 스프링 부트가 자동으로 등록해주는 빈 @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); messageSource.setDefaultEncoding("utf-8"); return messageSource; } */ }
- setBasenames("messages")
- 기본적으로 messages.properties 파일을 읽어온다.
- 국제화 기능에 사용되는 properties파일들도 messages.properties파일을 읽어오면서 같이 읽어온다. - default 파일 경로 /resources/ 에서 properties파일들을 찾는다.
- /resources/messages.properties - setDefaultEncoding("utf-8")
- 인코딩 정보를 지정한다. default로 utf-8을 사용
스프링 부트가 자동으로 default로 지정된 설정들로 메시지 기능을 사용하게 한다. 만약 추가 설정이 필요하다면 application.properties 파일에서 원하는 설정들을 추가할 수 있다.
더보기spring.messages.basename=messages,errors
- MessageSource 빈 등록시 자동으로 읽어올 파일 설정
- messages.properties는 MessageSource 빈 등록시 기본으로 등록되는 파일
- 위 설정은 errors.properties를 읽어오기위해 설정을 추가한 것이다.
그 외 다른 설정이 궁금하다면 다음 링크를 참조
Common Application Properties (spring.io)
MessageSource 사용
아래 2개의 properties 파일을 만들고 간단하게 테스트 코드를 통해 사용하는 방법을 알아보자.
messages.properties
hello=안녕 메시지 hello.name=안녕 메시지 {0}
messages_en.properties
hello=hello message hello.name=hello message {0}
메시지 조회
- getMessage("hello", null, null)
code : hello
args : null
locale : null
@SpringBootTest public class MessageSourceTest { @Autowired MessageSource ms; @Test void helloMessage() { String result = ms.getMessage("hello", null, null); assertThat(result).isEqualTo("안녕 메시지"); } }
존재하지 않는 메시지 조회
- 메시지가 없는 경우에는 NoSuchMessageException이 발생
@Test void notFoundMessageCode() { assertThatThrownBy(() -> ms.getMessage("no_code", null, null)) .isInstanceOf(NoSuchMessageException.class); }
기본 메시지 설정 (defaultMessage)
- defaultMessage가 설정되어 있으면 메시지가 없을 때 defaultMessage를 반환한다.
- getMessage("no_code", null, "기본 메시지", null)
code : no_code
args : null
defaultMessage : "기본 메시지"
locale : null
@Test void notFoundMessageCodeDefaultMessage() { String result = ms.getMessage("no_code", null, "기본 메시지", null); assertThat(result).isEqualTo("기본 메시지"); }
메세지 조회 - 매개변수 사용
- 매개변수를 전달하여 {0} 부분 치환
- hello.name=안녕 메시지 {0} → hello.name=안녕 메시지 Spring
@Test void argumentMessage() { String message = ms.getMessage("hello.name", new Object[]{"Spring"}, null); assertThat(message).isEqualTo("안녕 메시지 Spring"); }
국제화 파일 선택
- Locale 정보를 기반으로 국제화 파일을 선택해준다.
- Locale이 en_US의 경우 messages_en_US → messages_en → messages 순서로 찾는다
- 즉, 해당 국제화 파일이 없다면 default 파일인 messages 를 선택하게 된다.
@Test void defaultLang() { assertThat(ms.getMessage("hello", null, null)).isEqualTo("안녕 메시지"); assertThat(ms.getMessage("hello", null, Locale.KOREA)).isEqualTo("안녕 메시지"); }
영어 국제화 파일을 선택하는 방법은 다음과 같다.
@Test void enLang() { assertThat(ms.getMessage("hello", null, Locale.ENGLISH)).isEqualTo("hello message"); }
728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - 검증(Validation) 직접 구현하기 (0) 2022.02.05 Spring MVC - 타임리프로 MessageSource에 등록된 메시지 사용하기 (0) 2022.02.05 Spring MVC - 타임리프(Thymeleaf)을 사용한 Select box(셀렉트 박스) (0) 2022.02.04 Spring MVC - 타임리프(Thymeleaf)을 사용한 Radio button(라디오 버튼) (0) 2022.02.04 Spring MVC - 타임리프(Thymeleaf)을 사용한 multi checkbox(멀티 체크박스) (0) 2022.02.04 - setBasenames("messages")