[Spring] Singleton Container

DEINGVELOPยท2023๋…„ 4์›” 16์ผ
0

๐Ÿ’ก Singleton Container๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ?
์Šคํ”„๋ง ์—†๋Š” ์ˆœ์ˆ˜ํ•œ DI ์ปจํ…Œ์ด๋„ˆ : ์š”์ฒญ์„ ํ•  ๋•Œ ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ

  • ๊ณ ๊ฐ ํŠธ๋ž˜ํ”ฝ์ด ์ดˆ๋‹น 100์ด ๋‚˜์˜ค๋ฉด ์ดˆ๋‹น 100๊ฐœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ / ์†Œ๋ฉธ : ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„

๐Ÿ‘‰๐Ÿป ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๊ณ , ๊ณต์œ ํ•˜๋„๋ก ์„ค๊ณ„ํ•˜๊ธฐ : ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

Singleton Pattern

: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

  • ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ 2๊ฐœ ์ด์ƒ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๊ธฐ
    • ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ• :private ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์™ธ๋ถ€์—์„œ ์ž„์˜๋กœ new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•จ

      ๊ทธ๋Ÿฌ๋ฉด ์ƒ์„ฑ์ž ์“ฐ๋ฉด Compile Error ํ„ฐ์ง
      ์„ธ์ƒ์—์„œ ์ œ์ผ ์ข‹์€ ์˜ค๋ฅ˜ = ์ปดํŒŒ์ผ์˜ค๋ฅ˜

๐Ÿ’ก ์ฐธ๊ณ 
์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๋Š”, ๊ฐ€์žฅ ๋‹จ์ˆœํ•˜๊ณ  ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ–ˆ๋‹ค.

Singleton Pattern์˜ ๋ฌธ์ œ์ 

  • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ„๋‹ค.
  • ์˜์กด๊ด€๊ณ„์ƒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•œ๋‹ค. โ†’ DIP๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•ด์„œ OCP ์›์น™์„ ์œ„๋ฐ˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋‚ด๋ถ€ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • private ์ƒ์„ฑ์ž๋กœ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค.
  • ๊ฒฐ๋ก ์ ์œผ๋กœ ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  • ์•ˆํ‹ฐํŒจํ„ด์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค.

Singleton Container

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹ฑ๊ธ€ํ†ค(1๊ฐœ๋งŒ ์ƒ์„ฑ)์œผ๋กœ
    ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์Šคํ”„๋ง ๋นˆ : ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋จ

SingletonRegistry

: ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ

  • ์‹ฑ๊ธ€ํ„ด ํŒจํ„ด์˜ ๋ชจ๋“  ๋‹จ์ ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์œ„ํ•œ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
    • DIP, OCP, ํ…Œ์ŠคํŠธ, private ์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ž์œ ๋กญ๊ฒŒ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์ฐธ๊ณ 

  • ์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹ = ์‹ฑ๊ธ€ํ†ค
  • ๋‹จ, ์‹ฑ๊ธ€ํ†ค ์ด์™ธ์˜ ๋ฐฉ์‹๋„ ์กด์žฌ!
    ์š”์ฒญ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต

Singleton ๋ฐฉ์‹์˜ ์ฃผ์˜์ 

  • ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹ : ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค
    • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ!
    • ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ธ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ
    • ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ
  • ํ•„๋“œ ๋Œ€์‹ ์— ์ž๋ฐ”์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ThreadLocal ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์Šคํ”„๋ง ๋นˆ์˜ ํ•„๋“œ์— ๊ณต์œ  ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ์ •๋ง ํฐ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค!!!

๐Ÿ’ก ์ •๋ฆฌ

  • ์‹ค๋ฌด์—์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ข…์ข… ๋ณด๋Š”๋ฐ, ์ด๋กœ์ธํ•ด ์ •๋ง ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ํฐ ๋ฌธ์ œ๋“ค์ด ํ„ฐ์ง„๋‹ค.(๋ช‡๋…„์— ํ•œ๋ฒˆ์”ฉ ๊ผญ ๋งŒ๋‚œ๋‹ค.)
  • ์ง„์งœ ๊ณต์œ ํ•„๋“œ๋Š” ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค! ์Šคํ”„๋ง ๋นˆ์€ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•˜์ž.

@Configuration

: ์‹ฑ๊ธ€ํ†ค์„ ์œ„ํ•ด ์กด์žฌํ•จ!

๋ฐฉ๋ฒ•

  • ์Šคํ”„๋ง์€ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    • AnnotationConfigApplicationContext์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธด ๊ฐ’์€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค. ๊ทธ๋ž˜์„œ AppConfig๋„ ์Šคํ”„๋ง ๋นˆ์ด ๋œ๋‹ค.
    • ๋‹จ, ์ˆœ์ˆ˜ํ•œ ํด๋ž˜์Šค๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š๋Š”๋‹ค.
    • ์Šคํ”„๋ง์ด CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์กฐ์ž‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ AppConfig ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค.
  • AppConfig@CGLIB ์˜ˆ์ƒ ์ฝ”๋“œ

    @Bean
    public MemberRepository memberRepository() {
    
       if (memoryMemberRepository๊ฐ€ ์ด๋ฏธ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉด?) {
       		return ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜;
       } else { //์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์—†์œผ๋ฉด
       		๊ธฐ์กด ๋กœ์ง์„ ํ˜ธ์ถœํ•ด์„œ MemoryMemberRepository๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก
       		return ๋ฐ˜ํ™˜
       }
    }

    ๐Ÿ’ก ์ฐธ๊ณ 
    AppConfig@CGLIB๋Š” AppConfig์˜ ์ž์‹ ํƒ€์ž…์ด๋ฏ€๋กœ, AppConfig ํƒ€์ž…์œผ๋กœ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ, @Configuration ์ ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ?

  • @Bean๋งŒ ์‚ฌ์šฉํ•ด๋„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ‘‰๐Ÿป ์ •๋ฆฌ
ํฌ๊ฒŒ ๊ณ ๋ฏผํ•  ๊ฒƒ์ด ์—†๋‹ค. ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด๋Š” ํ•ญ์ƒ @Configuration์„ ์‚ฌ์šฉํ•˜์ž

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