MessageSource는 Spring에서 국제화(i18n)를 지원하기 위한 인터페이스로, 애플리케이션에서 다국어 메시지를 쉽게 관리할 수 있도록 도와줍니다. 보통 messages.properties 같은 파일을 사용하여 여러 언어에 대한 메시지를 정의하고, 필요할 때 해당 메시지를 가져올 수 있습니다.
1. MessageSource 설정
Spring Boot에서는 기본적으로 messages.properties 파일을 읽습니다.
다국어 지원을 위해 messages_ko.properties, messages_en.properties 등을 추가할 수 있습니다.
#path
spring.messages.basename=i18n/messages
spring.messages.encoding=UTF-8
src/main/resources 디렉토리에 [파일이름]_[언어코드]_[국가코드].properties
key-value 형식의 값 입력
- key=value, {index}
✔ {index} : argument가 바인딩 되는 부분
ex) greeting=Hello, so good {0}
ex) greeting=안녕, 진짜 반가워 {0}
greeting=Hello333444
farewell=Goodbye
welcome.message=Hello, {0}! Welcome to {1}.!@#@#@#@#@######
classpath: 내에 messages.properties파일을 만들 경우 파일을 다시 읽어들이지 않아 리르드가 안됨
ex ) this.messageSource.setBasename("classpath:i18n/messages");
package com.example.springmessage.config;
import java.nio.file.Paths;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
@Configuration
public class MessageConfig {
private final ReloadableResourceBundleMessageSource messageSource;
public MessageConfig() {
this.messageSource = new ReloadableResourceBundleMessageSource();
/**
* 📂 JAR 실행 디렉토리
├── myapp.jar
├── 📂 assets
│ ├── 📂 i18n
│ │ ├── messages.properties
│ │ ├── messages_ko.properties
│ │ ├── messages_en.properties
*/
String messageFilePath = "file:" + Paths.get(System.getProperty("user.dir"), "assets", "i18n", "messages").toString();
System.out.println("messageFilePath : " + messageFilePath);
this.messageSource.setBasename(messageFilePath); // 외부 파일 로드
this.messageSource.setCacheSeconds(3600); // 기본 캐시 유지 시간
this.messageSource.setDefaultEncoding("UTF-8");
}
@Bean
public MessageSource messageSource() {
return this.messageSource;
}
public void reloadMessages() {
// 캐시 지우기
messageSource.clearCache();
}
}
package com.example.springmessage.controller;
import java.util.Locale;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.springmessage.config.MessageConfig;
@RestController
public class MessageController {
@Autowired
private MessageSource messageSource;
@Autowired
private MessageConfig messageConfig;
@GetMapping("/message")
public String getMessage(@RequestParam(defaultValue = "en") String lang) {
Locale locale = new Locale(lang);
return messageSource.getMessage("greeting", null, locale);
}
@GetMapping("/message/dynamic")
public String getDynamicMessage(@RequestParam String name, @RequestParam String place, @RequestParam(defaultValue = "en") String lang) {
Locale locale = new Locale(lang);
return messageSource.getMessage("welcome.message", new Object[]{name, place}, locale);
}
// 특정 요청 시 메시지 캐시 리로드
@GetMapping("/message/reload")
public String reloadMessages() {
messageConfig.reloadMessages(); // 메시지 리로드
return "Message cache cleared!";
}
}
https://velog.io/@yu-jin-song/Spring-MessageSource
[Spring] MessageSource
메시지 국제화를 제공하는 인터페이스사용자의 Locale에 따라 표출되는 언어를 변경하는 서비스 메세지 설정 파일을 모아놓고 각 국가마다 로컬라이징→ 각 지역에 맞춘 메시지 제공ex) 한국에서
velog.io
'WEB개발 > Spring' 카테고리의 다른 글
[Spring] Request를 처리하는 주석 (Annotation) (0) | 2025.02.21 |
---|---|
Spring Reactive [Mono, Flux, DeferredResult, WebClient, Future] (0) | 2025.02.17 |
하이버네이트(Hibernate) & JPA(Java Persistence API) (0) | 2024.05.23 |
[Spring] 주석 1(Annotation) (0) | 2021.11.02 |