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에서도 사용되기 때문에 확실히 숙지해야겠다.