test=en test
like.this.comma.ok=en 이렇게 콤마를 넣어서 구분값으로 써도 됩니다.
100=en 숫자도되요
replace.test=en 여기에 {0}값을 숫자 {1} 형태로 넣으면 치환변수로 쓸 수 있어요.
1. 메세지소스 properties 폴더와 파일 추가
1) 기본 리소스 폴더 아래(src/main/resources/)에 messages 폴더를 추가한다.
2) messages_ko_KR.properties 파일과 messages_en_US.properties 파일을 추가한다.
# 구조
src
└─ main
└─ resources
└─ messages
├─ messages_ko.properties
└─ messages_en.properties
* 참고: 인텔리j 에선 messages로 묶인 properties파일은 Resource Bundle로 묶인다.
2. 메세지 프로퍼티 작성하기
# messages_ko.properties
test=ko test
like.this.comma.ok=ko 이렇게 콤마를 넣어서 구분값으로 써도 됩니다.
100=ko 숫자는 자동으로 String Key로 인식되요
replace.test=ko 여기에 {0}값을 숫자 {1} 형태로 넣으면 치환변수로 쓸 수 있어요.
# messages_en.properties
test=en test
like.this.comma.ok=en 이렇게 콤마를 넣어서 구분값으로 써도 됩니다.
100=en 숫자는 자동으로 String Key로 인식되요
replace.test=en 여기에 {0}값을 숫자 {1} 형태로 넣으면 치환변수로 쓸 수 있어요.
- Messages는 단순하게 Key값과 Value를 key=value 와 같이 사용할 수 있다.
- 여기서는 테스트 데이터로 단순하게 앞에 "en"과 "ko"를 사용하여 설정했다.
* 중요: Locale에 맞는 message properties 파일 만들기
- "_{locale 값}"으로 만들어야 한다.
- java.util.Locale에 다국어 처리를 위한 값이 무엇인지 볼 수 있다.
ex) Locale.KOREA -> "ko_KR" -> "messages_ko_KR"
ex) Locale.KOREAN -> "ko" -> "messages_ko"
ex) Locale.ENGLISH -> "en" -> "messages_en"
* 참고: properties 파일 열기
Java에서 properties 파일은 기본적으로 ISO 8859-1 인코딩으로 읽게 되어있다.
이클립스는 기본 에디터에서 한글과 같은 값은 자동으로 ascii 값으로 치환하여 저장해주지만
인텔리j 에선 프로퍼티 파일을 열 때 따로 설정해주어야 한다.
- 인텔리j 설정
- [Preferences > Editors > File Encodings] 진입
- [Properties Files] 영역에 [Transparent native-to-ascii conversion] 체크박스 [v] 체크
- Ref: https://www.jetbrains.com/help/idea/properties-files.html#encoding
3. 자바 Config 추가
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.server.Encoding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import java.util.Locale;
@Log4j2
@Configuration
public class WebConfig {
@Bean
public LocaleResolver defaultLocaleResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(Locale.KOREAN);
log.info("localeResolver Bean Created.");
return localeResolver;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
Locale.setDefault(Locale.KOREAN); // 제공하지 않는 언어로 들어왔을 때 처리
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages/messages");
messageSource.setDefaultEncoding(Encoding.DEFAULT_CHARSET.toString());
messageSource.setDefaultLocale(Locale.getDefault());
messageSource.setCacheSeconds(600);
log.info("messageSource Bean Created. Default Charset is {} and Default Locale is {}",
Encoding.DEFAULT_CHARSET.toString(), Locale.getDefault());
return messageSource;
}
@Bean
public MessageSourceAccessor messageSourceAccessor (
@Autowired ReloadableResourceBundleMessageSource messageSource) {
return new MessageSourceAccessor(messageSource);
}
}
- "ReloadableResourceBundleMessageSource"를 Bean으로 만들어주면 기본 MessageSource를 대체한다.
- "LocaleResolver"의 기본 Locale을 서비스에 맞는 값으로 매핑해주었다.
- "MessageSourceAccessor"를 Bean으로 등록하므로써, MessageSource를 직접 사용할 때보다 편리하게 사용할 수 있게 하였다.
- .setBasename은 메세지소스로 사용할 프로퍼티의 정확한 prefix를 적어주어야한다.
예를 들어, 위에서 messages_{로케일}.properties 와 같은 형태가 아닌
msg_{로케일}.properties와 같은 형태로 prefix를 바꾸어 만들었다면
Basename에 들어갈 값은 "classpath:/messages/msg"가 된다.
4. 테스트 사용
package com.eduvation.tong.module.academy.student.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.web.bind.annotation.*;
@Log4j2
@RequiredArgsConstructor
@RestController
@RequestMapping(path="/")
public class TestController {
private final MessageSourceAccessor messageSource;
@GetMapping("/testcall")
public ArrayList<String> test (Locale locale){
String[] replaceValues = new String[]{"바인딩변수1번값", "바인딩변수2번값"};
ArrayList<String> msgs = new ArrayList<>();
msgs.add(messageSource.getMessage("test"));
msgs.add(messageSource.getMessage("like.this.comma.ok"));
msgs.add(messageSource.getMessage("100"));
msgs.add(messageSource.getMessage("replace.test", replaceValues));
msgs.add(messageSource.getMessage("test", Locale.ENGLISH));
msgs.add(messageSource.getMessage("like.this.comma.ok", Locale.ENGLISH));
msgs.add(messageSource.getMessage("100", Locale.ENGLISH));
msgs.add(messageSource.getMessage("replace.test", replaceValues, Locale.ENGLISH));
msgs.add(messageSource.getMessage("test", locale));
msgs.add(messageSource.getMessage("like.this.comma.ok", locale));
msgs.add(messageSource.getMessage("100", locale));
msgs.add(messageSource.getMessage("replace.test", replaceValues, locale));
return msgs;
}
}
- 사용 시에는 "MessageSourceAccessor"를 주입 받아 사용하면 된다.
5. 테스트 결과
'Java & Spring > Spring' 카테고리의 다른 글
[Spring & Boot][2.6.2] 스프링 프로퍼티 암복호화 Jasypt 예제 (0) | 2021.12.23 |
---|---|
[스프링부트] Gradle 에서 프로퍼티 / YAML / application 중복 오류 해결하기 (0) | 2021.12.07 |
spring-dev-tools를 통한 개발 시, 자동 반영(Reloading) 적용하기 (0) | 2020.02.14 |
스프링 배치 Spring Batch [1] 기본 개념 (0) | 2020.01.22 |
Springboot + Web 에서 /resources/static 정적 리소스 URL 접근 방법 (0) | 2020.01.12 |
WRITTEN BY