[스터디/12기] 단순 CRUD는 그만! 웹 백엔드 시스템 구현(Spring Boot)에 참여를 하면서, Message 처리 부분을 참고하면서 이것 저것 찾아보며 정리해보았습니다.
메시지 설정 파일을 통합관리 할 수 있고, 각 국가마다 맞춰서 메시지를 설정할 수 있습니다.
(국제화(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})
basename : message 파일 경로(여러개를 사용할 경우, 콤마로 구분해서 사용 가능)
encoding : 인코딩 방식
cache-duration : 캐시 주기 설정, 기본값 forever
- PT1H : 1시간 (→ ISO 8601 표준에 정의 되어 있음.)
spring:
messages:
basename: i18n/messages
encoding: UTF-8
cache-duration: PT1H #
: 다양한 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 )🐵