ํ ์ฝํก์ ๋ณด๊ณ ์ถ๊ฐ๋ก ํ์ตํ ๋ด์ฉ๋ค
์คํ๋ง ๋ถํธ๋ component-scan์ ํตํด component๋ฅผ ์ฐพ๊ณ bean์ ์์ฑํ๋ค.
์ด ๊ณผ์ ์์ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ bean๋ค์ด ์์ฑ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์์ spring boot์ auto configuration์ ์ํด ์ถ๊ฐ์ ์ธ bean๋ค๋ ํจ๊ป ์์ฑ๋๋ค.
Spring Boot AutoConfiguration์ด๋?
- ํด๋์ค ํจ์ค์ ์กด์ฌํ๋ dependecy๋ฅผ ๊ธฐ๋ฐ์ผ๋ก spring ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ
- ์คํ๋ง ๋ถํธ๋ web, h2, jdbc๋ฑ ์ฌ๋ฌ ์๋ ์ค์ ์ ์ ๊ณต (starter)
- ํน์ Bean์ ์ ์ํ ํ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ด ๋ ๋น ๋ฅด๊ณ ์ฌ์์ง
- ์คํ๋ง๋ถํธ์์
@SpringBootApplication์ ์๋EnableAutoConfiguration๋ก ๊ฐ๋ฅ
@SpringBootAutoConfiguration

@SpringBootConfiguration: ์คํ๋ง์@Configuration์ ๋์ฒดํ๋ ์คํ๋ง ๋ถํธ ์ ์ฉ ์ค์ ์ด๋ ธํ ์ด์ @EnableAutoConfiguration: auto configuration ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์ค์ . ํด๋์ค ํจ์ค์ ์ง์ ๋ ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ์ ์๋ํ. ์ผ๋ฐ์ ์ผ๋ก@ComponentScan์ ํจ๊ป ์ฐ์
๊ทธ๋ฐ๋ฐ ์ฐ๋ฆฌ๊ฐ ์ ์ํ Bean๊ณผ Spring Boot๊ฐ ์ ์ํ Bean์ด ์ถฉ๋ํ๋ฉด? ๋ํ ๋ถํ์ํ Bean๋ค๋ ๊ฐ์ด ์์ฑ๋๋ค๋ฉด?
@Condition๊ณผ @ConditionalOnXxx์ ์ด์ฉํด์ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
spring.factories
์์ ๋ ์ด๋ ธํ ์ด์ ์ ์ดํด๋ณด๊ธฐ ์ ์ auto configuration์ ํ์ํ ํ์ผ๋ค์ ์ดํด๋ณด์.

Auto Configure

spring-boot-autoconfigure/META-INF/spring.factories ์๋ ์คํ๋ง ๋ถํธ๊ฐ ๋ฏธ๋ฆฌ ์ ์ํด๋ auto configuration ์ ๋ณด๊ฐ ๋ค์ด์๋ค.
์ฌ๊ธฐ์๋ ์๋ ์ค์ ์ target ํด๋์ค ๋ชฉ๋ก๋ค์ด ๋์ด๋์ด ์๊ณ , ์ฌ๊ธฐ์ ์ ์ธ๋ ํด๋์ค๋ค์ด @EnableConfiguration ์ฌ์ฉ ์ target์ด ๋๋ค.
@Conditional? @ConditionalOnXxx?
- Sprig 4.0๋ถํฐ ์ถ๊ฐ๋ ์ด๋ ธํ ์ด์
spring.factories ์ ์๋ ํด๋์ค๋ค ์ค ์ต์ํ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ ๋ฅผ ์์๋ก ๋ณด์.

@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })์ค์ ์ ํตํด ํด๋น ํด๋์ค ํ์ผ์ด ์กด์ฌํด์ผ ์ค์ ์ ํ์ฑํ ํจ์ ๋ช ์@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")์ค์ ์ ํตํด ํด๋น Bean์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ์ค์ ์ ํ์ฑํ ํจ์ ๋ช ์
์ด๋ฌํ ์ค์ ๋ค ๋๋ถ์ ์ฐ๋ฆฌ๊ฐ ์ ์ํ Bean๊ณผ Spring Boot๊ฐ ์ ์ํ Bean์ด ์ถฉ๋ํ๋ ๋ฌธ์ , ๋ถํ์ํ Bean๋ค์ด ์์ฑ๋๋ ๋ฌธ์ ๋ฑ์ ํด๊ฒฐํ ์ ์๋ค.
AutoConfigurationImportFilter
๊ทธ๋ฐ๋ฐ ์ฌ์ค auto configuration์์ ์ด @Condition ์ ๋ฌด์กฐ๊ฑด ํ๋ ๊ฒ์ด ์๋๋ค.
spring.factories ์๋ AutoConfigurationImportFilter ์ค์ ์ด ์กด์ฌํ๋ค.
์๋์ ๊ฐ์ ํํฐ๋ค์ ๊ฐ AutoConfiguration์ด ๊ฐ์ง @Conditional ์ ๊ฐ์ง๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํํฐ๋ง์ ์ํํ๋ค.
์กฐ๊ฑด์ด ๋ง์ง ์์ ๊ฒฝ์ฐ, AutoConfiguration์ด ๋์ํ์ง ์๋๋ก ์ ์ธ์ํค๋ ์ญํ ์ ํ๋ค.

- OnBeanCondition : ํน์ bean๋ค์ ์กด์ฌ์ ๋ฌด์ ๋ํด์ ๋ค๋ฃจ๋ ํํฐ
@ConditionalOnBean, @ConditionalOnMissingBean, @ConditionalOnSingleCandidate
- OnClassCondition : ํน์ class๋ค์ ์กด์ฌ์ ๋ฌด์ ๋ํด์ ๋ค๋ฃจ๋ ํํฐ
@ConditionalOnClass, @ConditionalOnMissingClass
- OnWebApplicationCondition : WebApplicationContext์ ์กด์ฌ์ ๋ฌด์ ๋ํด์ ๋ค๋ฃจ๋ ํํฐ
@ConditionalOnWebApplication, @ConditionalOnNotWebApplication
๊ทธ๋ ๋ค๋ฉด ์ด ์๋ ์ค์ ๋ค์ ์ด๋ป๊ฒ ๋ถ๋ฌ์์ง๊น?
@Import(AutoConfigurationImportSelector.class)

@SpringbootApplication ์ด๋
ธํ
์ด์
๋ด๋ถ์ ์๋ @Import(AutoConfigurationImportSelector.class) ๋ ์๋ ์ค์ ์ ์ง์ํด์ฃผ๋ฉฐ, importํ๊ณ ์๋ AutoConfigurationImportSelector.class๊ฐ META-INF/spring.factories ์ ์ ์๋ ์๋ ์ค์ ํ ํด๋์ค๋ค์ ๋ถ๋ฌ์จ๋ค.