์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… ์‹œ์ž‘ํ•˜๊ธฐ


  • ์ง€๊ธˆ๊นŒ์ง€ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ๋Š” @Bean ์„ ํ†ตํ•ด ์„ค์ • ์ •๋ณด์— ์ง์ ‘ ๋“ฑ๋กํ•  ๋นˆ์„ ๋‚˜์—ดํ–ˆ์Œ
  • ๋นˆ์ด ์ˆ˜์‹ญ ์ˆ˜๋ฐฑ๊ฐœ๊ฐ€ ๋˜๋ฉด ์ผ์ผ์ด ๋“ฑ๋กํ•˜๊ธฐ๋„ ๊ท€์ฐฎ๊ณ  ์„ค์ • ์ •๋ณด๋„ ์ปค์ง€๊ณ  ๋ˆ„๋ฝ๋˜๋Š” ๋ฌธ์ œ๋„ ๋ฐœ์ƒ
  • ๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์€ ์„ค์ •์ •๋ณด๊ฐ€ ์—†์–ด๋„ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • ๋˜ ์˜์กด๊ด€๊ณ„๋„ ์ž๋™์œผ๋กœ ์ฃผ์ž…ํ•˜๋Š” @Autowired ๋ผ๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต
  • @Component ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉด ์Šค์บ” ๋Œ€์ƒ์ด ๋จ

@ComponentScan

  • @ComponentScan ์€ @Component ๊ฐ€ ๋ถ™์€ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก
  • ์ด๋•Œ ์Šคํ”„๋ง ๋นˆ์˜ ๊ธฐ๋ณธ ์ด๋ฆ„์€ ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜๋˜ ๋งจ ์•ž๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ์‚ฌ์šฉ
  • @Component ์• ๋„ˆํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ์Šคํ”„๋ง ๋นˆ์ด ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.
  • @Controller @Service @Repository ๋‚ด๋ถ€์— @Component ๋ฅผ ํฌํ•จํ•˜๊ธฐ์— ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.

@Autowired ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…

  • ์ƒ์„ฑ์ž์— @Autowired ๋ฅผ ์ง€์ •ํ•˜๋ฉด, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„์„œ ์ฃผ์ž…
  • ์ด๋•Œ ๊ธฐ๋ณธ ์กฐํšŒ ์ „๋žต์€ ํƒ€์ž…์ด ๊ฐ™์€ ๋นˆ์„ ์ฐพ์•„์„œ ์ฃผ์ž…

ํƒ์ƒ‰ ์œ„์น˜์™€ ๊ธฐ๋ณธ ์Šค์บ” ๋Œ€์ƒ


ํƒ์ƒ‰ํ•  ํŒจํ‚ค์ง€์˜ ์‹œ์ž‘ ์œ„์น˜

@ComponentScan(
        basePackages = {"hello.core", "hello.service"},
        basePackageClasses = AutoAppConfig.class
)
  • ๋ชจ๋“  ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ๋‹ค ์ปดํฌ๋„ŒํŠธ ์Šค์บ”ํ•˜๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ ๊ทธ๋ž˜์„œ ๊ผญ ํ•„์š”ํ•œ ์œ„์น˜๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋„๋ก ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • basePackages - ํƒ์ƒ‰ํ•  ํŒจํ‚ค์ง€์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ์ง€์ •. ์ด ํŒจํ‚ค์ง€ ํฌํ•จ ํ•˜์œ„ ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰
  • basePackageClasses - ์ง€์ •ํ•œ ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๋ฅผ ํƒ์ƒ‰ ์‹œ์ž‘ ์œ„์น˜๋กœ ์ง€์ •
  • ๋งŒ์•ฝ ๋ฏธ์ง€์ • ์‹œ @ComponentScan ์ด ๋ถ™์€ ์„ค์ • ์ •๋ณด ํด๋ž˜์Šค์˜ ํŒจํ‚ค์ง€๊ฐ€ ์‹œ์ž‘ ์œ„์น˜๊ฐ€ ๋จ
    • ๋•Œ๋ฌธ์— @SpringBootApplication ์ด ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•˜๋Š” ๊ฒƒ

์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๊ธฐ๋ณธ ๋Œ€์ƒ

์ปดํฌ๋„ŒํŠธ ์Šค์บ”์˜ ์šฉ๋„ ๋ฟ ์•„๋‹ˆ๋ผ ์–ด๋…ธํ…Œ์ด์…˜์— ๋”ฐ๋ฅธ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • @Component
  • @Controller - ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ธ์‹
  • @Service - ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ x ๋Œ€์‹  ๊ฐœ๋ฐœ์ž๋“ค์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๊ณณ์œผ๋กœ ์ธ์‹
  • @Repository - ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์œผ๋กœ ์ธ์‹ํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ์˜ˆ์™ธ๋ฅผ ์Šคํ”„๋ง ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜
  • @Configuration - ์Šคํ”„๋ง ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค์„ ์œ ์ง€ํ•˜๋„๋ก ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ

ํ•„ํ„ฐ


@ComponentScan(
        includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
  • includeFilters ์— MyIncludeComponent ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ BeanA ๊ฐ€ ๋“ฑ๋ก๋จ
  • excludeFilters ์— MyExcludeComponent ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ BeanB ๊ฐ€ ๋“ฑ๋ก๋˜์ง€ ์•Š์Œ

FilterType ์˜ต์…˜

  • ANNOTATION - ๊ธฐ๋ณธ๊ฐ’
  • ASSIGNABLE_TYPE - ์ง€์ •ํ•œ ํƒ€์ž…๊ณผ ์ž์‹ ํƒ€์ž…์„ ์ธ์‹
  • ASPECTJ - AspectJ ํŒจํ„ด ์‚ฌ์šฉ
  • REGEX - ์ •๊ทœ ํ‘œํ˜„์‹
  • CUSTOM - TypeFilter ๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์ฒ˜๋ฆฌ

์ค‘๋ณต ๋“ฑ๋ก๊ณผ ์ถฉ๋Œ


์ปดํฌ๋„ŒํŠธ ์Šค์บ”์—์„œ ๊ฐ™์€ ๋นˆ ์ด๋ฆ„์„ ๋“ฑ๋กํ•œ๋‹ค๋ฉด?

  1. ์ž๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก
  2. ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก

์ž๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก

  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์ด ๋“ฑ๋ก๋˜๋Š”๋ฐ, ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์Šคํ”„๋ง์€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด
    • ConflictingBeanDefinitionException ๋ฐœ์ƒ

์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก

  • Spring Framework ์—์„  ์ˆ˜๋™ ๋“ฑ๋ก ๋นˆ์ด ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง ์ˆ˜๋™ ๋นˆ์ด ์ž๋™ ๋นˆ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•จ
  • ๊ทผ๋ฐ Spring Boot ์—์„  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ๋ฒ„๋ฆผ