2020-3-29 다시 시작하는 스프링(5) - 프로퍼티

프로퍼티

  • 다양한 방법으로 정의하는 설정값
  • Environment의 역할은 프로퍼티 소스 설정 및 프로퍼티 값 가져오기

우선순위

  • StandardServeletEnvironment의 우선순위
    • ServeletConfig 매개변수
    • ServletContext 매개변수
    • JNDI(java:com/env/)
    • JVM 시스템 프로퍼티(-Dkey=”value”)
    • JVM 시스템 환경변수(운영체제환경변수)

@PropertySource

  • Environment를 통해 프로퍼티를 추가
@Component
@PropertySource("classpath:/app.properties")
public class AppRunner implements ApplicationRunner {
    @Autowired
    ApplicationContext ctx;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment =  ctx.getEnvironment();
        System.out.println(environment.getProperty("app.name"));
    }
}
//vm options
-Dapp.name="vm option"

// app.properties
app.name=spring
  • 결과는 vm option이 출력된다. 이는 우선순위가 JVM시스템 프로퍼티(-Dkey)의 우선순위가 높기 때문이다.

MessageSource

  • MessageSource: 메세지를 다국화하는 방법
public interface MessageSource {
	@Nullable
	String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

	String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;

	String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

}
  • 메세지소스 인터페이스는 3개의 getMessage Overload되어있다.
  • code: message_xx.properties에 정의되어있는 key안에는 우리가 전달하고자 하는 메세지가 있다. 이것을 resolve해준다?
    • 예를 들어 message.properties파일에 message=hello {0} this is spring lecture {1}이라고 value를 선언하면 getMessage는 message.properties에 정의되어있는 key값(message)를 찾아서 args와 함께 resolve를 하는것이다.
  • args: 메세지 내부에 있는 파라미터들. 예를들어 메세지 hello {0}처럼 파라미터들을 전달해야되면 String []형태로 파라미터들을 순차적으로 전달한다.
  • Locale : locale은 Locale에 정의되있는 값들 ex) Local.KOREA, Local.US 등 지역성을 나타낸다.
  • return : 리턴된 결과는 resolve된 메세지의 결과를 나태낸다.

사용예시

  • 스프링부트에서는 messages.properties를 사용할 수있다.
  • messages.xxxx.properties로 사용하면 된다.
@Component
public class AppRunner implements ApplicationRunner {
    @Autowired
    ApplicationContext ctx;

    @Autowired
    private MessageSource messageSource;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        while (true) {
            System.out.println(messageSource.getMessage("message", new String[]{"jimmy", "1"}, Locale.US));
            System.out.println(messageSource.getMessage("message", new String[]{"재연", "1"}, Locale.KOREA));
            Thread.sleep(1000L);
        }
    }
}

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

	@Bean
	public MessageSource messageSource() {
		ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
		messageSource.setBasename("classpath:/messages");
		messageSource.setDefaultEncoding("UTF-8");
		messageSource.setCacheSeconds(3);
		return messageSource;
	}
}

//messages_en_US.properties
message=Hello {0} this is spring lecture {1} class
//messages_ko_KR.properties
message=안녕하세요 {0} 여기는 스프링 강좌 {1}번째 클래스에요
  • 메세지지 소스의 경우 메세지를 찾을 수 없으면 default 메세지를 리턴해준다.
  • 메세지의 릴로딩 기능을 만들 수 있다.
Written on March 29, 2020