본문 바로가기

개발/Spring

IoC - MessageSource

반응형

ApplicationContext 에서 상속하는 MessageSource 인터페이스를 이용!

 국제화(i18n) 기능을 제공하는 인터페이스 

1. 메시지 소스 파일 생성
 - 리소스 아래에 messages.properties / messages_ko_KR.properties 파일 생성 
  스프링 부트를 사용하면 Resource Bundle 이 빈으로 등록 되어 별다른 설정 없이 messages.priperties 파일을 사용 가능하다. 

 - message.properties 파일 내용 

2. 메시지 호출

package com.bpkim.demospring51;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.Locale;

@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[]{"bpkim"}, Locale.KOREA));
        System.out.println(messageSource.getMessage("greeting", new String[]{"bpkim"}, Locale.getDefault()));
    }
}

-   실행결과

3. 릴로딩 기능이 있는 메시지 소스 사용하기 
  - 메시지를 읽어오도록 빈 등록

package com.bpkim.demospring51;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;

@SpringBootApplication
@PropertySource("classpath:/app.properties")
public class Demospring51Application {

    public static void main(String[] args) {
        SpringApplication.run(Demospring51Application.class, args);
    }

	// 3초마다 메시지를 읽어올 빈 등록
    @Bean
    public MessageSource messageSource(){
        ReloadableResourceBundleMessageSource messageSource =new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(3);
        return messageSource;
    }

- 보여주기 

package com.bpkim.demospring51;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.Locale;

@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception{

        while(true){
            System.out.println(messageSource.getMessage("greeting", new String[]{"bpkim"}, Locale.KOREA));
            System.out.println(messageSource.getMessage("greeting", new String[]{"bpkim"}, Locale.getDefault()));
            Thread.sleep(1000l);
        }
    }
}

- 실행 
 실행 도중 message_ko_KR.properties 파일을 변경 > 빌드 하여 확인 해본다.

반응형

'개발 > Spring' 카테고리의 다른 글

Ioc 컨테이너 - ResourceLoader  (0) 2021.04.22
IoC - ApplicationEventPublisher  (0) 2021.04.11
IoC - Environment - 프로퍼티  (0) 2021.04.11
IoC - Environment - 프로파일  (0) 2021.04.10
IoC - 빈의 스코프  (0) 2021.04.06