๐ŸŒˆ [Section2] 18. DI (Dependency Injection) 1

ํ˜„์ฃผยท2022๋…„ 10์›” 13์ผ
0

bootcamp

๋ชฉ๋ก ๋ณด๊ธฐ
37/71

๐Ÿ“• ์˜ค๋Š˜ ๋ฐฐ์šด ๋‚ด์šฉ!

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (Spring Container)
  • ๋นˆ (Bean)
  • ๋นˆ ์Šค์ฝ”ํ”„ (Bean Scope)
  • ์‹ฑ๊ธ€ํ†ค

โœ๏ธ DI (Dependency Injection)

( ์ด ์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ •๋ฆฌํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด)

  • ๊ฐ์ฒด ๊ต์ฒด์˜ ๊ฒฝ์šฐ ์ˆ˜์ •์ด ๋ถˆํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„ ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ

  • ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋„ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๊ณ  ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์‹ค์ œ๋กœ ์Šคํ”„๋ง์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋„์™€์ฃผ๊ฒŒ ๋จ
    ( ์Šคํ”„๋ง์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ• )

( ์•„๋ž˜๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ์ƒ์„ฑ์ž ๊ธฐ๋ฐ˜ ๋ฐ setter ๊ธฐ๋ฐ˜ DI๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์—์„œ๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์ถ”์ฒœํ•œ๋‹ค๋Š” ๋‚ด์šฉ์ด ํฌํ•จ โฌ‡๏ธ )
[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-constructor-injection

โœ”๏ธ DI ์˜ˆ์‹œ

โžœ ์›Œ๋“œ๋กœ ๋”ฐ๋กœ ์ž‘์„ฑํ•ด๋†“์€ ํŒŒ์ผ ๋ณด๊ฑฐ ์ฐธ๊ณ ํ•˜๊ธฐ !


โœ๏ธ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ (Spring Container)

(IoC ์ปจํ…Œ์ด๋„ˆ / DI ์ปจํ…Œ์ด๋„ˆ ๋ผ๊ณ ๋„ ์š”์ฆ˜ ๊ฝค ๋งํ•จ )

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ
    ( ์Šคํ”„๋ง์ด ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•จ )

    โœ”๏ธ ์ปดํฌ๋„ŒํŠธ (component)
    ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ ํ•จ์ˆ˜๋“ค์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•œ ์ž‘์€ ๊ธฐ๋Šฅ์  ๋‹จ์œ„

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ •์˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์˜ ๋นˆ(Bean)(๊ฐ์ฒด)๋“ค์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”๋กœํ•  ๋•Œ ์ œ๊ณต ( IoC/DI ์›๋ฆฌ๊ฐ€ ์ ์šฉ )

    Ex. Bean ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ โžœ Bean ์ƒ์„ฑ, ์ธ์Šคํ„ด์Šคํ™”, ๊ตฌ์„ฑ, ๊ด€๋ฆฌ, ์ œ๊ฑฐ ๋“ฑ
    (์ƒ์„ฑ๋ถ€ํ„ฐ ์†Œ๋ฉธ๊นŒ์ง€)

  • ์ด ์ž์ฒด๋„ ์ธํ„ฐํŽ˜์ด์Šค๊ณ , ์ด๊ฒƒ์˜ ํ•˜์œ„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋˜ ์‚ฌ์šฉ
    ( ๋ˆˆ์— ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ ๋ชจ๋‘ ์ถ”์ƒํ™” ๋˜์–ด ์žˆ์Œ )

  • ๊ฐ์ฒด ์ƒ์„ฑ ํ›„, ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ†ตํ•ด ๋นˆ(๊ฐ์ฒด)๋“ค์„ ์—ฐ๊ฒฐ
    โžœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด/๊ฒฐํ•ฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ ์‹ ๊ฒฝ ์•ˆ์จ๋„ ๋จ
    โžœ ๋ฉ”์„œ๋“œ๊ฐ€ ์–ธ์ œ/์–ด๋””์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ค€๋น„ํ•ด์„œ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ๋จ

    โœ”๏ธ ๋ชจ๋“ˆ (module)
    ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ๋‹จ์œ„
    โžœ ๋ณดํ†ต ํ•˜๋‚˜์˜ ์†Œ์Šค ํŒŒ์ผ์— ๋ชจ๋“  ํ•จ์ˆ˜ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ธฐ๋Šฅ๋ณ„๋กœ ๋”ฐ๋กœ ๋ชจ๋“ˆ ๊ตฌ์„ฑํ•จ, ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“ˆ๋“ค์„ ํ•ฉ์ณ ํ•˜๋‚˜์˜ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ฆ

  • ์ด๋ฅผ ํ†ตํ•ด, ์›ํ•˜๋Š” ๋งŒํผ ๋งŽ์€ ๊ฐ์ฒด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์Œ

  • XML, ์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ ์ž๋ฐ” ์„ค์ • ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
    ( But, ์ „์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ xml์„ ํ†ตํ•ด ๋ชจ๋‘ ์„ค์ •ํ•ด์คฌ์ง€๋งŒ, ๋ณต์žกํ•œ ๋ถ€๋ถ„๋“ค์„ Spring Boot๊ฐ€ ํ•ด์ฃผ์–ด ์š”์ฆ˜ XML์€ ๊ฑฐ์˜ ์‚ฌ์šฉ X)

โ— ๐Ÿ’ฌ ์ •๋ฆฌํ•˜์ž๋ฉด, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ˆœ๊ฐ„, ๊ฐœ๋ฐœ์ž์˜ ์†์„ ๋– ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์˜ ๋…๋ฆฝ์ ์ธ ์˜์—ญ์— ์ข…์†๋˜์–ด, ๊ทธ ํ›„์—” ์ปจํ…Œ์ด๋„ˆ ๋ง˜๋Œ€๋กœ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ !!

โœ” ์‚ฌ์šฉ ์ด์œ 

( IoC/DI ์‚ฌ์šฉ ์ด์œ ์™€ ๊ฐ™์Œ )

  • ๊ฐ์ฒด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถฐ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ์ค‘ ํ•˜๋‚˜์ธ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„์™€ ๋†’์€ ์บก์Šํ™”๋ฅผ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด

โœ” ์ข…๋ฅ˜

1. BeanFactory

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค

  • ๋นˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• 
    Ex. ๋นˆ ๋“ฑ๋ก, ์ƒ์„ฑ, ์กฐํšŒ, ๋Œ๋ ค์ฃผ๊ธฐ, ๊ฒ€์ƒ‰ ๋“ฑ

  • getBean() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋นˆ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Œ
    ( ์ฒ˜์Œ getBean() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ ์‹œ์ ์—์„œ์•ผ ํ•ด๋‹น ๋นˆ์ด ์ƒ์„ฑ๋จ )

  • @Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋นˆ์„ ๋“ฑ๋ก

2. ApplicationContext

  • BeanFactory์˜ ๊ธฐ๋Šฅ์„ ์ƒ์†๋ฐ›์€ ์ธํ„ฐํŽ˜์ด์Šค
    ( ์ธํ„ฐํŽ˜์ด์Šค๋ผํ•จ์€, ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ ! )

โžœ But, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ํ•˜๋ฉด ์ฃผ๋กœ ์ด ApplicationContext๋ฅผ ๋œปํ•จ

  • BeanFactory๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์™ธ์— ๋ถ€๊ฐ€๊ธฐ๋Šฅ ์ œ๊ณต

    โœ”๏ธ ๋ถ€๊ฐ€๊ธฐ๋Šฅ

    • MessageSource
      โžœ ๋ฉ”์„ธ์ง€ ๋‹ค๊ตญํ™”๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
    • EnvironmentCapable
      โžœ ๊ฐœ๋ฐœ, ์šด์˜ ๋“ฑ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ์œผ๋กœ ๋‚˜๋ˆ  ์ฒ˜๋ฆฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์‹œ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค
    • ApplicationEventPublisher
      โžœ ์ด๋ฒคํŠธ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค
    • ResourceLoader
      โžœ ํŒŒ์ผ, ํด๋ž˜์Šค ํŒจ์Šค, ์™ธ๋ถ€ ๋“ฑ ๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒ

โœ” ์ƒ์„ฑ ๊ณผ์ •

1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

โžœ new AnnotationConfigApplicationContext(๊ตฌ์„ฑ์ •๋ณด.class)๋กœ ์Šคํ”„๋ง์— ์žˆ๋Š” @Bean์˜ ๋ฉ”์„œ๋“œ ๋“ฑ๋ก
(์• ๋„ˆํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ Java ์„ค์ • ํด๋ž˜์Šค๋กœ Spring์„ ๋งŒ๋“œ๋Š” ๊ฒƒ )

โžœ ์ƒ์„ฑํ•  ๋•Œ ์–ด๋–ค ๊ตฌ์„ฑ์ •๋ณด๋ฅผ ์“ธ ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•˜๋Š”๋ฐ, ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” AppConfig.class๋ฅผ ๊ตฌ์„ฑ์ •๋ณด๋กœ ์ง€์ •ํ•จ
( AppConfig.class์— ์žˆ๋Š” ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑ )

โžœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค๋Š” ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๊ฒฐํ•ฉ๋˜์–ด ApplicationContext๊ฐ€ ์ƒ์„ฑ/์ดˆ๊ธฐํ™”๋œ ํ›„, ์™„์ „ํžˆ ๊ตฌ์„ฑ๋˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ–๊ฒŒ ๋จ

XML ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“œ๋Š” ClassPathXmlApplicationContext๋„ ์žˆ์Œ

โœ”๏ธ AnnotationConfigApplicationContext
โžœ ApplicatonContext ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด )

โžœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Configuration Metadata ์‚ฌ์šฉ

โœ”๏ธ Configuration Metadata
Spring ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ์ฒด๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

  • XML-based metadata - ์™ธ๋ถ€ XML ํŒŒ์ผ๋กœ ํ‘œํ˜„
    โžœ ํด๋ž˜์Šค์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Œ
  • Java-based metadata - ์• ๋„ˆํ…Œ์ด์…˜ ๋“ฑ์˜ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ‘œํ˜„
    โžœ XML ๋ฐฉ์‹์— ๋น„ํ•ด ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›€

2. ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

โžœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์„ค์ • ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋ก

โžœ ๋นˆ ์ด๋ฆ„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ์‚ฌ์šฉํ•˜๊ณ  ํ•ญ์ƒ ๋‹ค๋ฅด๊ฒŒ !
( @Bean(name="์ง€์ •ํ•  ์ด๋ฆ„")์œผ๋กœ ์ง์ ‘ ๋ถ€์—ฌ๋„ ๊ฐ€๋Šฅ )
( ๊ฐ™์€ ์ด๋ฆ„ ๋ถ€์—ฌํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ๋นˆ์„ ๋ฎ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ )

3. ์Šคํ”„๋ง ๋นˆ ์˜์กด ๊ด€๊ณ„ ์„ค์ • - ์ค€๋น„

โžœ ๋นˆ ์ƒ์„ฑ ํ›„, ์˜์กด ๊ด€๊ณ„ ์„ค์ •์„ ์œ„ํ•ด ์ค€๋น„

4. ์Šคํ”„๋ง ๋นˆ ์˜์กด ๊ด€๊ณ„ ์„ค์ • - ์™„๋ฃŒ

โžœ ์ƒ์„ฑ๋œ ๋นˆ๋“ค๋กœ ์„ค์ • ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฐ ๊ฐ์ฒด๊ฐ„์— ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…
( ์ด๋ ‡๊ฒŒ Java ์ฝ”๋“œ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋ฉด ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋„ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌ๋จ )

5. ์ƒ์„ฑํ•œ ๋นˆ ์กฐํšŒ
โžœ ๋“ฑ๋ก๋œ ๋นˆ๋“ค์„ ๋ชจ๋‘ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, findAllBean() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ๊ฐ€๋Šฅ

findAllBean()
์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ชจ๋“  ๋นˆ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
( ์ด ๊ฒฝ์šฐ ์Šคํ”„๋ง์ด ์ž์ฒด์ ์œผ๋กœ ๋“ฑ๋กํ•œ ๋นˆ๋„ ๋ชจ๋‘ ์ถœ๋ ฅ๋จ )

โžœ ์ง์ ‘ ๋“ฑ๋กํ•œ ๋นˆ๋“ค๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, findApplicationBean() ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅ ๊ฐ€๋Šฅ

โžœ ์ƒ์†๊ด€๊ณ„๊ฐ€ ์žˆ์„ ์‹œ ๋ถ€๋ชจํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ์ž์‹ ํƒ€์ž…๋„ ํ•จ๊ป˜ ์กฐํšŒ๋จ
( object ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ๋ชจ๋“  ์Šคํ”„๋ง ๋นˆ ์กฐํšŒ ๊ฐ€๋Šฅ )

โœ”๏ธ ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด ํ™•์ธ๋ฒ•
Windows์˜ ๊ฒฝ์šฐ
โžœ Ctrn + N โžœ ํด๋ž˜์Šค์—์„œ ApplicationContext๋กœ ๊ฒ€์ƒ‰
โ €
โžœ ํ™”๋ฉด์—์„œ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ํŒŒ์ผ์ธ ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํ•˜์œ„ ํด๋ž˜์Šค๋“ค์ด ๋‚˜์˜ค๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

โœ” ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šคํ™”

โžœ ApplicationContext ์ƒ์„ฑ์ž์— ์ œ๊ณต๋œ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋“ค๋กœ๋ถ€ํ„ฐ ๊ตฌ์„ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋ฌธ์ž์—ด

Ex. ์—ฌ๊ธฐ์„œ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค โžœ ์œ„์น˜ ๊ฒฝ๋กœ, ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ, Java CLASSPATH ๋“ฑ


โœ๏ธ ์Šคํ”„๋ง ๋นˆ(Bean)

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์žฌ์‚ฌ์šฉ ์†Œํ”„ํŠธ์›จ์–ด ์ปดํฌ๋„ŒํŠธ
    ( ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ธ์Šคํ„ด์Šคํ™”๋œ ๊ฐ์ฒด )
    ( ์„ค์ • ์ •๋ณด(BeanDefinition)์™€ ํ•จ๊ป˜ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๊ฐ์ฒด )

โœ”๏ธ Java Bean(Spring Bean)
โžœ ๋‹จ์ˆœํ•˜๊ฒŒ ํด๋ž˜์Šค ๋‚ด์— Getter/Setter๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค
( ์Šคํ”„๋ง ๋นˆ์€ ์ž๋ฐ” ๋นˆ๊ณผ ๋‹ค๋ฆ„ )

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(BeanDefinition)๋กœ ์ƒ์„ฑ

  • @Bean์ด ์ ํžŒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ํ˜ธ์ถœํ•ด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก

โœ” Bean ์ ‘๊ทผ ๋ฐฉ๋ฒ•

  • ApplicationContext ์‚ฌ์šฉ
    โžœ bean ์ •์˜๋ฅผ ์ฝ๊ณ  ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ

  • getBean() ์‚ฌ์šฉ
    โžœ bean์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

    But, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์—์„œ๋Š” getBean() ๋ฉ”์„œ๋“œ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋จ
    โžœ ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ getBean(์ด๋ฆ„, ํƒ€์ž…)์œผ๋กœ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š”๋ฐ ์ด๋ฆ„๊ณผ ํƒ€์ž…์„ ์•Œ์•„์•ผ๋งŒ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅ
    But, ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ–ˆ์–ด๋„ ์ด๋ฆ„๊ณผ ํƒ€์ž…์„ ๋ชฐ๋ผ๋„ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•ด์•ผํ•จ!
    ( ์˜์กด์„ฑ ์ฃผ์ž…์ด ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๊ฒƒ )

โœ” BeanDefinition


( ์ถ”์ƒํ™”๋˜์–ด ์žˆ์Œ )

  • Configuration metadata๋กœ ์ •์˜ํ•œ ๋นˆ ์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
    ( ๋นˆ์˜ ์ƒ์„ฑ ์ •๋ณด, ์ปจํ…Œ์ด๋„ˆ์˜ ๋ช…๋ น, ์ธ์Šคํ„ด์Šคํ™”, ์„ค์ •, ์กฐ๋ฆฝํ•  ๊ฐ์ฒด ์ •์˜ )

  • ์†์„ฑ์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Bean์„ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑ, ๊ด€๋ฆฌํ• ์ง€ ๊ฒฐ์ •

  • @Bean or <bean> ๋‹น ๊ฐ 1๊ฐœ์”ฉ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ์ƒ์„ฑ

  • ์Šคํ”„๋ง์ด ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด๋ฅผ BeanDefinition์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํ”„๋ง์ด XML, Java์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์„ค์ • ํ˜•์‹์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

โœ”๏ธ BeanDefintion ๊ฐœ์ฒด๊ฐ€ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-definition

  • BeanClassName
    โžœ ์ƒ์„ฑํ•  ๋นˆ์˜ ํด๋ž˜์Šค ๋ช… (์ž๋ฐ” ์„ค์ •์ฒ˜๋Ÿผ ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—†์Œ)
  • factoryBeanName
    โžœ ํŒฉํ† ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ด๋ฆ„ Ex. appConfig
  • factoryMethodName
    โžœ ๋นˆ์„ ์ƒ์„ฑํ•  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ์ง€์ • Ex. userService
  • Scope
    โžœ ์‹ฑ๊ธ€ํ†ค (๊ธฐ๋ณธ๊ฐ’)
  • lazyInit
    โžœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ๋นˆ์„ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ์ตœ๋Œ€ํ•œ ์ƒ์„ฑ์„ ์ง€์—ฐ์ฒ˜๋ฆฌ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€
  • InitMethodName
    โžœ ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋ฅผ ์ ์šฉํ•œ ๋’ค์— ํ˜ธ์ถœ๋˜๋Š” ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ ๋ช…
  • DestoryMethodName
    โžœ ๋นˆ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๋๋‚˜์„œ ์ œ๊ฑฐํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์„œ๋“œ ๋ช…
  • Constructor arguments, Properties
    โžœ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์—์„œ ์‚ฌ์šฉ (์ž๋ฐ” ์„ค์ •์ฒ˜๋Ÿผ ํŒฉํ„ฐ๋ฆฌ ์—ญํ• ์˜ ๋นˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—†์Œ)

โœ” ๋นˆ ์Šค์ฝ”ํ”„ (Bean Scope)

  • ๋ง ๊ทธ๋Œ€๋กœ ๋นˆ(๊ฐ์ฒด)์ด ์‚ฌ์šฉ๋˜์–ด์ง€๋Š” ๋ฒ”์œ„

  • ๋นˆ ์„ค์ • ๋ฉ”ํƒ€์ •๋ณด(BeanDefinition) ๋งŒ๋“ค ๋•Œ, ๊ทธ๊ฑธ๋กœ ๋งŒ๋“ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ, ๊ทธ ์ธ์Šคํ„ด์Šค(๋นˆ)๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„(๋ ˆ์‹œํ”ผ) ์„ค์ •ํ•˜๋Š” ๊ฒƒ
    Ex. ์•ฑ ๊ตฌ๋™๋˜๋Š” ๋™์•ˆ ๋นˆ(๊ฐ์ฒด)์„ ๋ช‡๊ฐœ ๋งŒ๋“ค์–ด์„œ ์“ธ ๊ฑด์ง€, HTTP ์š”์ฒญ๋งˆ๋‹ค ์ƒ์„ฑํ•ด์„œ ์“ธ ๊ฑด์ง€ ๋“ฑ ๊ฒฐ์ •

    โœ”๏ธ ๋ ˆ์‹œํ”ผ
    โžœ ๋นˆ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„

  • ํŠน์ • Bean ์ •์˜์—์„œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ์—ฐ๊ฒฐํ•  ๋‹ค์–‘ํ•œ ์˜์กด์„ฑ, ๊ตฌ์„ฑ ๊ฐ’๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํŠน์ • Bean ์ •์˜์—์„œ ์ƒ์„ฑ๋œ ๊ฐœ์ฒด์˜ ๋ฒ”์œ„๋„ ์ œ์–ด ๊ฐ€๋Šฅ

  • Spring Framework๋Š” 6๊ฐœ์˜ Scope(๋ฒ”์œ„) ์ง€์›ํ•˜๊ณ  ์ด ์ค‘ ํ•˜๋‚˜์— ๋ฐฐ์น˜๋˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
    ( ์•„๋ž˜ <โœ” ๋นˆ ์Šค์ฝ”ํ”„ ์ข…๋ฅ˜>์—์„œ ์„ค๋ช… )

  • ๊ตฌ์„ฑ์„ ํ†ตํ•ด ์ƒ์„ฑํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฒ”์œ„๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐ

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ”์œ„๋ฅผ ์ •์˜ํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Œ

โœ” ๋นˆ ์Šค์ฝ”ํ”„ ์ข…๋ฅ˜

  • singleton (Default)
    โžœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ๊ฐ’
    โžœ ๊ฐ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹จ์ผ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋‹จ์ผ BeanDefintion์˜ ๋ฒ”์œ„ ์ง€์ •
    ( static ์ธ์Šคํ„ด์Šค ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋จ )

  • prototype
    โžœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•˜๊ณ  ๋”๋Š” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๋งค์šฐ ์งง์€ ๋ฒ”์œ„์˜ ์Šค์ฝ”ํ”„

  • request
    โžœ ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

  • session
    โžœ ์›น ์„ธ์…˜์ด ์ƒ์„ฑ๋˜๊ณ  ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

  • application
    โžœ ์›น์˜ ์„œ๋ธ”๋ฆฟ ์ปจํ…์Šค์™€ ๊ฐ™์€ ๋ฒ”์œ„๋กœ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

  • websocket
    โžœ ๋‹จ์ผ BeanDefintion ๋ฒ”์œ„๋ฅผ WebSocket์˜ ๋ผ์ดํ”„์‚ฌ์ดํด๊นŒ์ง€ ํ™•์žฅ
    โžœ Spring ApplicationContext์˜ ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์œ ํšจ
    โ €
    ( ์ด ์ค‘ 4๊ฐœ๋Š” ApplicationContext๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ )
    [์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes

โœ” ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„(Singleton Scope)

  • ํ•ด๋‹น ๋นˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
    ( โžœ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ 2๊ฐœ ์ด์ƒ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก, ์ฝ”๋“œ์—์„œ private ์ƒ์„ฑ์ž ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ new ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๋ชปํ•˜๊ฒŒ ๋ง‰๊ธฐ )

  • ์ด ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋Š” ์‹ฑ๊ธ€ํ†ค ๋นˆ์˜ ์บ์‹œ์— ์ €์žฅ๋จ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์œ ์ง€
    ( ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ์‹œ ์†Œ๋ฉธ ๋ฉ”์„œ๋“œ๋„ ์ž๋™์œผ๋กœ ์‹คํ–‰ )

  • ํ•ด๋‹น BeanDefinition๊ณผ ์ผ์น˜ํ•˜๋Š” ID / ID๋ฅผ ๊ฐ€์ง„ ๋นˆ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ํŠน์ • ๋นˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜

  • ์ด๋ฆ„์ด ์ •ํ•ด์ง„ ๋นˆ์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ๊ณผ ์ฐธ์กฐ๋Š” ์บ์‹œ๋œ ๊ฐœ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    ( ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์˜ ์Šคํ”„๋ง ๋นˆ์€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€์ง )

โžœ ํด๋ผ์ด์–ธํŠธ๋“ค์ด ์Šคํ”„๋ง ๋นˆ์„ ์š”๊ตฌํ•  ๋•Œ, ๊ฐ™์€ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง„ ๋นˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์คŒ

[์ฐธ๊ณ ] https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/beans.html#beans-factory-scopes

โ— ๐Ÿ’ฌ ํ•ต์‹ฌ
โžœ bean ํ•˜๋‚˜์— ํ•˜๋‚˜์”ฉ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๋Ÿฐ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์„ ์ƒ์„ฑํ•œ๋‹ค !!!!!

โœ” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด(๋ฐฉ์‹)์˜ ๋ฌธ์ œ์ 

  • ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋งŽ์Œ

  • ์˜์กด๊ด€๊ณ„์ƒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กด
    โžœ DIP ์œ„๋ฐ˜ ( OOP์˜ SOLID ์ค‘ ํ•˜๋‚˜ )

  • ์ง€์ •ํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์›€

  • ์œ ์—ฐ์„ฑ ๋–จ์–ด์ง
    ( private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ์ž์‹ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ๊ฐ€ ์–ด๋ ค๊ธฐ ๋•Œ๋ฌธ )

  • ์†์„ฑ ๊ณต์œ 
    โžœ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ๋ฌธ์ œ
    ( ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด์˜ ์†์„ฑ์ด ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ )
    โžœ A ์“ฐ๋ ˆ๋“œ์—์„  ์†์„ฑ ๊ฐ’์„ x๋กœ ๋ฐ”๊พธ๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •์—์„œ B ์“ฐ๋ ˆ๋“œ๊ฐ€ ์†์„ฑ ๊ฐ’์„ y๋กœ ๋ฐ”๊พธ๋ฉด ์“ฐ๋ ˆ๋“œ A์—์„  ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Œ
    ( 1๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์†์„ฑ๊ฐ’์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ )

  • ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ๋งŽ์„ ์ˆ˜๋ก ๊ตฌ๋™ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€
    ( ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™ ์‹œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— )

โœ”๏ธ ์ด ๋ฌธ์ œ์ ์„ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•ด๊ฒฐํ•ด์คŒ !

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉํ•˜์ง€ ์•Š์•„๋„, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ
  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ โžœ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ ์—ญํ• 
  • ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Singleton Registry) ๊ธฐ๋Šฅ ๊ฐ€์ง
    โ €
    โžœ ์œ„ ๊ธฐ๋Šฅ๋“ค ๋•๋ถ„์—, ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค(1๊ฐœ๋งŒ ์ƒ์„ฑ)์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    ( ์Šคํ”„๋ง ๋นˆ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด์ธ ๊ฒƒ )
    โ €
    ( ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์œ„ํ•œ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ , DIP, OCP ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ํ…Œ์ŠคํŠธ ์šฉ์ดํ•ด์ง )

โœ”๏ธ ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Singleton Registry)
์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ

โœ” ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ์ฃผ์˜์ 

  • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ํ˜•์‹์ด๋ฏ€๋กœ ๋ฌด์ƒํƒœ(Stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผํ•จ

    • ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ด๊ฑฐ๋‚˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ

    • ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ

    • ํ•„๋“œ ๋Œ€์‹ , ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜,ํŒŒ๋ผ๋ฏธํ„ฐ,ThreadLocal์„ ์“ฐ๊ธฐ
      ( ์Šคํ”„๋ง ๋นˆ์˜ ๊ณต์œ ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ์žฅ์•  ๋ฐœ์ƒ )
      Ex. ํ•„๋“œ๊ฐ€ ์•„๋‹Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ž


โœ”๏ธ ์‹ฑ๊ธ€ํ†ค ์˜ˆ์‹œ

โžœ ์›Œ๋“œ์— ์ž‘์„ฑํ•ด ๋†“์€ ๊ฒƒ ์ฐธ๊ณ ํ•˜๊ธฐ !!


๐ŸŒˆ ๋Š๋‚€์ 

์˜ค๋Š˜ ํ•™์Šต ์„ค๋ช…์ด ์ข€ ๊ผฌ์ด๊ณ  ๊ผฌ์ธ ๋Š๋‚Œ์ด์–ด์„œ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์› ๋‹คใ… 
๊ทธ๋ž˜์„œ ํ•™์Šต ์‹œ๊ฐ„์—๋Š” ์ฝ์œผ๋ฉด์„œ ์ •๋ฆฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋„์ €ํžˆ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ”์—ˆ๋Š”๋ฐ ๊ทธ๋ž˜๋„ ์ดํ›„ ์ดํ•ดํ•˜๋ ค๊ณ  ๋ง๋กœ ์„ค๋ช…ํ•ด๋ณด๋ฉด์„œ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑํ•˜๋‹ˆ๊นŒ ๋งŽ์ด ์ดํ•ด๊ฐ€ ๋๋‹ค !

0๊ฐœ์˜ ๋Œ“๊ธ€