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