You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
matches()메소드가 true를 반환하면 조건에 만족해서 동작하고, false이면 동작하지 않음
ConditionContext는 스프링 컨테이너, 환경정보 등을 담고 있음
AnnotatedTypeMetadata는 어노테이션 메타 정보를 담고 있음
public class MemoryCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String memory = context.getEnvironment().getProperty("memory");
return "on".eqauls(memory);
}
}
@Configuration
@Conditional(MemoryCondition.class)
public class MemoryConfig {
@Bean
public MemoryController memoryController() {
return new MemoryController(memoryFinder());
}
@Bean
public MemoryFinder memoryFinder() {
return new MemoryFinder();
}
}
<aside>
💡
스프링은 외부 설정을 추상화해서 Environment로 통합함. 그래서 다양한 외부 환경 설정을 Environment 하나로 읽어올 수 있음
</aside>
# VM Options
# java -Dmemory=on -jar project.jar
-Dmemory=on
@Configuration
@ConditionalOnProperty(name="memory", havingValue="on")
public class MemoryConfig {
@Bean
public MemoryController memoryController() {
return new MemoryController(memoryFinder());
}
@Bean
public MemoryFinder memoryFinder() {
return new MemoryFinder();
}
}
위에서 직접 구현했던 interface 어노테이션이 @ConditionalOnProperty 내부에 조건에 따라 설정되도록 구현되어있음
| @ConditionalOnClass
@ConditionalOnMissingClass
클래스가 있거나 없는 경우
@ConditionalOnBean
@ConditionalOnMissingBean
빈이 등록 되어있거나 안된 경우
@ConditionalOnProperty
환경 정보가 있는 경우
@ConditionalOnResource
리소스가 있는 경우
@ConditionalOnWebApplication
@ConditionalOnNotWebApplication
웹 어플리케이션인 경우
@ConditionalOnExpression
SpEL 표현식에 만족하는 경우
@conditional은 스프링이 제공하는 기능이며, @ConditionalOnXXX는 이를 확장한 스프링 부트의 제공 기능임
순수 라이브러리 생성 및 사용
build.gradle에서 다음과 같이 dependencies에 직접 생성한 jar를 추가함
그리고 이전의 실습에서 생성했던 Bean들을 등록해줌으로써 import한 jar의 동작이 실행되도록 함
문제
라이브러리 내부에 어떤 빈을 등록해야하는지 모두 알고있어야 활용할 수 있다.
초기 설정이 복잡하다면 사용하기 어려움.
이러한 빈 생성 및 초기 설정 과정을 자동으로 처리해주는게 스프링 부트 자둥 구성(AutoConfiguration)
자동 구성 라이브러리 생성 및 사용
@AutoConfiguration
@ConditionalOnProperty(name = "memory", havingValue = "on")
public class MemoryAutoConfig {
@Bean
public MemoryController memoryController() {
return new MemoryController(memoryFinder());
}
@Bean
public MemoryFinder memoryFinder() {
return new MemoryFinder();
}
스프링은 HelloImportSelector를 실행하고, hello.selector.HelloConfig라는 문자를 반환 받음
스프링은 이 문자에 맞는 대상을 설정 정보로 사용함. 따라서 hello.selector.HelloConfig 설정 정보로 사용함
@EnableAutoConfiguration 동작 방식
@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration { ... }
AutoConfigurationImportSelector는 ImportSelector의 구현체임. 따라서 설정 정보를 동적으로 선택할 수 있음. 해당 코드는 모든 라이브러리에 있는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 경로에서 확인함
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
@conditional
@Conditional은 특정 상황일 때만 특정 빈들을 등록해서 사용하도록 함이 기능 사용을 위해서는 Condition 인터페이스 구현이 필요함
matches()메소드가 true를 반환하면 조건에 만족해서 동작하고, false이면 동작하지 않음
ConditionContext는 스프링 컨테이너, 환경정보 등을 담고 있음
AnnotatedTypeMetadata는 어노테이션 메타 정보를 담고 있음
<aside> 💡
스프링은 외부 설정을 추상화해서 Environment로 통합함. 그래서 다양한 외부 환경 설정을 Environment 하나로 읽어올 수 있음
</aside>
@conditional - 다양한 기능
위에서 직접 구현했던 interface 어노테이션이 @ConditionalOnProperty 내부에 조건에 따라 설정되도록 구현되어있음
| @ConditionalOnClass
@conditional은 스프링이 제공하는 기능이며, @ConditionalOnXXX는 이를 확장한 스프링 부트의 제공 기능임
순수 라이브러리 생성 및 사용
build.gradle에서 다음과 같이 dependencies에 직접 생성한 jar를 추가함
라이브러리를 jar파일로 직접 가지고 있다면 files를 통해 지정함
직접 생성한 Jar파일은 루트 디렉토리 하위에 libs 디렉토리에 위치시킨다
그리고 이전의 실습에서 생성했던 Bean들을 등록해줌으로써 import한 jar의 동작이 실행되도록 함
라이브러리 내부에 어떤 빈을 등록해야하는지 모두 알고있어야 활용할 수 있다.
초기 설정이 복잡하다면 사용하기 어려움.
이러한 빈 생성 및 초기 설정 과정을 자동으로 처리해주는게 스프링 부트 자둥 구성(AutoConfiguration)
자동 구성 라이브러리 생성 및 사용
@autoConfiguration은 스프링 부트가 제공하는 자동 구성 기능 사용을 위한 어노테이션
@ConditionalOnProperty를 사용해서 특정 환경 정보에 따라 자동 구성 되도록 함
자둥 구성 대상 지정
스프링 부트 자동 구성을 적용하려면 다음의 파일에 자동 구성 대상을 반드시 지정해줘야 함
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports위에서 생성한 자동 구성인 MemoryAutoConfig를 패키지를 포함해서 지정함
스프링 부트는 시작 시점에 위의 imports 파일을 읽어서 자동으로 구성되도록 함
자동 구성 이해
spring-boot-autoconfigure를 확인해보면 다음과 같이 import할 configuration들이 정의되어있다.
스프링 부트 어플리케이션을 실행하는 Main메소드는 다음과 같다.
run()에서 AutoConfigApplication.class를 넘겨주는데, 이 클래스를 설정 정보로 사용한다는 의미이다.
AutoConfigApplication에는 @SpringBootApplication 어노테이션이 존재하며, 내부는 다음과 같다.
여기서 @EnableAutoConfiguration이 존재하며, 내부적으로는 @import(AutoConfigurationImportSelector.class)를 포함한다.
@import에 설정 정보를 추가하는 방법은 다음과 같다.
설정 정보를 동적으로 선택할 수 있게 해주는 ImportSelector 인터페이스를 구현한 예시이다.
여기서는 단순히 hello.selector.HelloConfig 설정 정보를 반환함
이렇게 반환된 설정 정보는 선택되어 사용되며, 동적으로 프로그래밍할 수 있게 된다.
staticConfig()
스프링 컨테이너를 생성하고 StaticConfig.class를 초기 설정 정보로 사용함
selectorConfig()
selectorConfig()는 SelectorConfig를 초기 설정 정보로 사용함
selectorConfig는 @import(HelloImportSelector.class)에서 ImportSelector의 구현체인 HelloImportSelector를 사용함
스프링은 HelloImportSelector를 실행하고, hello.selector.HelloConfig라는 문자를 반환 받음
스프링은 이 문자에 맞는 대상을 설정 정보로 사용함. 따라서 hello.selector.HelloConfig 설정 정보로 사용함
@EnableAutoConfiguration 동작 방식
AutoConfigurationImportSelector는 ImportSelector의 구현체임. 따라서 설정 정보를 동적으로 선택할 수 있음. 해당 코드는 모든 라이브러리에 있는
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports경로에서 확인함스프링 부트 자동 구성이 동작하는 방식
Beta Was this translation helpful? Give feedback.
All reactions