๐Ÿš€ ์Šคํ”„๋ง ๋ถ€ํŠธ Auto-configuration์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐ŸŒŸ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ์Šคํ”„๋ง ๋ถ€ํŠธ Auto-configuration์˜ ์„ธ๊ณ„๋กœ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐ŸŒŸ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ ๋ณด๋ ค๊ณ  ํ•ด์š”. ๋ฐ”๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Auto-configuration์— ๋Œ€ํ•ด์„œ์ฃ ! ๐Ÿ˜Ž ์ด ์ฃผ์ œ, ์ฒ˜์Œ ๋“ค์œผ๋ฉด ์ข€ ์–ด๋ ต๊ณ  ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ œ๊ฐ€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋“ ๋“ ํ•œ ๊ฐ€์ด๋“œ๊ฐ€ ๋˜์–ด ์ด ์‹ ๋น„๋กœ์šด ์„ธ๊ณ„๋ฅผ ํ•จ๊ป˜ ํƒํ—˜ํ•ด๋ณผ๊ฒŒ์š”. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํƒํ—˜ํ•˜๋“ฏ์ด ๋ง์ด์ฃ ! ๐Ÿ•ต๏ธโ€โ™€๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~! ๐Ÿš—๐Ÿ’จ

๐Ÿค” Auto-configuration์ด ๋ญ๊ธธ๋ž˜?

๋จผ์ €, Auto-configuration์ด ๋Œ€์ฒด ๋ญ”์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณผ๊นŒ์š”? ์ด๋ฆ„๋งŒ ๋“ค์–ด๋„ ๋ญ”๊ฐ€ ์ž๋™์œผ๋กœ ๋ญ˜ ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ด ๋“ค์ง€ ์•Š๋‚˜์š”? ๋งž์•„์š”, ์ •ํ™•ํžˆ ๊ทธ๊ฑฐ์˜ˆ์š”! ๐Ÿ‘

Auto-configuration์€ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์šฐ๋ฆฌ ๋Œ€์‹ ์— ์„ค์ •์„ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ๋Šฅ์ด์—์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์žฌ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Auto-configuration์€ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์„ค์ •์„ ์ž๋™์œผ๋กœ ์ฐพ์•„์„œ ์ ์šฉํ•ด์ค˜์š”. ์™„์ „ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด์ฃ ? ใ…‹ใ…‹ใ…‹

๐ŸŽญ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: Auto-configuration์„ ๋ ˆ๊ณ  ์„ธํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด "์šฐ์ฃผ์„ " ๋ ˆ๊ณ  ์„ธํŠธ๋ฅผ ์ƒ€๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”. ๊ทธ ์•ˆ์—๋Š” ์šฐ์ฃผ์„ ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๋ถ€ํ’ˆ๊ณผ ์„ค๋ช…์„œ๊ฐ€ ๋“ค์–ด์žˆ์ฃ . ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Auto-configuration์€ ๋งˆ์น˜ ์ด ๋ ˆ๊ณ  ์„ธํŠธ์ฒ˜๋Ÿผ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“  "๋ถ€ํ’ˆ"(์„ค์ •)์„ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋‘๊ณ , ํ•„์š”ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์กฐ๋ฆฝ(์ ์šฉ)ํ•ด์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”!

๊ทธ๋Ÿผ ์ด์ œ Auto-configuration์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€, ๊ทธ ์›๋ฆฌ๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณผ๊นŒ์š”? ๐Ÿง

๐Ÿ” Auto-configuration์˜ ๋™์ž‘ ์›๋ฆฌ

์ž, ์ด์ œ Auto-configuration์ด ์–ด๋–ป๊ฒŒ ๊ทธ ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ์„ ํ•ด๋‚ด๋Š”์ง€ ์‚ดํŽด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์‚ฌ์— ๋งž๋Š” ์žฌ๋Šฅ์„ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Auto-configuration๋„ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ์„ค์ •์„ ์ฐพ์•„๋‚ด๊ณ  ์ ์šฉํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์š”. ๊ทธ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ˜Š

  1. ํด๋ž˜์ŠคํŒจ์Šค ์Šค์บ๋‹ ๐Ÿ‘€: ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋จผ์ € ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ด์š”. ๋งˆ์น˜ ํ˜•๊ด‘ํŽœ์œผ๋กœ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ฒดํฌํ•˜๋“ฏ์ด, ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์„ ์ฐพ์•„๋‚ด์ฃ .
  2. ์กฐ๊ฑด ํ™•์ธ ๐Ÿง: ์ฐพ์•„๋‚ธ ํด๋ž˜์Šค๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ, ์–ด๋–ค ์„ค์ •์ด ํ•„์š”ํ•œ์ง€ ํŒ๋‹จํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, "์•„, ์ด ํ”„๋กœ์ ํŠธ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋„ค? ๊ทธ๋Ÿผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •์ด ํ•„์š”ํ•˜๊ฒ ๊ตฌ๋‚˜!" ํ•˜๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฑฐ์ฃ .
  3. ์ž๋™ ์„ค์ • ์ ์šฉ ๐ŸŽฉโœจ: ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋œ ์„ค์ •๋“ค์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•ด์ค˜์š”. ๋งˆ์น˜ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ์ง€ํŒก์ด๋ฅผ ํœ˜๋‘๋ฅด๋“ฏ์ด, ํ•„์š”ํ•œ ๋นˆ(Bean)๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •์„ ์™„๋ฃŒํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
  4. ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ • ์กด์ค‘ ๐Ÿ™‡โ€โ™‚๏ธ: ๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด, ๊ทธ๊ฑธ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์š”. Auto-configuration์€ ์นœ์ ˆํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž์˜ ์˜๋„๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š์•„์š”!

์ด ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? ํ•œ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ‘‡

Auto-configuration ๋™์ž‘ ์›๋ฆฌ ๋‹ค์ด์–ด๊ทธ๋žจ ํด๋ž˜์ŠคํŒจ์Šค ์Šค์บ๋‹ ์กฐ๊ฑด ํ™•์ธ ์ž๋™ ์„ค์ • ์ ์šฉ ์‚ฌ์šฉ์ž ์ •์˜ ์„ค์ • ์กด์ค‘

์–ด๋•Œ์š”? ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ๊นŒ Auto-configuration์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ข€ ๋” ์ดํ•ด๊ฐ€ ๋˜์‹œ๋‚˜์š”? ๐Ÿ˜ƒ

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: Auto-configuration์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„์„ํ•ด ๋งž์ถคํ˜• ์žฌ๋Šฅ์„ ์ถ”์ฒœํ•ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๋”ฑ ๋งž๋Š” ์„ค์ •์„ ์ œ์•ˆํ•˜๋Š” ๊ฑฐ์ฃ . ์™„์ „ ์Šค๋งˆํŠธํ•˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹

์ž, ์ด์ œ Auto-configuration์˜ ๊ธฐ๋ณธ์ ์ธ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์•Œ์•˜์œผ๋‹ˆ, ์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” Auto-configuration์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•ด์š”! ๐Ÿš€

๐Ÿงฉ Auto-configuration์˜ ํ•ต์‹ฌ ์š”์†Œ๋“ค

Auto-configuration์ด ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ๊ทธ ๋’ค์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ์ ์ธ ์š”์†Œ๋“ค์ด ์ˆจ์–ด์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์ด ์ฒด๊ณ„์ ์œผ๋กœ ๋ถ„๋ฅ˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Auto-configuration๋„ ์ž˜ ์ •๋ฆฌ๋œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ . ๊ทธ๋Ÿผ ์ด์ œ ๊ทธ ํ•ต์‹ฌ ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

1. @EnableAutoConfiguration ์–ด๋…ธํ…Œ์ด์…˜ ๐Ÿท๏ธ

์ด ์–ด๋…ธํ…Œ์ด์…˜์€ Auto-configuration์˜ ์‹œ์ž‘์ ์ด์—์š”. ๋งˆ์น˜ "์ž, ์ด์ œ ์ž๋™ ์„ค์ •์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ?" ํ•˜๊ณ  ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฑฐ์ฃ . ๋ณดํ†ต์€ @SpringBootApplication ์–ด๋…ธํ…Œ์ด์…˜ ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ, ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๋Š” ์—†์–ด์š”.

@SpringBootApplication  // ์ด ์•ˆ์— @EnableAutoConfiguration์ด ์ˆจ์–ด์žˆ์–ด์š”!
public class MyAwesomeApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication.class, args);
    }
}

2. spring.factories ํŒŒ์ผ ๐Ÿ“

์ด ํŒŒ์ผ์€ Auto-configuration์˜ "๋ณด๋ฌผ ์ง€๋„" ๊ฐ™์€ ๊ฑฐ์˜ˆ์š”. ์—ฌ๊ธฐ์— ์ž๋™ ์„ค์ • ํด๋ž˜์Šค๋“ค์˜ ๋ชฉ๋ก์ด ์ ํ˜€์žˆ์ฃ . ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ด ํŒŒ์ผ์„ ๋ณด๊ณ  ์–ด๋–ค ์„ค์ •๋“ค์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด์š”.

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAwesomeAutoConfiguration,\
com.example.AnotherCoolAutoConfiguration

3. ์กฐ๊ฑด๋ถ€ ์–ด๋…ธํ…Œ์ด์…˜๋“ค ๐ŸŽญ

์ด ์–ด๋…ธํ…Œ์ด์…˜๋“ค์€ Auto-configuration์˜ "๋ฌธ์ง€๊ธฐ" ์—ญํ• ์„ ํ•ด์š”. ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๋งŒ ์„ค์ •์„ ์ ์šฉํ•˜๋„๋ก ํ•ด์ฃผ์ฃ . ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”?

  • @ConditionalOnClass: ํŠน์ • ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์ŠคํŒจ์Šค์— ์žˆ์„ ๋•Œ๋งŒ ์„ค์ •์„ ์ ์šฉํ•ด์š”.
  • @ConditionalOnMissingBean: ํŠน์ • ๋นˆ์ด ์—†์„ ๋•Œ๋งŒ ์„ค์ •์„ ์ ์šฉํ•ด์š”.
  • @ConditionalOnProperty: ํŠน์ • ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งŒ ์„ค์ •์„ ์ ์šฉํ•ด์š”.
  • @ConditionalOnWebApplication: ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ๋•Œ๋งŒ ์„ค์ •์„ ์ ์šฉํ•ด์š”.

์ด๋Ÿฐ ์กฐ๊ฑด๋ถ€ ์–ด๋…ธํ…Œ์ด์…˜๋“ค ๋•๋ถ„์—, ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ๋งŒ ์„ค์ •์ด ์ ์šฉ๋˜๋Š” ๊ฑฐ์˜ˆ์š”. ์™„์ „ ์Šค๋งˆํŠธํ•˜์ฃ ? ๐Ÿ˜Ž

4. @Configuration ํด๋ž˜์Šค ๐Ÿ—๏ธ

์ด ํด๋ž˜์Šค๋“ค์€ ์‹ค์ œ๋กœ ์ž๋™ ์„ค์ •์„ ์ •์˜ํ•˜๋Š” ๊ณณ์ด์—์š”. ์—ฌ๊ธฐ์„œ ๋นˆ๋“ค์„ ์ƒ์„ฑํ•˜๊ณ , ํ•„์š”ํ•œ ์„ค์ •๋“ค์„ ํ•ด์ฃผ์ฃ . ๋งˆ์น˜ ๋ ˆ๊ณ  ์กฐ๋ฆฝ ์„ค๋ช…์„œ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        // ๋ฐ์ดํ„ฐ์†Œ์Šค ์ƒ์„ฑ ๋กœ์ง
    }
}

์–ด๋•Œ์š”? ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ Auto-configuration์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์ข€ ๋” ๋ช…ํ™•ํ•ด์กŒ์ฃ ? ๐Ÿค“

๐Ÿ’ก ๊ฟ€ํŒ: Auto-configuration์€ ์ •๋ง ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜์ง€ ์•Š๋Š” ์„ค์ •์ด ์ ์šฉ๋  ์ˆ˜๋„ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ๋Š” application.properties ํŒŒ์ผ์—์„œ spring.autoconfigure.exclude ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ํŠน์ • Auto-configuration์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

์ž, ์ด์ œ Auto-configuration์˜ ํ•ต์‹ฌ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์ด ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ํ˜‘๋ ฅํ•ด์„œ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ทธ๋ฆผ์œผ๋กœ ํ•œ๋ฒˆ ํ‘œํ˜„ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ‘‡

Auto-configuration ํ•ต์‹ฌ ์š”์†Œ ๋‹ค์ด์–ด๊ทธ๋žจ @EnableAutoConfiguration spring.factories ์กฐ๊ฑด๋ถ€ ์–ด๋…ธํ…Œ์ด์…˜ @Configuration ํด๋ž˜์Šค

์ด ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, Auto-configuration์˜ ๊ฐ ์š”์†Œ๋“ค์ด ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์ฃ ? ๐Ÿ˜Š

์ž, ์ด์ œ Auto-configuration์˜ ํ•ต์‹ฌ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ, ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ Auto-configuration์„ ํ™œ์šฉํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๋„๋ก ํ• ๊ฒŒ์š”! ๐Ÿš€

๐Ÿ› ๏ธ Auto-configuration ํ™œ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ Auto-configuration์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ํ•ต์‹ฌ ์š”์†Œ๋“ค์„ ์•Œ์•˜์œผ๋‹ˆ, ์‹ค์ œ๋กœ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ๋งž์ถค ์„ค์ •ํ•˜๋“ฏ์ด, ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Auto-configuration๋„ ์šฐ๋ฆฌ์˜ ํ•„์š”์— ๋งž๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์™„์ „ ์ฉ”์–ด์ฃผ๋Š” ๊ฑฐ ์•„๋‹ˆ์—์š”? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Ž

1. ๊ธฐ๋ณธ Auto-configuration ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿš€

์‚ฌ์‹ค, ์—ฌ๋Ÿฌ๋ถ„์ด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•„๋„ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ด๋ฏธ ๋งŽ์€ ๊ฒƒ๋“ค์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•ด์ค˜์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ์›น ์„œ๋ฒ„ ์„ค์ •, ๋ณด์•ˆ ์„ค์ • ๋“ฑ์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง€์ฃ . ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํšŒ์›๊ฐ€์ž…๋งŒ ํ•ด๋„ ๊ธฐ๋ณธ์ ์ธ ํ”„๋กœํ•„์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”!

@SpringBootApplication
public class MyAwesomeApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication.class, args);
    }
}

์ด๋ ‡๊ฒŒ๋งŒ ํ•ด๋„, ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ์Šค์บ”ํ•˜๊ณ  ํ•„์š”ํ•œ ์„ค์ •๋“ค์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•ด์ค˜์š”. ์™„์ „ ํŽธํ•˜์ฃ ? ๐Ÿ‘

2. ํ”„๋กœํผํ‹ฐ๋กœ ์„ค์ • ์กฐ์ •ํ•˜๊ธฐ ๐ŸŽ›๏ธ

Auto-configuration์€ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์„ค์ •์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ application.properties (๋˜๋Š” application.yml) ํŒŒ์ผ์ด์—์š”.

# application.properties
server.port=8080
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=password

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์„œ๋ฒ„ ํฌํŠธ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด ๋“ฑ์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ”„๋กœํ•„ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ˜‰

3. ํŠน์ • Auto-configuration ์ œ์™ธํ•˜๊ธฐ ๐Ÿšซ

๋•Œ๋กœ๋Š” ํŠน์ • Auto-configuration์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿด ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์–ด์š”:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    // ...
}

๋˜๋Š” properties ํŒŒ์ผ์—์„œ:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŠน์ • Auto-configuration์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํŠน์ • ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์•Œ๋ฆผ์„ ๋„๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐Ÿ‘Œ

4. ์ปค์Šคํ…€ Auto-configuration ๋งŒ๋“ค๊ธฐ ๐ŸŽจ

๋•Œ๋กœ๋Š” ์šฐ๋ฆฌ๋งŒ์˜ Auto-configuration์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฑด ์ข€ ๋” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์ด์ง€๋งŒ, ํ•œ๋ฒˆ ํ•ด๋ณผ๊นŒ์š”?

@Configuration
@ConditionalOnClass(MyService.class)
public class MyServiceAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

๊ทธ๋ฆฌ๊ณ  META-INF/spring.factories ํŒŒ์ผ์— ์ด ์„ค์ •์„ ๋“ฑ๋กํ•ด์š”:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyServiceAutoConfiguration

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์šฐ๋ฆฌ๋งŒ์˜ Auto-configuration์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”! ์™„์ „ ์ฐฝ์˜์ ์ด์ฃ ? ๐Ÿ˜Ž

๐Ÿ’ก Pro Tip: Auto-configuration์„ ๋งŒ๋“ค ๋•Œ๋Š” ํ•ญ์ƒ ์กฐ๊ฑด๋ถ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•„์š”ํ•  ๋•Œ๋งŒ ์„ค์ •์ด ์ ์šฉ๋˜์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”!

5. Auto-configuration ๋””๋ฒ„๊น…ํ•˜๊ธฐ ๐Ÿ›

Auto-configuration์ด ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด, ๋กœ๊น… ๋ ˆ๋ฒจ์„ ์กฐ์ •ํ•ด์„œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”:

logging.level.org.springframework.boot.autoconfigure=DEBUG

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค Auto-configuration์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ๊ฒƒ์ด ์ œ์™ธ๋˜์—ˆ๋Š”์ง€ ๋“ฑ์˜ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ํ™œ๋™ ๋กœ๊ทธ๋ฅผ ์ž์„ธํžˆ ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ•ต๏ธโ€โ™€๏ธ

์ž, ์ด์ œ Auto-configuration์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ดค์–ด์š”. ์ด ๋ชจ๋“  ๊ฒƒ๋“ค์„ ๊ทธ๋ฆผ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ๐Ÿ‘‡

Auto-configuration ํ™œ์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ ๊ธฐ๋ณธ Auto-configuration ํ”„๋กœํผํ‹ฐ๋กœ ์„ค์ • ์กฐ์ • ํŠน์ • Auto-configuration ์ œ์™ธ ์ปค์Šคํ…€ Auto-configuration Auto-configuration ๋””๋ฒ„๊น…

์–ด๋•Œ์š”? ์ด๋ ‡๊ฒŒ ๋ณด๋‹ˆ Auto-configuration์„ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค์ฃ ? ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Auto-configuration์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์‚ดํŽด๋ดค์–ด์š”. ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์žฌ๋Šฅ์„ ๋งž์ถค ์„ค์ •ํ•˜๋“ฏ์ด ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šฐ๋ฆฌ์˜ ํ•„์š”์— ๋”ฑ ๋งž๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ฃ . ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐ŸŒŸ

๐ŸŽญ Auto-configuration์˜ ์žฅ๋‹จ์ 

๋ชจ๋“  ๊ธฐ์ˆ ์ด ๊ทธ๋ ‡๋“ฏ, Auto-configuration๋„ ์žฅ์ ๊ณผ ๋‹จ์ ์ด ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์ด ๊ฐ์ž์˜ ์žฅ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”. ๊ทธ๋Ÿผ ์ด์ œ Auto-configuration์˜ ์žฅ๋‹จ์ ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿค”

์žฅ์  ๐Ÿ‘

  1. ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋‹จ์ถ•: ๊ธฐ๋ณธ์ ์ธ ์„ค์ •์„ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ํ‘œ์ค€ํ™”๋œ ์„ค์ •: ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์„ค์ •์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, ํŒ€ ํ˜‘์—…์ด ๋” ์‰ฌ์›Œ์ ธ์š”.
  3. ์œ ์—ฐ์„ฑ: ํ•„์š”์— ๋”ฐ๋ผ ์„ค์ •์„ ์‰ฝ๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด์š”.
  4. ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ: ์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด, Auto-configuration๋„ ์ž๋™์œผ๋กœ ์ตœ์‹  best practice๋ฅผ ๋ฐ˜์˜ํ•ด์š”.

๋‹จ์  ๐Ÿ‘Ž

  1. ๋ธ”๋ž™๋ฐ•์Šค ํšจ๊ณผ: ๋•Œ๋กœ๋Š” ์–ด๋–ค ์„ค์ •์ด ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”.
  2. ๊ณผ๋„ํ•œ ์˜์กด: Auto-configuration์— ๋„ˆ๋ฌด ์˜์กดํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์ธ ์Šคํ”„๋ง ์„ค์ • ๋ฐฉ๋ฒ•์„ ์žŠ์„ ์ˆ˜ ์žˆ์–ด์š”.
  3. ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ: ํ•„์š” ์—†๋Š” ์„ค์ •๊นŒ์ง€ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ์–ด, ์•ฝ๊ฐ„์˜ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”.
  4. ํ•™์Šต ๊ณก์„ : Auto-configuration์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋ ค๋ฉด ์–ด๋Š ์ •๋„ ํ•™์Šต์ด ํ•„์š”ํ•ด์š”.

๐Ÿ’ก ๊ท ํ˜• ์žก๊ธฐ: Auto-configuration์˜ ์žฅ์ ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ฉด์„œ๋„, ๊ทธ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ•„์š”ํ•  ๋•Œ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ํƒํ—˜ํ•˜๋ฉด์„œ๋„, ์ž์‹ ๋งŒ์˜ ๋…ํŠนํ•œ ์žฌ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐ŸŽญ

์ด๋Ÿฌํ•œ ์žฅ๋‹จ์ ์„ ๊ณ ๋ คํ•˜์—ฌ Auto-configuration์„ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์€ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ณ  ํšจ์œจ์ ์ด ๋  ๊ฑฐ์˜ˆ์š”. ์ž, ์ด์ œ ์ด ์žฅ๋‹จ์ ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ์žฌ๋ฏธ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค๋ณผ๊นŒ์š”? ๐Ÿ“Š

Auto-configuration ์žฅ๋‹จ์  ๊ทธ๋ž˜ํ”„ ๊ฐœ๋ฐœ ์‹œ๊ฐ„ ๋‹จ์ถ• ํ‘œ์ค€ํ™”๋œ ์„ค์ • ์œ ์—ฐ์„ฑ ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ๋ธ”๋ž™๋ฐ•์Šค ํšจ๊ณผ ๊ณผ๋„ํ•œ ์˜์กด ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ ํ•™์Šต ๊ณก์„ 

์ด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด, Auto-configuration์˜ ์žฅ์ ์ด ๋‹จ์ ๋ณด๋‹ค ๋” ํฌ๋‹ค๋Š” ๊ฒƒ์„ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์ฃ ? ํ•˜์ง€๋งŒ ๋‹จ์ ๋„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†์–ด์š”. ์ด ๋‘˜์„ ์ž˜ ์ดํ•ดํ•˜๊ณ  ๊ท ํ˜•์žˆ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Auto-configuration์˜ ๊ฐœ๋…, ๋™์ž‘ ์›๋ฆฌ, ํ™œ์šฉ ๋ฐฉ๋ฒ•, ๊ทธ๋ฆฌ๊ณ  ์žฅ๋‹จ์ ๊นŒ์ง€ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Auto-configuration์„ ๋งˆ์Šคํ„ฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”! ๐ŸŽ‰

๋งˆ์ง€๋ง‰์œผ๋กœ, Auto-configuration์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‹ค์ „์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”! ๐Ÿš€

๐ŸŒŸ ์‹ค์ „ ์˜ˆ์ œ: Auto-configuration ํ™œ์šฉํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณผ๊นŒ์š”? ์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด Auto-configuration์˜ ๊ฐ•๋ ฅํ•จ์„ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ์‹ค์Šตํ•ด๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜‰

1. ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์„ค์ • ๐Ÿ› ๏ธ

๋จผ์ €, ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณผ๊ฒŒ์š”. Spring Initializr๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2'
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›น, JPA, ๊ทธ๋ฆฌ๊ณ  H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ Auto-configuration์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ผ์š”. ์™„์ „ ํŽธํ•˜์ฃ ? ๐Ÿ˜Ž

2. ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ ๐Ÿ—๏ธ

๊ฐ„๋‹จํ•œ User ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private String email;

    // getters, setters, constructors
}

์ด๋ ‡๊ฒŒ๋งŒ ํ•ด๋„ JPA Auto-configuration์ด ์•Œ์•„์„œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์ค˜์š”. ๋งˆ๋ฒ• ๊ฐ™์ฃ ? โœจ

3. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ ๐Ÿ“š

public interface UserRepository extends JpaRepository<user long> {
}</user>

์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋งŒ๋“ค์–ด๋„ Spring Data JPA์˜ Auto-configuration์ด ์•Œ์•„์„œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ค˜์š”. ์™„์ „ ํŽธํ•ด์š”! ๐Ÿ‘

4. ์ปจํŠธ๋กค๋Ÿฌ ๋งŒ๋“ค๊ธฐ ๐ŸŽฎ

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserRepository userRepository;

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }

    @GetMapping
    public List<user> getAllUsers() {
        return userRepository.findAll();
    }
}</user>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์›น ๊ด€๋ จ Auto-configuration์ด ์•Œ์•„์„œ ์ ์šฉ๋˜์–ด REST API๊ฐ€ ๋™์ž‘ํ•ด์š”. ๋Œ€๋‹จํ•˜์ฃ ? ๐Ÿ˜ฎ

5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†์„ฑ ์„ค์ •ํ•˜๊ธฐ โš™๏ธ

application.properties ํŒŒ์ผ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด๋ณผ๊ฒŒ์š”.

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ผ์š”. Auto-configuration์ด ์ด ์„ค์ •์„ ์ฝ๊ณ  ํ•„์š”ํ•œ ๋นˆ๋“ค์„ ์ƒ์„ฑํ•ด์ค˜์š”. ์™„์ „ ์Šค๋งˆํŠธํ•˜์ฃ ? ๐Ÿง 

6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ํ•˜๊ธฐ ๐Ÿš€

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”. ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ Auto-configuration์„ ํ†ตํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•ด์ค„ ๊ฑฐ์˜ˆ์š”.

@SpringBootApplication
public class MyAwesomeApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyAwesomeApplication.class, args);
    }
}

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋งŒ์œผ๋กœ๋„ ์™„์ „ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. Auto-configuration์˜ ํž˜์ด์ฃ ! ๐Ÿ’ช

๐ŸŽ‰ ์ถ•ํ•˜ํ•ด์š”! ์—ฌ๋Ÿฌ๋ถ„์€ ๋ฐฉ๊ธˆ Auto-configuration์„ ํ™œ์šฉํ•ด ์™„์ „ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์—ˆ์–ด์š”. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, JPA ์„ค์ •, ์›น ์„œ๋ฒ„ ์„ค์ • ๋“ฑ ๋ชจ๋“  ๊ฒƒ์ด ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ Auto-configuration์˜ ๊ฐ•๋ ฅํ•จ์ด์—์š”!

์ด ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” Auto-configuration์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•˜๊ณ  ํŽธ๋ฆฌํ•œ์ง€ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ดค์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ์žฌ๋Šฅ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ฆ๊ธฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ Auto-configuration๋„ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์„ ๋”์šฑ ์ฆ๊ฒ๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ค„ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

์ž, ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ Auto-configuration์˜ ์ง„์ •ํ•œ ํž˜์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์–ด์š”. ์ด ์ง€์‹์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ฉ‹์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฐฝ์˜๋ ฅ์— Auto-configuration์˜ ํŽธ๋ฆฌํ•จ์ด ๋”ํ•ด์ง„๋‹ค๋ฉด, ์ •๋ง ๋Œ€๋‹จํ•œ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐ŸŒŸ

Auto-configuration์˜ ์„ธ๊ณ„๋กœ์˜ ์—ฌํ–‰, ์–ด๋– ์…จ๋‚˜์š”? ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋ฅผ ์ž์œ ์ž์žฌ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์‹ค๋ ฅ์ž๊ฐ€ ๋˜์—ˆ์–ด์š”. ์•ž์œผ๋กœ์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์—์„œ Auto-configuration์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋“ ๋“ ํ•œ ์กฐ๋ ฅ์ž๊ฐ€ ๋˜์–ด์ค„ ๊ฑฐ์˜ˆ์š”. ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„