IoC 컨테이너 - Environment

ApplicaionContext가 상속받고 있는 것 중 EnvironmentCapable 을 알아보자.

package org.springframework.context;

import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.core.env.EnvironmentCapable;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.lang.Nullable;

public interface ApplicationContext extends EnvironmentCapable, 
        ListableBeanFactory, HierarchicalBeanFactory, MessageSource, 
        ApplicationEventPublisher, ResourcePatternResolver {
    @Nullable
    String getId();

    String getApplicationName();

    String getDisplayName();

    long getStartupDate();

    @Nullable
    ApplicationContext getParent();

    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

Environment 는 Profile, Property를 다루는 Interface 이다.

 

2. Profile

Spring은 다양한 profile을정의할 수 있으며 사용하는 profile에 따라 다른 bean을 불러와 사용할 수 있다.

@Profile("profile_name") 으로 지정한다

표현식

  • ! (not)
  • & (and)
  • | (or)

1) Profile 예시

package org.kyhslam;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("test")
public class TestConfiguration {

    @Bean
    public BookRepository bookRepository() {
        return new TestBookRepository();
    }
}
package org.kyhslam;
public class TestBookRepository implements BookRepository {
}
package org.kyhslam;
public interface BookRepository {
}
package org.kyhslam;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("test")
public class TestConfiguration {

    @Bean
    public BookRepository bookRepository() {
        return new TestBookRepository();
    }
}
package org.kyhslam;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
public class AppRunner implements ApplicationRunner {


    @Autowired
    ApplicationContext ctx;

    @Autowired
    BookRepository bookRepository;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();

        System.out.println(Arrays.toString(environment.getActiveProfiles()));
        System.out.println(Arrays.toString(environment.getDefaultProfiles()));
    }
}




######## 결과
[test]
[default]

실행하면 현재 getActiveProfiles가 test 인것을 볼 수 있다.

만약에 test Profile을 사용한다는 설정을 하지 않으면 해당 빈을 찾을 수 없다는 에러가 난다.

2) Profile 설정 방법

  • Spring boot 앱을 실행시킬 때 VM 옵션을 부여할 수 있으며,

  • profile은-Dspring.profiles.active으로 활성화 시킬 수 있다.

  • Eclipse나 IntelliJ는 Run Configuration라는 메뉴에서 VM option을 사용한다.

  • '-Dspring.profiles.active="test"' 을 기입하고 앱을 실행하면 test가 출력된다.

 

3. Property

  • key-value 으로 값을 설정하고 Application을 정의할 수 있는 Spring 요소.

  • Spring boot에서는src/resources아래에 기본적으로 application.properties가 생성된다. 이 파일에 property를 정의할 수 있다.

  • Property는 파일을 생성하여 사용할 수도 있고, VM option으로 주어도 가능하다. 물론 두 가지 방법을 동시에 적용해도 동작한다. (우선순위는 VM option이 높다.)

# application.properties

app.name = kyhslam
@Component
public class AppRunner implements ApplicationRunner {

    @Autowired
    ApplicationContext ctx;

    @Value("${app.name}")
    String appName;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        Environment environment = ctx.getEnvironment();

        System.out.println(Arrays.toString(environment.getActiveProfiles()));
        System.out.println(Arrays.toString(environment.getDefaultProfiles()));
        System.out.println(appName);
    }
}

@Value 를 통해 application.properties에 있는 값을 가져온다.

kyhslam

 

'📚 Spring > Spring 개념' 카테고리의 다른 글

IoC Container - ApplicationEventPublisher  (0) 2020.09.11
IoC Container - MessageSource  (0) 2020.09.11
IoC 컨테이너 - Bean 의 스코프(Scope)  (0) 2020.09.09
@Component와 Component Scan  (0) 2020.09.01
@Autowire  (0) 2020.08.31

댓글

Designed by JB FACTORY