반응형
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. 테스트 결과

 

반응형

WRITTEN BY
데르벨준

,