dependencies {
implementation("org.springframework.boot:spring-boot-starter")
// 우리가 만든 커스텀 스프링 부트 스타터
implementation("com.fastcampus.springboot:handgame-spring-boot-starter:1.0-SNAPSHOT")
}
이 상태에서 실행하면 오류가 발생한다.
IntelliJ 실행 옵션의 program arguments로 --debug 옵션을 추가해서 실행하면 현재 설정된 자동 설정(Positive matches)과 적용되지 않은 자동 설정(Negative matches)을 확인할 수 있다.
HandgameAutoconfiguration:
Did not match:
- @ConditionalOnProperty (my.handgame.enabled=true) did not find property 'enabled' (OnPropertyCondition)
Matched:
- @ConditionalOnClass found required class 'org.example.springboot.handgame.Handgame' (OnClassCondition)
자동 설정 클래스를 제작할 때 my.handgame.enabled 프로퍼티가 true인 경우에 동작하도록 했기 때문이다.
application.properties에 값을 추가해준다.
그러면 애플리케이션이 정상 동작하며 Positive matches에 아래 설정이 동작한 것을 확인할 수 있다.
HandgameAutoconfiguration matched:
- @ConditionalOnClass found required class 'org.example.springboot.handgame.Handgame' (OnClassCondition)
- @ConditionalOnProperty (my.handgame.enabled=true) matched (OnPropertyCondition)
HandgameAutoconfiguration#handgame matched:
- @ConditionalOnMissingBean (types: org.example.springboot.handgame.Handgame; SearchStrategy: all) did not find any beans (OnBean)
커스텀 스프링 부트 스타터 만들기
스프링 부트 스타터란
스프링 부트 스타터(spring-boot-starter)
는 스프링 부트 기반의 애플리케이션에 다른 스프링 프로젝트를 쉽게 추가할 수 있도록 만들어진 라이브러리를 말한다.spring-boot-starter-*
와 같은 형태이다.서드 파티 스프링 부트 스타터
서드 파티 스프링 부트 스타터
가 존재한다.spring-boot-starter-*
라는 이름으로 지을 수 없다.공식 스타터에만 적용
하기로 약속되어 있기 때문에 서드 파티 스타터는*-sprig-boot-starter
와 같은 방식으로 명명한다.mybatis-spring-boot-starter
라는 이름의 스타터를 직접 만들어서 제공하고 있다.커스텀 스프링 부트 스타터 만들기
커스텀 스프링 부트 스타터
를 만들 수 있다.프로젝트 구조
멀티 프로젝트
를 사용해서 하나의 프로젝트에 멀티 모듈을 구성함최상위 build.gradle.kts
include("handgame", "handgame-spring-boot-starter")
와 같은 프로젝트가 서브 프로젝트이다.handgame/Handgame.kt
handgame-spring-boot-autoconfigure/build.gradle.kts
애노테이션 프로세서
는 컴파일 타임에 애노테이션을 읽어서 동적으로 코드를 생성하거나 변경하는 등의 기능을 말하는데 kapt는 코틀린 언어에서 이러한 애노테이션 프로세서가 동작하도록 하는 플러그인이다.handgame-spring-boot-autoconfigure/HandgameAutoconfigure.kt
@Configuration
애노테이션을 선언한다.@ConditionalOnProperty
를 사용해서 my.handgame으로 시작하고 enabled라는 프로퍼티가 true인 경우에만 해당 설정 클래스가 동작하도록 로드 시점을 조정한다.@ConditionalOnMissingBean
을 사용해서 handgame 빈이 존재하지 않는 경우에만 빈을 로드한다.handgame-spring-boot-autoconfigure/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfigure.imports
HandgameAutoconfigure
를 스프링에 알려주기 위해 해당 파일에 명시한다.META-INF/spring.factories
파일에 자동 설정 클래스를 명시한다.handgame-spring-boot-starter/build.gradle.kts
handgame-spring-boot-autoconfigure
에 대한 의존성을 추가한다.스프링 부트 스타터 앱 실행하기
handgame-spring-boot-app/build.gradle.kts
my.handgame.enabled
프로퍼티가true
인 경우에 동작하도록 했기 때문이다.