-
스프링 부트 구성 - @Import, @Conditional 활용Web/환경설정 관련 2024. 5. 13. 23:11
자동 구성 이란?
- 스프링 애플리케이션 개발에 필요한 컴포넌트를 자동으로 설정 해주는 기능
- ex 빌드 설정에 spring-boot-starter-web 의존성 추가하면, 필요한 라이브러리 다 같이 가져오는 것
- 공통 Configuraion class 작성하고 이를 받아와서 환경을 구성하는 방법을 알아보자
1. 공통 Confuguration 사용
- 임의로 하나 만들었다. 이를 jar파일로 만든 후 다른 프로젝트에서 가져와보자
1.2 Gradle 수정
repositories { //.. flatDir{ //대상 폴더 지정 dirs 'C:\\Users\\won\\Desktop\\document\\spring\\workspace\\manyConfig\\cslib' } } dependencies { //jar 파일 지정 implementation name: 'core-0.0.1-SNAPSHOT-plain', version:'0.0.1',ext:'jar' //.. }
- 타 프로젝트에서 jar 파일에 의존성을 추가해서 불러오면 위와 같이 사용할 수 있다.
import hello.core.RelationDataSourceConfiguraion; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @Configuration @Import(RelationDataSourceConfiguraion.class) public class CommonPaymentCofiguraion { }
- 이와 같이 Configuraion을 지정할 때 @Import로 같이 사용할 Configuration 클래스를 지정하면 된다.
- @Import는 {} 배열 형태로 여러 Configuraion을 가져와서 사용할 수 있다.
1.3 문제점
- 이와 같이 Configuraion을 지정하는 것은 매우 편해보이지만, 한 가지 문제점이 있다.
- @Import로 불러온 Bean중에 사용할 것과 사용하지 않을 것을 분리하기 힘들다는 점이다.
- 즉, 불필요한 Bean까지 등록할 수 있다는 단점을 내포하고 있다.
- 이를 해소하기 위해 @Conditional 애너테이션이 존재한다.
2. @Conditional
- Conditional 애너테이션은 Condition클래스를 인자로 받는다.
- Condition 인터페이스는 Boolean 값을 반환하는 matches() 메서드 하나만 포함하고 있는 함수형 인터페이스 이다.
- matches()가 true를 반환하면, @Conditional이 함께 붙어있는 @Bean이나 @Component, @Configuration이 함께 붙어있는 Bean이 생성된다.
//..생략 @Configuration public class CommonApplicationContextConfiguration { public CommonApplicationContextConfiguration() { } @Bean @Conditional({RelationDataBaseCondition.class}) public RelationDataSourceConfiguraion dataSourceConfiguraion() { return new RelationDataSourceConfiguraion(); } }
- @Conditional 어노테이션을 작성하고, 검사할 클래스를 지정했다.
- Condition 클래스를 구현해보자
public class RelationDataBaseCondition implements Condition { public RelationDataBaseCondition() { } public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return this.isMySQLDatabase(); } private boolean isMySQLDatabase() { try { Class.forName("com.mysql.jdbc.Driver"); return true; } catch (ClassNotFoundException var2) { return false; } } }
- MySQL 드라이버가 있는지 검사해서 있으면, 해당 빈을 만들고 없으면 만들지 않도록 지정하는 부분이다.
- 이와 같이 Condition 클래스를 구성하여, 포함할 생성할 Bean과 생성하지 않을 Bean들을 구별해 낼 수 있다.
- 일반적으로 Condition에는 두 가지 정도를 검사한다.
- 특정 라이브러리가 클래스패스에 존재하는 가
- application.properties 파일에 특정 프로퍼티가 정의되어 있는가 -> ConditionContext를 사용해서 접근 가능
- 이와 같이 직접 조건부 Condition을 구현해도 괜찮지만, 이미 손쉽게 사용할 수 있는 애너테이션을 제공한다.
- 다양한 Condition 애너테이션은 공식문서를 참고하자
참고문서
https://www.yes24.com/Product/Goods/122002340
'Web > 환경설정 관련' 카테고리의 다른 글
스프링 부트 모니터링 (1) - 액추에이터 기본 설정 (0) 2024.05.14 스프링 부트 - 실패 분석기 (0) 2024.05.14 스프링 부트 애플리케이션 시작 시 코드 실행 (CommandLineRunner) (0) 2024.05.10 Spring boot - 설정 파일 관리 (@Profile, @ConfigurationProperties,@Value,@PropertySource) (0) 2024.05.10 Spring boot - 정적 리소스 설정 변경 (0) 2024.05.10