์Šคํ”„๋ง ๋ถ€ํŠธ - ์ž๋™ ๊ตฌ์„ฑ ๋™์ž‘ ์›๋ฆฌ

2023. 5. 2. 13:15ใ†์ธํ”„๋Ÿฐ/์Šคํ”„๋ง ๋ถ€ํŠธ - ํ•ต์‹ฌ ์›๋ฆฌ์™€ ํ™œ์šฉ

728x90

 

์ž๋™ ๊ตฌ์„ฑ Auto Configuration ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ (tistory.com)

 

์ž๋™ ๊ตฌ์„ฑ Auto Configuration ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์ž๋™ ๊ตฌ์„ฑ ์‚ฌ์šฉ ์ „ ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ (tistory.com) ์ž๋™ ๊ตฌ์„ฑ ์‚ฌ์šฉ ์ „ ์Šคํ”„๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งŒ๋“ค๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ์Šคํ”„๋ง @Conditional (tistory.com) ์Šคํ”„๋ง @Conditional 0๏ธโƒฃ ์˜ˆ์ œ ํ”„๋กœ์ ํŠธ

hyejin.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 ํŒŒ์ผ์„ ์—ด์–ด์„œ ์„ค์ • ์ •๋ณด ์„ ํƒ ํ›„ 

-> ํ•ด๋‹น ํŒŒ์ผ์˜ ์„ค์ • ์ •๋ณด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค. 

 

 

* ๊ทผ๋ฐ ์ž๋™ ๊ตฌ์„ฑ์€ ์‹ค์ œ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•  ์ผ์€ ๊ฑฐ์˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•„์š”ํ•œ ๋นˆ๋“ค์ด ์žˆ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ•œ๋‹ค๊ฑฐ๋‚˜ ๋นˆ์œผ๋กœ ์ง์ ‘ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.  ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ผ๊ณ  ํ•˜๋ฉด ์ €๋ฒˆ ๊ธ€์ฒ˜๋Ÿผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•  ๋•Œ ์ธ๋ฐ, ๋ณดํ†ต ์šฐ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๋งŒ๋“ค์–ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ผ์€ ์ ๋‹ค๊ณ  ํ•œ ๊ฒƒ์ด๋‹ค. 

 

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž๋™ ๊ตฌ์„ฑ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ์ž๋™ํ™” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด์„œ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋œ ๋นˆ๋“ค์ด ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋“ฑ๋กํ•˜๊ฒŒ ๋œ ๊ฒƒ์ธ์ง€ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•œ ์ •๋„๊นŒ์ง€๋Š” ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ •๋„ ์ˆ˜์ค€๊นŒ์ง€๋Š” ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90