스프링은 환경을 어떻게 조성할 수 있을까?(프로파일, 프로퍼티, 국제화)

반응형
반응형

peaceful

스프링으로 프로그램을 만들 때,
각자 환경을 조성 할 수 있도록 environment라는 기능을 제공한다.

환경을 조성하는 방법에는 여러가지가 존재하는데,
프로퍼티를 추가하는 방법과 프로파일을 추가하는 방법이 존재한다.

프로파일( == 프로필[profile])

메인 환경을 만드는 방법.
만들 고 싶응 빈에 다음 처럼 작성해줍니다.

@Service
@Profile("god")
public class God {
    
}

이 뜻은 프로파일명 god일때만 이 빈을 사용한다입니다.

이렇게 환경을 조성하는 대표적인 이유는
실제 서버와 테스트 서버를 구분짓기 위함이라 해석 할 수 있다.
즉, 테스트 서버에는 출시하기 어려운 것들을 실험? 할 수도 있다.

만약, 인텔리제이 얼티미티버전을 사용한다고 한다면,

VM options과 Active profiles에서 추가하면 쉽게 변경할 수 있다.

VM options => -Dspring.profiles.active="문자열"
Active profile => 프로파일 명 작성

기본적으로 스프링에서 프로파일을 이용하려면
java -Dspring.profiles.active="문자열" 작성하라구 하는데...
나는 잘 모르겠으므로 언급만하구 넘어간다.

다행스럽게도 테스트문에서는 프로파일을 바꿀 수 있는 방법을 제공한다.

@SpringBootTest
@ActiveProfiles("god")
class GodTest {

    @Test
    void test() {
      
    }
}

@ActiceProfiles를 이용하는 방법으로 이 테스트는 이제 "god"이라는 프로파일이 지배?한다는 뜻이다.

프로파일은 표현식 사용이 가능하다.

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition-profiles-java

역시 s가 붙어있는 이유가 있었어.

프로퍼티(속성[property])

프로파일로 전제적인 환경을 조성했다면,
프로퍼티로 세세한 작업을 해야한다. 
프로파일은 어떻게 보면 어떤 색깔의 도화지를 사용하느냐의 차이일뿐,
그곳에 어떤 그림을 그릴지, 그 무엇도 정한것이 없다.

내가 생각할때 프로퍼티가 존재하는 이유인 것 같다.

일반적으로 프로퍼티는
properties 환경에서 작성되어진다.

hello = world

appiication.properties라는 파일에 위 처럼 추가하였다고 생각해보자.

@Component
public class Application implements ApplicationRunner {

    @Autowired
    private Environment env;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        String hello = env.getProperty("hello");
        System.out.println(hello);
    }
}

그리구 이것을 실행해보면...

!!!!

만약, 프로퍼티 파일을 따로 만들 고 싶다면 어떻게 해야할까?
바로 propertise파일을 추가하면 된다.

hello = me
@Component
@PropertySource("app.properties")
public class Application implements ApplicationRunner {

    @Autowired
    private Environment env;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        String hello = env.getProperty("hello");
        System.out.println(hello);
    }
}

@PropertySource로 파일명을 등록하면....

!!!!

이렇게 나온다.

내가 나오고 싶은 것은 me인데... 
world가 나온다... property에는 우선순위가 있다는 것을 알 수 있다.
만약 me를 나오고 싶다면,
appiication.properties에 존재하는 hello라는 걸 지우면 해결된다.!

만약,@PropertySource를 지우면 아무것도 나오지 않는다.

우선순위가 존재하는 것을 확인했는데...
과연 이것이 전부일까?

공식문서에 따르면 다음과 같은 우선순위가 있다고 한다.

아직 정확히는 모르겠지만...
VM 옵션 vs properties옵션을 비교해보자.

vm 옵션
properties옵션

승자는?

더보기

VM옵션!

국제화

글로벌 시대인 만큼. 스프링에서는 다양한 언어를 제공하는 방법을 제공하고 있다.

만드는 방법은 간단하다.

messages_국가코드.properties

_국가코드를 입력하지 않으면, 기본 국가(여기는 한국)으로 설정된다.

System.out.println(Locale.getDefault());

나오는 정보가 기본 정보다.

국가 코드

영어: en
불어: fr
독일어: de
이탈리아어: it
일본어: ja
한국어: ko
중국어: zh
중국어(간체): zh_CN
중국어(정체자): zh_TW
불어(프랑스): fr_FR
독일어(독일): de_DE
이탈리아어(이탈리아): it_IT
일본어(일본): ja_JP
한국어(한국): ko_KR
영어(영국): en_GB
영어(미국): en_US
영어(캐나다): en_CA
불어(캐나다): fr_CA

 언어 (지역)으로 구분되며 
중국은 특이하게 추가적인 변수가 추가되어있다.

public static final Locale CHINA = SIMPLIFIED_CHINESE;
public static final Locale PRC = SIMPLIFIED_CHINESE;
public static final Locale TAIWAN = TRADITIONAL_CHINESE;

맨 밑 타이완을 뺴고 그냥 중국이라는 뜻이다.(뭐 대만도 중국이라 부를 수 도 있지만...)

가져오는 방법

이제 직접 파일을 만들어서 테스트 해보자.
파일은 이렇게 준비하였다.

MessageSource

        System.out.println(message.getMessage("to", new String[]{"한국말입니다."},Locale.getDefault()));
        System.out.println(message.getMessage("to", new String[]{"한국말입니다2."},Locale.KOREAN));
        System.out.println(message.getMessage("to", new String[]{"일본어입니다."},Locale.JAPANESE));
        System.out.println(message.getMessage("to", new String[]{"영어입니다."},Locale.ENGLISH));

확인 => 결과

구성은 다음과 같다.

value key args

value => getMessage에서는 code로 등장!
key => getMessage에서 등장하지 않음
args => new Object[]{}배열로 작성되어짐.
Object이므로 스트링이아닌 다른 객체도 가능 할 것 같다.

만약 직접 빈으로 등록해서 사용하고 싶다면?

@Bean
    public MessageSource messageSource() {
        var messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:/messages");
        messageSource.setDefaultEncoding("UTF-8");
        messageSource.setCacheSeconds(3);
        return messageSource;
    }

이렇게 사용하면 된다. 

반응형

'SPRING START!' 카테고리의 다른 글

AOP  (0) 2021.08.25
DI 와 IOC  (0) 2021.08.14
이벤트 발생시키기!!  (0) 2021.01.12
의존성 주입  (0) 2021.01.08
스프링과 bean  (0) 2021.01.07

댓글

Designed by JB FACTORY