IoC 컨테이너 - Environment
- 📚 Spring/Spring 개념
- 2020. 9. 9. 14:53
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 |