Message 관리

midas·2022년 3월 6일
0
post-custom-banner

Spring MessageSource


[스터디/12기] 단순 CRUD는 그만! 웹 백엔드 시스템 구현(Spring Boot)에 참여를 하면서, Message 처리 부분을 참고하면서 이것 저것 찾아보며 정리해보았습니다.

MessageSource란?

메시지 설정 파일을 통합관리 할 수 있고, 각 국가마다 맞춰서 메시지를 설정할 수 있습니다.
(국제화(i18n)을 제공하는 인터페이스)

메시지 설정 파일 생성

메시지 설정 파일은 [파일이름][언어][국가].properties 형식으로 아래와 같이 추가할 수 있습니다.

message.properties: 기본 메시지
message_en.properties : 영어
message_ko.properties : 한글
message_jp.properties : 일본
message_en_UK.properteis : 영국을 위한 영어 메시지

설정파일에는 key-value 형식의 값을 아래와 같이 등록하면 됩니다.

# message.properties
error.notfound=NotFound
error.notfound.details=Could not found ''{0}'' with query values ({1})

application.yml - 메시지 관련 설정하기

basename : message 파일 경로(여러개를 사용할 경우, 콤마로 구분해서 사용 가능)
encoding : 인코딩 방식
cache-duration : 캐시 주기 설정, 기본값 forever
- PT1H : 1시간 (→ ISO 8601 표준에 정의 되어 있음.)

spring:
  messages:
    basename: i18n/messages
    encoding: UTF-8
    cache-duration: PT1H #

MessageSourceAccessor

: 다양한 getMessage 메서드를 제공하는 MessageSource를 쉽게 접근하게 해주는 helper class


MessageSourceAccessor 빈 등록

import com.midas.facebook.util.MessageUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.MessageSourceAccessor;
@Configuration
public class ServiceConfig {
  @Bean
  public MessageSourceAccessor messageSourceAccessor(MessageSource messageSource) {
    MessageSourceAccessor messageSourceAccessor = new MessageSourceAccessor(messageSource);
    MessageUtils.setMessageSourceAccessor(messageSourceAccessor); // ⚡️ 아래의 MessageUtil 클래스에 세팅
    return messageSourceAccessor;
  }
}

MessageUtils 클래스 생성

import org.springframework.context.support.MessageSourceAccessor;
import static com.google.common.base.Preconditions.checkState;
public class MessageUtils {
  private static MessageSourceAccessor messageSourceAccessor;
  public static String getMessage(String key) {
    checkState(null != messageSourceAccessor, "MessageSourceAccessor is not initialized.");
    return messageSourceAccessor.getMessage(key);
  }
  public static String getMessage(String key, Object... params) {
    checkState(null != messageSourceAccessor, "MessageSourceAccessor is not initialized.");
    return messageSourceAccessor.getMessage(key, params);
  }
  public static void setMessageSourceAccessor(MessageSourceAccessor messageSourceAccessor) {
    MessageUtils.messageSourceAccessor = messageSourceAccessor;
  }
}

Exception 클래스에 사용하기 → ⭐️ 프로젝트에 사용할 때는 공통부분은 추상클래스로 분리해야됨!

public class NotFoundException extends RuntimeException {
  static final String MESSAGE_KEY = "error.notfound";
  static final String MESSAGE_DETAILS = "error.notfound.details";
  private final Object[] params;
  public NotFoundException(String messageKey, String detailKey, Object[] params) {
    this.messageKey = messageKey;
    this.detailKey = detailKey;
    this.params = params;
  }
  public NotFoundException(String targetName, String message) {
    this(MESSAGE_KEY, MESSAGE_DETAILS, new String[]{targetName, message});
  }
  @Override
  public String getMessage() {
    return MessageUtils.getMessage(MESSAGE_DETAILS, params);
  }
  @Override
  public String toString() {
    return MessageUtils.getMessage(MESSAGE_KEY);
  }
}

참고

[스터디/12기] 단순 CRUD는 그만! 웹 백엔드 시스템 구현(Spring Boot)
[Spring] 메세지소스(MessageSource)를 통한 메세지 국제화, 메세지 소스 리로딩(MessageSource Reloading)
MessageSourceAccessor 클래스 공식문서
🙈[SpringBoot] i18n 다국어 처리하기 ( MessageSource )🐵

profile
BackEnd 개발 일기
post-custom-banner

0개의 댓글