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));
	}
}
  1. null일 경우, default값으로 KOREAN으로 지정 했으므로 messages_ko.properties.
  2. JAPANESE일 경우, messages_jp.properties(?)가 없기 때문에 messages.properties.
  3. 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);
	}
}