2023. 5. 2. 13:15ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
์๋ ๊ตฌ์ฑ Auto Configuration ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ณ ์ฌ์ฉํด๋ณด๊ธฐ (tistory.com)
์ ๋ฒ ๊ธ์์ ์๋ ๊ตฌ์ฑ @AutoConfiguration์ ์ฌ์ฉํด์ ๊ฐ๋จํ ๋ฉ๋ชจ๋ฆฌ ์กฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ง์ ์ฌ์ฉํด๋ดค๋ค.
์ด๋, ์๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋
resources/META-INF/spring ํด๋์ org.springframework.boot.autoconfigure.AutoConfiguration.imports ํ์ผ์ ์ค์ ํ์ผ ํด๋์ค ์ ๋ณด๋ฅผ ์์ฑํด์ฃผ๋ฉด ์คํ๋ง ๋ถํธ๊ฐ ์ด ํ์ผ์ ์ฝ์ด์ ์๋ ๊ตฌ์ฑ์ผ๋ก ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ spring-boot-autoconfigure๋ฅผ ๋ณด๋ฉด
์คํ๋ง ๋ถํธ์ ์๋ ๊ตฌ์ฑ์ ๋ณผ ์ ์๋ค.
0๏ธโฃ ์คํ๋ง ๋ถํธ ์๋ ๊ตฌ์ฑ ์๋ฆฌ
์คํ๋ง ๋ถํธ ์๋ ๊ตฌ์ฑ ๋์ ์๋ฆฌ๋ก๋
@SpringBootApplication -> @EnableAutoConfiguration -> @Import(AutoConfigurationImportSelector.class) ์์๋ก ๋์ํ๋ค.
run ๋ฉ์๋์ AutoConfigurationApplication.class ๋ฅผ ๋๊ฒจ์ฃผ๋๋ฐ ์ด ํด๋์ค๋ฅผ ์ค์ ์ ๋ณด๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ์ด ํด๋์ค์๋ @SpringBootApplication ์ด๋ ธํ ์ด์ ์ด ์๋๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ์ค์ ์ ๋ณด๋ค์ ๋ด๊ณ ์๋ค.
@EnableAutoConfiguartion ์ ์๋ ๊ตฌ์ฑ์ ํ์ฑํํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
@Import๋ ์ฃผ๋ก ์คํ๋ง ์ค์ ์ ๋ณด๋ฅผ ํฌํจํ ๋ ์ฌ์ฉํ๋ค.
1๏ธโฃ ImportSelector
@Import์๋ ์คํ๋ง ์ค์ ์ ๋ณด๋ฅผ ํฌํจํ ๋ ์ฌ์ฉํ๋๋ฐ ์ฌ๊ธฐ์ ์ค์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ 2๊ฐ์ง๊ฐ ์๋ค.
- ์ ์ ์ธ ๋ฐฉ๋ฒ
: @Import(ํด๋์ค) ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์ผ๋ก ์คํ๋ง ์ค์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์ฝ๋์ ๋์์ด ๋ฑ ์ ํด์ ธ์์ด ์ค์ ์ผ๋ก ์ฌ์ฉํ ๋์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
@Configuration
@Import({HelloConfig.class})
public static class StaticConfig
{
}
- ๋์ ์ธ ๋ฐฉ๋ฒ
: @Import(ImportSelector) ์ฝ๋๋ก ํ๋ก๊ทธ๋๋ฐ์ ํด์ ์ค์ ์ผ๋ก ์ฌ์ฉํ ๋์์ผ๋ก ๋์ ์ผ๋ก ์ ํํ ์ ์๋ค.
public class HelloImportSelector implements ImportSelector
{
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata)
{
return new String[] { "hello.selector.HelloConfig" };
}
}
์คํ๋ง์ ์ค์ ์ ๋ณด ๋์์ ๋์ ์ผ๋ก ์ ํํ ์ ์๋ ImportSelector ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์ค์ ์ ๋ณด๋ฅผ String์ผ๋ก ์ง์ ํด์ฃผ๊ณ ์๋๋ฐ
์ฌ๊ธฐ์๋ ๊ทธ๋ฅ ๋จ์ํ ์ค์ ์ ๋ณด๋ฅผ ๋ฐํํ์ง๋ง String์ด๋๊น ์ค์ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ์ ํํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด์ ๋ง๋ค ์ ์๋ค.
@Configuration
@Import({HelloImportSelector.class})
public static class SelectorConfig
{
}
๊ทธ๋ฆฌ๊ณ SelectorConfig์์ @Import(HelloImportSelector.class) ์์ HelloImportSelector๋ฅผ ์ฌ์ฉํด์ HelloConfig์ ์ค์ ์ ๋ณด๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.
2๏ธโฃ @EnableAutoConfiguration
@EnableAutoConfiguration์ ๋ณด๋ฉด AutoConfigurationImportSelector๊ฐ ์๊ณ ์ด๋ ImportSelector ์ ๊ตฌํ์ฒด๋ก ์ค์ ์ ๋ณด๋ฅผ ๋์ ์ผ๋ก ์ ํํ ์ ์๋ค.
๐ ์ ๋ฆฌ
์คํ๋ง ๋ถํธ ์๋ ๊ตฌ์ฑ์ด ๋์ํ๋ ๋ฐฉ์์ผ๋ก๋
@SpringBootApplication -> @EnableAutoConfiguartion -> @Import(AutoConfigurationImportSelector.class)
-> resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ํ์ผ์ ์ด์ด์ ์ค์ ์ ๋ณด ์ ํ ํ
-> ํด๋น ํ์ผ์ ์ค์ ์ ๋ณด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋กํ๊ณ ์ฌ์ฉํ๋ค.
* ๊ทผ๋ฐ ์๋ ๊ตฌ์ฑ์ ์ค์ ๋ก ์์ฃผ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค. ์๋ํ๋ฉด ํ์ํ ๋น๋ค์ด ์๋ค๋ฉด ์ปดํฌ๋ํธ ์ค์บ์ ํ๋ค๊ฑฐ๋ ๋น์ผ๋ก ์ง์ ๋ฑ๋กํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ผ๊ณ ํ๋ฉด ์ ๋ฒ ๊ธ์ฒ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ ๋ ์ธ๋ฐ, ๋ณดํต ์ฐ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ๊ธฐ ๋ณด๋ค๋ ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ง๊ธฐ ๋๋ฌธ์ ์๋ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ผ์ ์ ๋ค๊ณ ํ ๊ฒ์ด๋ค.
ํ์ง๋ง ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์๋ ๊ตฌ์ฑ ๊ธฐ๋ฅ์ ๋ํด์ ์์์ผ ํ๋ ์ด์ ๋ ์๋ํ ๊ธฐ๋ฅ์ ํตํด์ ์ฝ๊ฒ ๊ฐ๋ฐํ ์๋ ์์ง๋ง ๊ฐ๋ฐํ๋ค๋ณด๋ฉด ์๋์ผ๋ก ๋ฑ๋ก๋ ๋น๋ค์ด ์ธ์ ์ด๋ป๊ฒ ๋ฑ๋กํ๊ฒ ๋ ๊ฒ์ธ์ง ์์์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ๊ทธ๋ผ ํ์ ์ด ๊ฐ๋ฅํ ์ ๋๊น์ง๋ ์๊ณ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด์ ๋ ์์ค๊น์ง๋ ์๊ณ ์๋ ๊ฒ์ด ์ข๋ค.