본문 바로가기

WEB개발/Spring

[Spring] MessageSource 다국어

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