Summary
- SpringBoot 를 사용한다면 application.properties 를 선언해서 MessageSource 를 관리하자.
- MessageAutoConfiguration 은 MessageSource 빈을 선언하지 않으면 자동 설정된다.
- application.properties 에서 spring.messages 로 시작하는 property 를 탐색해서 MessageSource 를 생성한다.
1. MessageSource 설정 및 선언 방법
[1] MessageSource 선언 방법
(1) application.properties 선언하는 방법
spring.messages.basename=message/messages
spring.messages.encoding=UTF-8 # default
spring.messages.fallbackToSystemLocale=false
(2) MessageSource Bean 선언
@Configuration
public class MessageSourceConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("customMessage/messages");
messageSource.setFallbackToSystemLocale(false);
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
[2] message 선언 방법
- basename 하위에 message_언어코드_국가코드.properties(.xml) 선언하기
2. MessageSourceAutoConfiguration 을 확인해보자
[1] META-INF/spring/spring-autoconfigure-metadata.properties
- META-INF/spring/spring-autoconfigure-metadata.properties 를 확인해보면 MessageSourceAutoConfiguration 이 존재하는 것을 확인
[2] MessageSourceAutoConfiguration 활성 조건 확인
- 위치 : org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
@ConditionalOnMissingBean(name = AbstractApplicationContext.*MESSAGE_SOURCE_BEAN_NAME*, search = SearchStrategy.*CURRENT*)
- messageSource bean 이름이 존재하지 않을 경우
- SearchStrategy
- BeanFactory 계층 구조에서 bean 에 대한 명명된 검색 전략.
- CURRENT : Search only the current context.
@Conditional(ResourceBundleCondition.class)
- ResourceBundleCondition 의 조건을 만족할 경우, MessageSourceAutoConfiguration 을 실행한다.
(1) ResourceBundleCondition
getMatchOutcome
- basename 을 application.properties(application.yml) 에서 spring.messages.basename 속성에 대한 값을 가져온다. 없을 경우, “messages” 문자열 반환
- cache 에 basename 으로 저장된 값이 있는지 확인한다. 만약 저장된 값이 없을 경우, getMatchoutcomeForBasename 을 호출하고 결과 값을 outcome 에 할당한다.
- outcome 을 cache 변수에 할당한다.
getMatchoutcomeForBasename
- basename 리스트를 만들고 getResources 에 해당 basename 을 담아 호출한다.
- getResource() 리턴 값인 Resource 의 값 존재유무를 확인한다.
- 존재하는 자원이 있다면, match = true 인 outcome을 반환한다.
getResources
- classpath 내에 basename에 해당하는 properties 파일이 있는지 찾아서 반환한다.
- classpath 내에 basename에 해당하는 properties 파일이 없다면 자동 설정이 안된다.
- (따라서 messages.properties 와 같은 기본 파일을 설정해두는 것이 좋을 듯 하다.)
[3] MessageSource 생성 조건을 확인해보자.
- MessageSourceProperties 를 설정하고 MessageSource 을 빈으로 생성한다.
[4] MessageSource : AutoConfiguration vs Custom
(1) AutoConfiguration : properties 기반 설정
spring.messages.basename=message/messages
spring.messages.encoding=UTF-8
spring.messages.fallbackToSystemLocale=false
- fallbackToSystemLocale : 요청받은 locale 에 대한 메세지 파일이 없을 때, 시스템 locale을 사용할 것인지에 대한 옵션
- true : 환경설정 언어에 해당하는 영어용 메세지 파일을 가져온다.
- false : 기본 메세지 파일에서 메세지를 가져온다.
(2) Custom : MessageSource 빈 선언
@Configuration
public class MessageSourceConfig {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasenames("customMessage/messages");
messageSource.setFallbackToSystemLocale(false);
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
(3) 결론 : Custom 설정을 가져온다.
@RequiredArgsConstructor
@RestController
public class testController {
private final MessageSource messageSource;
@GetMapping()
public ResponseEntity<String> printHello() {
return ResponseEntity.status(200).body(messageSource.getMessage("hello", null, LocaleContextHolder.getLocale()));
}
}
- MessageSourceAutoConfiguration 에서 messageSource 이름으로 시작하는 MessageSource 이 있으면 자동 설정이 활성화되지 않는다.
// 여기
@ConditionalOnMissingBean(name = AbstractApplicationContext.MESSAGE_SOURCE_BEAN_NAME, search = SearchStrategy.CURRENT)
public class MessageSourceAutoConfiguration {
Reference
'spring > summary' 카테고리의 다른 글
Spring REST Docs + Swagger UI 를 통한 API 문서화 (1) | 2024.12.07 |
---|---|
비관적 락 vs 낙관적 락(In JPA) (0) | 2024.11.28 |
[kurly tech blog] Redisson, Spring AOP 기반 분산락 적용 방법 summary (0) | 2024.11.26 |
Spring Batch 기반 회원 삭제 배치 삽질 기록 (0) | 2024.09.03 |
[Spring Batch] Job 실행 프로퍼티, JobParameter, Scope (0) | 2024.08.26 |