ํ ์ฝํก์ ๋ณด๊ณ ์ถ๊ฐ๋ก ํ์ตํ ๋ด์ฉ๋ค
์คํ๋ง ๋ถํธ๋ 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
์ ์ ์๋ ์๋ ์ค์ ํ ํด๋์ค๋ค์ ๋ถ๋ฌ์จ๋ค.