spring(boot)
[message] 1.properties방식
수학소년
2023. 6. 6. 13:59
client에서 아래 처럼 사용(하도록 만들꺼임)
MessageUtil.getMessage("messageCode", new Object[] {"args1", "args2"}, Locale.KOREAN);
MessageUtil
public class MessageUtil {
private static Locale defulatLocale = Locale.KOREAN;
public static String getMessage(String messageCode, Object[] args, Locale locale) {
if (locale == null) locale = defulatLocale;
MessageSource messageSource = (MessageSource) BeanUtil.getBean("messageSource");
return messageSource.getMessage(messageCode, args, locale);
}
}
BeanUtil은 등록된 Bean을 불러다 쓸려고 만든건데,
해당 기능을 하는 spring 기본 method를 찾을 수가 없어서 따로 만들어 봄
MessageSource
@Configuration
public class MessageConfig {
@Bean
public MessageSource messageSource(){
// ROOT로 해야 messages_ko.properties 아닌 messages.properties 인식
Locale.setDefault(Locale.ROOT);
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames(
"classpath:/messages/messages",
"classpath:/messages/messages_en",
"classpath:/messages/messages_ko"
); //basename 설정
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(5); //메시지 소스 캐시하는 최대 시간(초) 설정
return messageSource;
}
}
messages*.properties 파일들은 resources에 위치 시키거나 resources/messages에 위치.
resources에 있다면, 위와 같이 따로 설정을 안해도 됌.(setBasenames 안해도 됌)
ReloadableResourceBundleMessageSource 는 messages*.properties 파일들이 변경됐을 때, 인식하도록 하는거라는데..
properties파일을 수정했더니 devtools때문에 재시작 되갤래
재시작 끄고 다시 properties수정하고 메시지코드 조회 하니까 불러와지긴 함.. (이게 맞는지..)
message.properties
// messages.properties
only=only {0}
all=all {0}
// messages_ko.properties
all=ko {0}
ko1=ko1 {0}
// messages_en.properties
all=en {0}
MessageUtilTest
@SpringBootTest
public class MessageUtilTest {
@Test
public void getmessage() throws Exception {
assertEquals("only java1", MessageUtil.getMessage("only", new String[]{"java1"}, null));
assertEquals("all java1", MessageUtil.getMessage("all", new String[]{"java1"}, Locale.JAPANESE));
assertEquals("ko java1", MessageUtil.getMessage("all", new String[]{"java1"}, null));
assertEquals("ko java1", MessageUtil.getMessage("all", new String[]{"java1"}, Locale.KOREA));
assertEquals("en java1", MessageUtil.getMessage("all", new String[]{"java1"}, Locale.US));
assertEquals("en java1", MessageUtil.getMessage("all", new String[]{"java1"}, Locale.ENGLISH));
assertEquals("ko1 java1", MessageUtil.getMessage("ko1", new String[]{"java1"}, null));
assertEquals("ko1 java1", MessageUtil.getMessage("ko1", new String[]{"java1"}, Locale.CANADA));
assertEquals("ko1 java1", MessageUtil.getMessage("ko1", new String[]{"java1"}, Locale.KOREAN));
assertEquals("ko1 java1", MessageUtil.getMessage("ko1", new String[]{"java1"}, Locale.ENGLISH));
}
}
- null일 경우, default값으로 KOREAN으로 지정 했으므로 messages_ko.properties.
- JAPANESE일 경우, messages_jp.properties(?)가 없기 때문에 messages.properties.
- ko1은 messages_ko.preperties에만 있는데, 모든 messages*.properties를 뒤져서 찾는지,, 어떤 Locale을 보내도 messages_ko.properties에서 가져옴
BeanUtil
public class BeanUtil {
public static Object getBean(String beanId) {
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
return applicationContext.getBean(beanId);
}
}