SPRING
[SPRING] MessageSource을 활용한 메시지관리
steadyMan
2022. 6. 28. 02:17
상황마다 사용자에게 전달해야 하는 메시지가 있다. 알림 메시지, 경고 메시지 등등
이런 메세지를 각각의 로직에 직접 입력하여 사용할 수 있지만 메시지를 한 곳에서 관리한다면 추후 수정이 필요할 때
일괄로 변경할 수 있는 등의 장점이있다.
Spring은 메세지를 일괄로 관리할 수 있는 기능을 제공하는데 이러한 기능을 제공하는데 바로 MessageSource이다.
개인적인 학습의 결과물을 정리합니다.
Project Metadata
- Project: Gradle Project
- Language: Java 11
- Framework : Spring Boot: 2.5.x
MessageSource등록
스프링은 MessageSource의 구현체를 직접 등록하지 않으면 "messages"라는 이름으로 기본 등록된다.
기본 등록되는 properties의 정보를 변경하려면 application.properties에서 설정 가능하다.
// application.properties
spring.messages.basename="FileName"
spring.messages.encoding=UTF-8
MessgeSource Bean 직접 등록
/**
* 메세지 국제화를 위한 MessageSource Bean 등록
* @return MessageSource
*/
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("messages", "errors"); // properties 대상 파일명
messageSource.setDefaultEncoding("UTF-8"); // 인코딩정보 지정
return messageSource;
}
파일위치는 /resources/*.properties 가 기본이다.
메시지 입력
// messages.properties
dog.name=강아지 이름
dog.age=강아지 나이
hello.master=안녕하세요 {0}
메시지 불러오기
MessageSource 인터페이스는 오버로드된 3개의 메서드가 있는데 해당 메서드를 통해 메세지를 불러올 수 있다.
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;
}
파라미터 정보
- code : properties파일의 key
- args : 메세지 파라미터
- Locale : Locale(국가)정보
code값에 해당하는 key가 없다면 NoSuchMessageException이 발생한다.
이는 defaultMessage를 입력하여 방지할 수 있다.
@SpringBootTest
public class MessageTest {
@Autowired
MessageSource ms;
@Test
void message() {
String message = ms.getMessage("dog.name", null, null);
Assertions.assertThat(message).isEqualTo("강아지 이름");
String message2 = ms.getMessage("hello.master", new Object[]{"Jang"}, null);
Assertions.assertThat(message2).isEqualTo("안녕하세요 Jang");
}
}
파라미터는 배열로 여러 개를 입력할 수 있다.
Locale이 null일 경우 messages.properties을 사용한다.
MessageSource는 메시지를 한 곳에서 관리할 수 있다는 점에서도 충분히 중요하지만
추후에 Validation에서도 사용되기 때문에 확실히 숙지해야겠다.