[Spring] MessageSource

joyful·2021년 7월 2일
1

Java/Spring

목록 보기
4/28
post-thumbnail

1. 개요

  • 메시지 국제화를 제공하는 인터페이스

    💡 국제화(Internationaliztion)?

    사용자의 Locale에 따라 표출되는 언어를 변경하는 서비스
    *Locale(로케일) : 세계 각 국에서 사용하는 언어, 문자, 화폐 표시, 시간등에 대해 국제화 와 지역화를 통해 어떻게 표시할 지 정의한 매개 변수의 모음

  • 메세지 설정 파일을 모아놓고 각 국가마다 로컬라이징
    → 각 지역에 맞춘 메시지 제공
    ex) 한국에서 접속 → 한국어로 출력, 미국에서 접속 → 영어로 출력


2. 구현체

  • org.springframework.context.support.ResourceBundleMessageSource
    • 구성 : ResourceBundle 클래스와 MessageFormat 클래스 기반
    • 번들에 특정 이름으로 접근 가능
  • org.springframework.context.support.ReloadableResourceBundleMessageSource
    • <property name="cacheSeconds" value="5"/> 프로퍼티 설정으로 reloading
      → application 실행 중에 번들 변경 가능
    • 메시지 내용 캐시하여 소유
    • 인터벌 지정 → 초단위 간격으로 메시지 파일 재로딩
      => 어플리케이션 종료 없이 properties 파일 수정으로 메시지 값 변경 가능
  • org.springframework.context.support.StaticMessageSource
    • MessageSource의 가장 간단한 구현체
    • 기본적인 국제화 지원
    • 테스트 용도

3. 사용방법

  1. 메시지 설정 파일 셋업
    a. src/main/resources 디렉토리에 [파일이름]_[언어코드]_[국가코드].properties 형식으로 메시지 파일 추가

    • 예시
      • message.properties
        • 기본 메시지
        • 시스템의 언어 및 지역에 맞는 프로퍼티 파일 존재하지 않을 경우 사용
      • message_en.properties : 영어 메시지
      • message_ko.properties : 한글 메시지
      • message_en_UK.properties : 영국을 위한 영어 메시지

    b. key-value 형식의 값 입력

    • key=value, {index}
      {index} : argument가 바인딩 되는 부분
      ex) greeting=Hello, so good {0}
      ex) greeting=안녕, 진짜 반가워 {0}
  2. 메시지 빈 등록

    • Spring Boot 사용하는 경우
      : ResourceBundleMessageSource가 빈으로 자동 등록
        → messages 리소스 번들을 메시지로 읽어옴
        ∴ 빈을 등록하지 않고 바로 사용 가능
    • Spring Boot 사용하지 않는 경우
    @Bean
    public MessageSource messageSource() {
    
    	var messageSource = new ResourceBundleMessageSource();  //Java 10 이상부터 var 지원
        // MessageSource messageSource = new ResourceBundleMessageSource();  //Java 10 이전
        messageSource.setBasename("messages");  //메시지 리소스 번들 지정
        messageSource.setDefaultEncoding("UTF-8");  //문자 집합 설정 - 한글 깨짐 방지
        
        return messageSource;
    }

4. 메시지 출력

@Component
public class AppRunner implements ApplicationRunner {
 
    @Autowired
    MessageSource messageSource;
 
    @Override
    public void run(ApplicationArguments args) throws Exception {

        System.out.println(messageSource.getMessage("greeting", new String[]{"java"}, Locale.US));
        System.out.println(messageSource.getMessage("greeting", new String[]{"java"}, Locale.KOREA));
    }
}
안녕, 진짜 반가워 java
Hello, so good java

5. 어플리케이션 실행 중 메시지 리소스 Reload

@Bean
public MessageSource messageSource(){
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:/messages");  //basename 설정
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setCacheSeconds(5);  //메시지 소스 캐시하는 최대 시간(초) 설정
    
    return messageSource;
}



📖 참고

profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글