[Spring] Spring ์ดํ๋ฆฌ์ผ์ด์ ๋ฉ์์ง ๋ค๊ตญ์ด ๋ฐ ์ฌ๋ก๋ฉ ์ฒ๋ฆฌ
Spring IoC ์ปจํ ์ด๋ = ApplicationContext๊ฐ ๊ฐ๊ณ ์๋ ๊ธฐ๋ฅ ์ค MessageSource๋ ๊ตญ์ ํ(i18n)์ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋๋ฐ ์ด๋ฅผ ์ด์ฉํด์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ถ๋ ฅํ๋ ๋ฉ์์ง๋ฅผ ๋ค๊ตญํํ ์ ์๋ค.
1. ๋ฉ์์ง ํ์ผ ์์ฑ
resources ๋๋ ํ ๋ฆฌ ์๋์ messages.properties, messages_ko_KR.properties ํ์ผ์ ์๋ก ์์ฑํ๋ค.
์ฌ๊ธฐ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ถ๋ ฅํ ๋ฉ์์ง๋ฅผ messages.properties์๋ ์์ด๋ก, messages_ko_KR.proeprties์๋ ํ๊ตญ์ด๋ก ์์ฑํ ๊ฒ์ด๋ค.
ํ์ผ๋ช ์ ์คํ๊ฐ ๋์ง ์๋๋ก ์กฐ์ฌํ์.
ํ์ผ์ ์์ฑํ๊ณ ๋๋ฉด ์๋์ผ๋ก 'messages'๋ผ๋ ์ด๋ฆ์ resource bundle๋ก ๋ฌถ์ธ๋ค.
messages.properties์ messages_en_US.properties์๋ greeting=Hello, {0}๋ฅผ, messages_ko_KR.properties์๋ greeting=์๋ , {0}์ ์์ฑํ๋ค.
{0}์ ๋์ด์จ argument๊ฐ ๋ฐ์ธ๋ฉ๋ ๋ถ๋ถ์ด๋ค.
2. ๋ฉ์์ง ๋น ๋ฑ๋ก
1) Spring Boot๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ
Spring boot๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ฉ์์ง๋ฅผ ๋น์ผ๋ก ์ง์ ๋ฑ๋กํด์ผ ํ๋ค.
1
2
3
4
5
6
7
8
|
@Bean
public MessageSource messageSource() {
var messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
|
cs |
var๋ Java 10 ์ด์๋ถํฐ ์ง์๋๋ฏ๋ก 10 ๋ฏธ๋ง์ด๋ผ๋ฉด MessageSource ์ธ์คํด์ค๋ฅผ ResourceBundleMessageSource ํ์ ์ผ๋ก ์์ฑํด์ค๋ค.
setBasename() ๋ฉ์๋๋ก ๋ฉ์์ง ๋ฆฌ์์ค ๋ฒ๋ค์ ์ง์ ํ๊ณ ํ๊ธ์ด ๊นจ์ง์ง ์๋๋ก setDefaultEncoding() ๋ฉ์๋๋ก ๋ฌธ์ ์งํฉ์ ์ค์ ํ๋ค.
2) Spring Boot๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
Spring boot ๊ธฐ๋ฐ์ ํ๋ก์ ํธ์ผ ๊ฒฝ์ฐ ResourceBundleMessageSource๊ฐ ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก์ด ๋๊ณ ์ด ๋น์ด messages ๋ฆฌ์์ค ๋ฒ๋ค์ ๋ฉ์์ง ์์ค๋ก ์ฝ์ด์จ๋ค.
๋ฐ๋ผ์ ๋น์ ๋ฑ๋กํ์ง ์๊ณ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
3. ๋ฉ์์ง ์ถ๋ ฅ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import java.util.Locale;
@Component
public class AppRunner implements ApplicationRunner {
@Autowired
MessageSource messageSource;
@Override
public void run(ApplicationArguments args) throws Exception {
Locale.setDefault(Locale.ROOT);
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.getDefault()));
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.KOREA));
}
}
|
cs |
MessageSource ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ๊ณ getMessage()๋ก ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
getMessage()์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ๋ฉ์์ง ํ๋กํผํฐ์ key, ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ ๋ฉ์์ง ์ถ๋ ฅ ์ ์ ๋ฌํ argument, ์ธ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ Locale์ ์ค์ ํ๋ค.
์คํ ๊ฒฐ๊ณผ
์ฒซ ๋ฒ์งธ ์ถ๋ ฅ๋ฌธ์ messages.properties์ ๋ฉ์์ง๋ฅผ,
๋ ๋ฒ์งธ ์ถ๋ ฅ๋ฌธ์ messages_en_US.properties์ ๋ฉ์์ง๋ฅผ,
์ธ ๋ฒ์งธ ์ถ๋ ฅ๋ฌธ์ messages_ko_KR.properties์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ค.
4. ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ๋ฉ์์ง ๋ฆฌ์์ค Reload ํ๊ธฐ
MessageSource์ ๊ตฌํ์ฒด๋ฅผ ResourceBundleMessageSource๊ฐ ์๋ ReloadableResourceBundleMessageSource๋ฅผ ์ฌ์ฉํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ๋ฉ์์ง ๋ฆฌ์์ค ๋ณ๊ฒฝ์ reloadํ๊ฒ ํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ ์ ์๋ค.
MessageSource ๋น์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค.
1
2
3
4
5
6
7
8
9
|
@Bean
public MessageSource messageSource() {
var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3);
return messageSource;
}
|
cs |
ResourceBundleMessageSource๋ก ์์ฑํ ๋์ ๋ฌ๋ฆฌ ReloadableResourceBundleMessageSource๋ฅผ ์ฌ์ฉํ ๋๋ setBasename()์ "classpath:/messages" ํ์์ผ๋ก basename์ ์ค์ ํด์ผํ๋ค.
setCacheSeconds()๋ก ๋ฉ์์ง ์์ค๋ฅผ ์บ์ํ๋ ์ต๋ ์๊ฐ(์ด)๋ฅผ ์ค์ ํ๋ค.
์์ ๊ฐ์ด ์ค์ ํ๋ฉด 3์ด๊น์ง๋ ์บ์ฑํ๊ณ 3์ด๊ฐ ์ง๋๋ฉด ๋ฉ์์ง๋ฅผ ๋ค์ ์ฝ๋๋ค.
1
2
3
4
5
6
7
|
while (true) {
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.getDefault()));
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.US));
System.out.println(messageSource.getMessage("greeting", new String[]{"Leica"}, Locale.KOREA));
Thread.sleep(1000l);
}
|
cs |
๋ฉ์์ง ์ถ๋ ฅ ์ฝ๋๋ฅผ while๋ก ๊ฐ์ธ๊ณ Thread.sleep()์ ํธ์ถํ์ฌ 1์ด์ ํ๋ฒ์ฉ ๋ฉ์์ง๋ฅผ ์ฝ์ด ์ถ๋ ฅํ๋๋ก ๋ณ๊ฒฝํ๋ค.
ReloadableResourceBundleMessageSource๋ก MessageSource ๋น์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด์ ์คํ ์ค์ ๋ฉ์์ง ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ณ while๋ฌธ์ด ๋๋ฉด์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๋์ ๋ฉ์์ง ๋ด์ฉ์ ๋ฐ๊พธ๊ณ buildํด๋ณด์.
๋ฐ๋ ๋ฉ์์ง๊ฐ ์ ์ฉ๋ ๊ฒ์ด๋ค.
์คํ ๊ฒฐ๊ณผ
References
์ธํ๋ฐ - ๋ฐฑ๊ธฐ์ ๋์ ์คํ๋ง ํ๋ ์์ํฌ ํต์ฌ ๊ธฐ์
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ResourceLoader๋ก ํ ์คํธ ํ์ผ ์ถ๋ ฅํ๊ธฐ (Java 11) (0) | 2020.03.05 |
---|---|
[Spring] ApplicationEventPublisher๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ํ๋ก๊ทธ๋๋ฐ (0) | 2020.03.05 |
[Spring] EnvironmentCapable - Property ์ฌ์ฉํ๊ธฐ (0) | 2020.03.04 |
[Spring] EnvironmentCapable - Profile ์ฌ์ฉํ๊ธฐ (0) | 2020.03.04 |
[Spring] ๋น์ Scope - ์ฑ๊ธํค๊ณผ ํ๋กํ ํ์ (0) | 2020.03.03 |
๋๊ธ