기존(310)/🏀SpringBoot

[스프링부트] 스프링 메시지 소스 설정 구현

조각남자 2022. 10. 29. 10:36

 

 

1. Spring 은 기본적으로 메시지 관리기능을 제공한다.

메시지 관리 기능을 사용하려면 스프링이 제공하는

 

(일반스프링사용)

"MessageSources" 를 스프링 빈으로 등록 해야하고 

 

"MessageSources" 는 인터페이스이고 구현체인 "ResourceBundleMessageSources" 를 빈으로 등록하면된다.

 

 

(스프링부트 사용시)

MessageSources 등록안해도 자동으로 적용

 

1. 직접구현 할때만 APPICATION 필요 ( 스프링부트가 지원해줌 )

@Bean
public MessageSource messageSource(){
   ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
   messageSource.setBasenames("resources-message.propertiece","resources-error.propertiece");
   messageSource.setDefaultEncoding("Utf-8");
   return messageSource;
}

 

 

 

2.스프링 부트가 자동적으로 지원해줌 

 

스프링 부트를 사용하면 스프링부트가 

자동으로 "MessageSources" 를 스프링 빈으로(@Bean) 으로 등록한다

 

"appication.properties"  스프링부트 메시지 소스설정

spring.messages.basename=messages,config.i18n.messages

 

ex ) config.i18n.messages == resourecs.config.i18m.messages 

라는 경로파일 이름이다.

 

 

"appication.properties"  스프링부트 메시지 소스설정 ( default 값")

 

spring.messages.basename=messages

"appication.properties"  스프링부트 메시지 소스설정 ( 주석처리해도 기본값 적용")

#spring.messages.basename=messages

 

아래내용은 Spring 홈페이지에 가서 자동으로 스프링 빈 등록되는 걸 참고하는 사이트 

 

 

Common Application Properties (spring.io)

 

Common Application Properties

 

docs.spring.io

 

 

"message" 를 스프링 빈으로 등록하지않고

관련된 별도의 설정을 하지않으면

 

default 값인 "messages" 이름으로 기본 등록된다 

 

 

 

               중요

 

ex ) "messages_korea.properties" , 

"message_english.properties"

파일만 등록하면  자동으로 인식된다

 

"messages.properties" 와 "message_en.properties" 를 만들어볼게요

 

 

                                           messages.properties   내용

                                            messages_en.properties   내용

 

 

 

프로퍼티 파일까지 다 만들었으면 test 파일에서 테스트를 해볼게요

 

 

 

 

 

test.message.MesaageSourecesTest

package hello.itemservice.message;


import org.assertj.core.api.Assertions;
import org.assertj.core.api.AssertionsForClassTypes;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;

@SpringBootTest
public class MessageSourcesTest {



    @Autowired
    MessageSource messageSource;


    @Test
    void Message(){
        String result = messageSource.getMessage("hello",null,null,null);
        AssertionsForClassTypes.assertThat(result).isEqualTo("여기한국서버야");

    }
}

 

 

실행하게되면 성공 표시가 뜬다

 

 

 

간혹 ?? 표시가 되서 성공 오류가 뜨는데 UTF-8 로 파일 인코딩을 해야함

 

 

 

 

package hello.itemservice.message;


import org.assertj.core.api.Assertions;
import org.assertj.core.api.AssertionsForClassTypes;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;

import java.util.Locale;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

@SpringBootTest
public class MessageSourcesTest {



    @Autowired
    MessageSource messageSource;


    @Test
    void Message(){
        String result = messageSource.getMessage("hello",null,null,null);
        AssertionsForClassTypes.assertThat(result).isEqualTo("여기한국서버야");

    }


    @Test
    void notFoundMessageCode(){

        assertThatThrownBy(() -> messageSource.getMessage("no_code",null,null)) //no_code란게 메시지프로퍼티에없음
                .isInstanceOf(NoSuchMessageException.class); //예외처리

    }

    @Test
    void notFoundMessageCodeDefalut(){
        String result = messageSource.getMessage("no_code",null,"기본 메시지",null);
        assertThat(result).isEqualTo("기본 메시지"); // 메시지를 못찾으면 defalt 메시지 찾음
    }


    @Test
    void argumentMessage(){
        String result = messageSource.getMessage("hello.name",new Object[]{"spring"},null);
        assertThat(result).isEqualTo("한국 spring"); // 한국 {0} == {0} <= 이부분이 spring 으로 변환
    }

    @Test
    void defaultLang(){
        assertThat(messageSource.getMessage("hello",null,null)).isEqualTo("여기한국서버야");
        assertThat(messageSource.getMessage("hello",null, Locale.KOREA)).isEqualTo("여기한국서버야");
    }


    @Test
    void enLang(){
        assertThat(messageSource.getMessage("hello",null,Locale.ENGLISH)).isEqualTo("hi"); //영어버전
    }
}