[Spring] Bean Scope

2021. 10. 10. 08:00ใ†Back-End ์ž‘์—…์‹ค/Spring Framework

728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“‹ ๋ชฉ์ฐจ


01. [Spring] ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ
02. [Spring] ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID)
03.
[Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง   
04. [Spring] OCP์™€ DIP ๊ณ ๋ คํ•˜๊ธฐ
05. [Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ
06.
[Spring] AppConfig ๋ฆฌํŒฉํ„ฐ๋ง    
07. [Spring] Ioc, DI Container  
08. [Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ  
09. [Spring] ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ  
10. [Spring] Component Scan And Auto wired Start
11.
[Spring] ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•    
12. [Spring] Bean Life Cycle Call Back
13.
[Spring] Bean Scope

 

 

 

 

๐Ÿ“Œ ๋นˆ ์Šค์ฝ”ํ”„


์Šคํ”„๋ง ๋นˆ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์–ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์€ ์Šคํ”„๋ง ๋นˆ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋กœ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์Šค์ฝ”ํ”„๋Š” ๋นˆ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๋œปํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

    ๐Ÿ“ ์Šคํ”„๋ง์˜ ์ง€์› ์Šค์ฝ”ํ”„

  1. ์‹ฑ๊ธ€ํ†ค : ๊ธฐ๋ณธ ์Šค์ฝ”ํ”„, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ๊ฐ€์žฅ ๋„“์€ ๋ฒ”์œ„์˜ ์Šค์ฝ”ํ”„
  2. ํ”„๋กœํ† ํƒ€์ž… : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•˜๊ณ , ๋” ์ด์ƒ ๊ด€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
                     ์ฆ‰, ์ƒ์„ฑ์„ ํ•˜๊ณ , ์š”์ฒญ์ž์—๊ฒŒ ์‘๋‹ต์œผ๋กœ ๋˜์ ธ์ฃผ๊ธฐ๋งŒ ํ•˜๊ณ , ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
  3. ์›น ๊ด€๋ จ ์Šค์ฝ”ํ”„ :
    • request : Web ์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ณ , ์‘๋‹ต์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„
    • session : Web Session์ด ์ƒ์„ฑ๋˜๊ณ , ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„
    • application : Web Sevlet Context์™€ ๊ฐ™์€ ๋ฒ”์œ„๋กœ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„

 

๋นˆ ์Šค์ฝ”ํ”„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

Component Scan Auto Registration

 

Component Scan Manual Registration

 

 

 

    ๐Ÿ“ Prototype Scope

์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์กฐํšŒํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ ์Šคํ”„๋ง ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๋ฐ˜๋ฉด ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์กฐํšŒํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ์‹ฑ๊ธ€ํ†ค ๋นˆ ์š”์ฒญ

 

๋จผ์ € ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญ์„ ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž์‹ ์ด ๊ด€๋ฆฌํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋Ÿฐ ๋’ค ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ™์€ ์š”์ฒญ์ด ์™€๋„ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ ํ•œ๋‹ต๋‹ˆ๋‹ค!

 

 

         ๐Ÿ‘‰ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์š”์ฒญ 1

์ตœ์ดˆ ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ทธ ์‹œ์ ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋งŒ๋“ค๊ณ , ํ•„์š”ํ•œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์š”์ฒญ 2

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ™์€ ์š”์ฒญ์ด ์™”์„ ๋•Œ, ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

๋งˆ์น˜ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„๋Š” ์–ด๋–ค ์ˆ™๋ฐ• ์—…์†Œ์— ์†๋‹˜ ์–ผ๊ตด์„ ์ž˜ ๊ธฐ์–ตํ•˜๋Š” ์ฃผ์ธ๋ถ„๊ป˜์„œ ์†๋‹˜์ด ์˜ค์‹œ๋ฉด "์–ด๋จธ! ๋˜ ์˜ค์…จ๋„ค์š”! 401ํ˜ธ๋กœ ์ค€๋น„ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค!"๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€๋ฐ, ํ”„๋กœํ† ํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ฃผ์ธ๋ถ„๊ป˜์„œ ์•ˆ๋ฉด์ธ์‹ ์žฅ์• ๊ฐ€ ์žˆ์œผ์…”๊ฐ€์ง€๊ตฌ 1๋…„ ๋‚ด๋‚ด ์˜ค๋Š”๋Œ€๋„ "์–ด์„œ์˜ค์„ธ์š”! ์ฒ˜์Œ ๋ต™๊ฒ ์Šต๋‹ˆ๋‹ค!" ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ฐฉ์„ ์ฃผ๋Š” ๊ฒƒ์ด ์—ฐ์ƒ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

์ •๋ฆฌํ•˜์ž๋ฉด

 

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•˜๊ณ , ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…, ์ดˆ๊ธฐํ™”๊นŒ์ง€๋งŒ ์ฒ˜๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด์—์š”.

ํด๋ผ์ด์–ธํŠธ์— ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ ๋’ค์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ๋œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๊ด€๋ฆฌํ•  ์ฑ…์ž„์€ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋ฐ›์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [ @PreDestroy ] ๊ฐ™์€ ์ข…๋ฃŒ Method๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.

 

         ๐Ÿ‘‰ ์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„ ๋นˆ ํ…Œ์ŠคํŠธ

 

์‹ฑ๊ธ€ํ†ค ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์กฐํšŒํ•˜๋Š” singletonBeanFind()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

 

 

  1. Bean ์ดˆ๊ธฐํ™” Method ํ˜ธ์ถœ(์‹คํ–‰)
  2. ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ Bean ์กฐํšŒ
  3. ์ข…๋ฃŒ Method ์ •์ƒ ํ˜ธ์ถœ

 

 

ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์กฐํšŒํ•˜๋Š” prototypeBeanFind()๋ฅผ ๋ถˆ๋Ÿฌ๋ณผ๊ฒŒ์š”!

 

 

  1. ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ์ ์— ์ดˆ๊ธฐํ™” Method๊ฐ€ ์‹คํ–‰ ๋˜์ง€๋งŒ, ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์˜ ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นˆ์„ ์กฐํšŒํ•  ๋•Œ ์ƒ์„ฑ๋˜๊ณ , ์ดˆ๊ธฐํ™” Method ์‹คํ–‰
  2. ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ 2๋ฒˆ ์กฐํšŒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๋‹ค๋ฅธ ์Šคํ”„๋ง ๋นˆ์ด ๋งŒ๋“ค์–ด์ง€๊ณ , ์ดˆ๊ธฐํ™”๋„ 2๋ฒˆ ์‹คํ–‰
  3. ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ, ๋นˆ์˜ ์ข…๋ฃŒ Method๊ฐ€ ์‹คํ–‰๋˜๋‚˜, ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๊ณผ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž… ๊ทธ๋ฆฌ๊ณ , ์ดˆ๊ธฐํ™” ๊นŒ์ง€๋งŒ ์‹ ๊ฒฝ์“ฐ๊ณ , ์‹ ๊ฒฝ์„ ๊บผ ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ฆ‰, ๋” ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ [ @PreDestory ] ๊ฐ™์€ ์ข…๋ฃŒ Method๊ฐ€ ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๋ฐ˜์‘ํ˜•

 

    ๐Ÿ“ Prototype Scope - Singleton Bean๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ ๋ฌธ์ œ์ 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœํ† ํƒ€์ž… ์Šค์ฝ”ํ”„์˜ ๋นˆ์„ ์š”์ฒญํ•˜๋ฉด ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

ํ•˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋• ์˜๋„ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”. 

 

         ๐Ÿ‘‰ Spring Container Prototype Bean Direct Request 1

 

์ตœ์ดˆ ํด๋ผ์ด์–ธํŠธ A๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์š”์ฒญํ•˜๊ณ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๋’ค ๋ฐ˜ํ™˜(x01)ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ํ•ด๋‹น ๋นˆ์˜ count Field ๊ฐ’์€ 0์ธ ์ƒํƒœ์ธ ๊ฒƒ์ด์—์š”.

ํด๋ผ์ด์–ธํŠธ๋Š” ์กฐํšŒํ•œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์— addCount()๋ฅผ ๋ถ€๋ฅด๋ฉด์„œ count Field๋ฅผ +1ํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ(x01)์˜ count๋Š” 1์ด ๋˜๊ฒ ์ง€์š”?

 

 

 

 

         ๐Ÿ‘‰ Singleton Bean at use Prototype Bean 1

 

clientBean์€ ์‹ฑ๊ธ€ํ†ค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ์ ์— ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๊ณ , ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…๋„ ์ด ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

clientBean์€ ์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ์ฃผ์ž… ์‹œ์ ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•œ ๋’ค clientBean์— ๋ฐ˜ํ™˜์„ ํ•˜๊ณ , ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ count Field ๊ฐ’์€ 0์ธ ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ ๋’ค clientBean์€ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋‚ด๋ถ€ Field์— ์ฐธ์กฐ๊ฐ’์„ ๋ณด๊ด€ํ•œ๋‹ต๋‹ˆ๋‹ค.

 

 

         ๐Ÿ‘‰ Singleton Bean at use Prototype Bean 2

 

ํด๋ผ์ด์–ธํŠธ A๋Š” clientBean์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ๋ฐ›๋Š” ๊ฒƒ์ด์—์š”. ์‹ฑ๊ธ€ํ†ค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ํ•ญ์ƒ ๊ฐ™์€ clientBean์ด ๋ฐ˜ํ™˜๋  ๊ฒƒ์ด์—์š”.

ํด๋ผ์ด์–ธํŠธ A๊ฐ€ clientBean.logic()์„ ๋ถ€๋ฅด๊ฒŒ ๋˜๋ฉด clientBean์€ prototypeBean์˜ addCount()๋ฅผ ๋ถˆ๋Ÿฌ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ฒŒ ๋˜๊ณ , ์ด ๋•Œ๋ฌธ์— count ๊ฐ’์ด 1์ด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ Singleton Bean at use Prototype Bean 3

 

ํด๋ผ์ด์–ธํŠธ B๊ฐ€ clientBean์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ๋ฐ›์„ ๋•Œ, clientBean์€ ์‹ฑ๊ธ€ํ†ค์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ฐ™์€ clientBean์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์ด์—์š”.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ clientBean์ด ๋‚ด๋ถ€์— ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์ด๋ฏธ ๊ณผ๊ฑฐ์— ์ฃผ์ž…์ด ๋๋‚œ ๋นˆ์ธ ๊ฒƒ์ด์—์š”.
์ฃผ์ž… ์‹œ์ ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญํ•ด์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์ด์ง€ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๊ฒƒ์ด์—์š”!

ํด๋ผ์ด์–ธํŠธ B๋Š” clientBean.logic()์„ ๋ถ€๋ฅด๊ฒŒ ๋˜๊ณ , clientBean์€ prototypeBean์˜ addCount()๋ฅผ ๋ถˆ๋Ÿฌ ํ”„๋กœํ†  ํƒ€์ž… ๋นˆ์˜ count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”. ์›๋ž˜ count ๊ฐ’์ด 1์ด์˜€๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

์Šคํ”„๋ง์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.
๊ทธ๋Ÿฐ๋ฐ, ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑ ์‹œ์ ์—๋งŒ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ธฐ๋Š” ํ•˜๋‚˜, ์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ•จ๊ป˜ ๊ณ„์† ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ธ ๊ฒƒ์ด์—์š”.

์•„๋งˆ ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ด๊ฒƒ์„ ํฌ๋งํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹๊ฒƒ์ด์—์š”.
ํ”„๋กœํ†  ํƒ€์ž… ๋นˆ์„ ์ฃผ์ž… ์‹œ์ ์—๋งŒ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ผํ…Œ๋‹Œ๊นŒ์š”!

 

๐Ÿ’ก ์ฐธ๊ณ  :

์—ฌ๋Ÿฌ ๋นˆ์—์„œ ๊ฐ™์€ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ฃผ์ž… ๋ฐ›์œผ๋ฉด ์ฃผ์ž… ๋ฐ›๋Š” ์‹œ์ ์— ๊ฐ๊ฐ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์ƒ์„ฑ.
์˜ˆ ๋“ค์–ด clientA, clientB๊ฐ€ ๊ฐ๊ฐ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์˜ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ ์ฃผ์ž…์„ ๋ฐ›๋Š”๋‹ค.

clientA ๐Ÿ‘‰ prototypeBean@x01
clientB ๐Ÿ‘‰ prototypeBean@x02

๋‹จ, ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜

 

 

    ๐Ÿ“ Prototype Scope - Singleton Bean๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ์‹œ Provider๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ

์‹ฑ๊ธ€ํ†ค ๋นˆ๊ณผ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

         ๐Ÿ‘‰ Spring Container Request

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งˆ๋‹ค ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ƒˆ๋กœ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

ac.getBean()์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์˜์กด ๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…(DI) ๋ฐ›๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์ด๋ ‡๊ฒŒ ์ง์ ‘ ํ•„์š”ํ•œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฐพ๋Š” ๊ฒƒ์„ Dependency Lookup(DL)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋Š” ์˜์กด ๊ด€๊ณ„ ์กฐํšŒ(ํƒ์ƒ‰)์ด๋ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์Šคํ”„๋ง ์• ํ•„๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ์ „์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›๊ฒŒ ๋˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์ข…์†์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋˜๊ณ , ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์—ญ์‹œ ์–ด๋ ค์šด ๊ฒƒ์ด์—์š”.

์ด ์‹œ์ ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ์ง€์ •ํ•œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋Œ€์‹  ์ฐพ์•„์ฃผ๋Š” DL ์ •๋„์˜ ๊ธฐ๋Šฅ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์„ ์Šคํ”„๋ง์€ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›ํ•ด ์ค€๋‹ต๋‹ˆ๋‹ค!

 

 

    ๐Ÿ“ ObjectFactory, ObjectProvider

์ง€์ •ํ•œ ๋นˆ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋Œ€์‹  ์ฐพ์•„์ฃผ๋Š” DL ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ObjectProvider์ธ ๊ฒƒ์ด์—์š”.
์ฐธ๊ณ ๋กœ ๊ณผ๊ฑฐ์—๋Š” ObjectFactory๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์— ํŽธ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์„œ ObjectProvider๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด์—์š”.

 

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด prototypeBeanProvider.getObject()๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด์—์š”.

ObjectProvicer์˜ getObjet()๋ฅผ ๋ถ€๋ฅด๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋นˆ์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”. (DL)

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜,  mock ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋Š” ํ›จ์”ฌ ์‰ฝ๋‹ต๋‹ˆ๋‹ค!

ObjectProvider๋Š” ์ง€๊ธˆ ๋”ฑ ํ•„์š”ํ•œ DL ์ •๋„์˜ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

 

 

ํŠน์ง•

  1. ObjectFactory : ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœ, ๋ณ„๋„ Library์—†์Œ, Spring์— ์˜์กด
  2. ObjectProvider : ObjectFactory ์ƒ์†, Option, Stream ์ฒ˜๋ฆฌ ๋“ฑ ํŽธ์˜ ๊ธฐ๋Šฅ์ด ๋งŽ๊ณ , ๋ณ„๋„ Library ํ•„์š” ์—†์œผ๋ฉฐ, Spring์— ์˜์กด

 

 

         ๐Ÿ‘‰ JSR-330 Provider

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ javax.inject.Provider๋ผ๋Š” JSR-330 Java Stadard๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” java.inject:javax.inject:1 Library๋ฅผ gradle์— ์ถ”๊ฐ€ ํ•ด์ค˜์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค!

 

package javax.inject;

public interface Provider<T> {
 T get();
}

/* -------------------------------------------- */

//implementation 'javax.inject:javax.inject:1' gradle ์ถ”๊ฐ€ ํ•„์ˆ˜
	@Autowired	private Provider<PrototypeBean> provider;
		public int logic() {
 		PrototypeBean prototypeBean = provider.get();
 		prototypeBean.addCount();
 		int count = prototypeBean.getCount();
 		return count;
}

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด provider.get()์„ ํ†ตํ•ด ํ•ญ์ƒ ์ƒˆ๋กœ์šด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—์š”.

provider์˜ get()์„ ๋ถ€๋ฅด๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋นˆ์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ต๋‹ˆ๋‹ค! (DL)

JAVA Standard์ด๋ฉฐ, ๊ธฐ๋Šฅ์ด ๋‹จ์ˆœํ•˜๋ฏ€๋กœ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜, mock ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋Š” ํ›จ์”ฌ ์‰ฌ์›Œ์ง€๋Š” ๊ฒƒ์ด์—์š”.

Provider๋Š” ๋”ฑ ํ•„์š”ํ•œ DL ์ •๋ณด์˜ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

ํŠน์ง•

  1. get() ํ•˜๋‚˜๋กœ ๊ธฐ๋Šฅ์ด ๋งค์šฐ ๋‹จ์ˆœ
  2. ๋ณ„๋„ Library ํ•„์š”
  3. JAVA Standard๋กœ Spring์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

 

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

ObjectProvider, JSR330 Provider ๋“ฑ์€ ํ”„๋กœํ† ํƒ€์ž… ๋ฟ ์•„๋‹ˆ๋ผ DL์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ธ์ œ๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  :

์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” Method์— @Lookup์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์œผ๋‚˜, ์ด์ „ ๋ฐฉ๋ฒ•๋“ค๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค.

์ž๋ฐ” ํ‘œ์ค€์ธ JSR-330 Provider๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ObjectProvider๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผ์ด ๋˜๋Š” ์ˆœ๊ฐ„์ด ์˜จ๋‹ค๋ฉด ObjcetProvider๋Š” DL์„ ์œ„ํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์„ ๋งŽ์ด ์ œ๊ณตํ•˜๋ฉฐ, ์Šคํ”„๋ง ์™ธ์— ๋ณ„๋„ ์˜์กด ๊ด€๊ณ„์ถ”๊ฐ€๊ฐ€ ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ํŽธํ•˜๋‹ค. ๊ฑฐ์˜ ๊ทธ๋Ÿด์ผ์€ ์—†๊ฒ ๋‹ค๋งŒ ์ฝ”๋“œ๋ฅผ ์Šคํ”„๋ง์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค๋ฉด JSR-330 Provider๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์ด ๊ธฐ๋Šฅ ๋ฟ ์•„๋‹ˆ๋ผ, ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋“ค๋„ JAVA Standard์™€ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๊ฒน์น ๋•Œ๊ฐ€ ๋งŽ์€๋ฐ, ๋Œ€๋ถ€๋ถ„ ์Šคํ”„๋ง์ด ๋” ๋‹ค์–‘ํ•˜๊ณ , ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํžˆ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

    ๐Ÿ“ Web Scope

์ง€๊ธˆ๊นŒ์ง€ ์‹ฑ๊ธ€ํ†ค๊ณผ ํ”„๋กœํ† ํƒ€์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ ๊ฒƒ์ด์—์š”. ์‹ฑ๊ธ€ํ†ค์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์‹œ์ž‘๊ณผ ๋๊นŒ์ง€ ํ•จ๊ป˜ํ•˜๋Š” ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ํฐ ์Šค์ฝ”ํ”„์ด๊ณ , ํ”„๋กœํ† ํƒ€์ž…์€ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐํ™”๊นŒ์ง€๋งŒ ์ง„ํ–‰ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์นœ๊ตฌ์ธ ๊ฒƒ์ด์—์š”.

 

์›น ์Šค์ฝ”ํ”„์˜ ํŠน์ง•

  1. ์›น ์Šค์ฝ”ํ”„๋Š” ์›น ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘
  2. ์›น ์Šค์ฝ”ํ”„๋Š” ํ”„๋กœํ† ํƒ€์ž…๊ณผ ๋‹ค๋ฅด๊ฒŒ ์Šคํ”„๋ง์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ข…๋ฃŒ ์‹œ์ ๊นŒ์ง€ ๊ด€๋ฆฌ.
    ๋”ฐ๋ผ์„œ ์ข…๋ฃŒ Method๊ฐ€ ํ˜ธ์ถœ

 

 

์›น ์Šค์ฝ”ํ”„ ์ข…๋ฅ˜

  1. request : HTTP ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๊ณ , ์‘๋‹ต์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„๋กœ ๊ฐ๊ฐ์˜ HTTP ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ Bean ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ, ๊ด€๋ฆฌ
  2. session : HTTP Session๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–์Œ
  3. application : Servlet Context์™€ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–์Œ
  4. websocket : ์›น ์†Œ์ผ“๊ณผ ๋™์ผํ•œ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ–์Œ

 

 

         ๐Ÿ‘‰ HTTP Requset ๋‹น ๊ฐ๊ฐ ํ• ๋‹น๋˜๋Š” Request Scope

 

 

         ๐Ÿ‘‰ Make Request Scope Example

 

WEB Environment Insert

์›น ์Šค์ฝ”ํ”„๋Š” ์›น ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— WEB ํ™˜๊ฒฝ์ด ๋™์ž‘ํ•˜๋„๋ก Library ์ถ”๊ฐ€ ํ•„์š”

 

build.gradle

 

main Method ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด์—์š”.

 

 

Spring-boot-starter-web Library๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋‚ด์žฅ ํ†ฐ์ผ“ ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›น ์„œ๋ฒ„์™€ ์Šคํ”„๋ง์„ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์›น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ–ˆ๋˜ AnnotationConfigApplicationContext๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Application์„ ๊ตฌ๋™ํ•˜์ง€๋งŒ, ์›น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์›น์— ๊ด€๋ จ๋œ ์ถ”๊ฐ€ ์„ค์ •๊ณผ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— AnnotationConfigServletWebServerApplicationContext๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Application์„ ๊ตฌ๋™ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

๋งŒ์•ฝ ๊ธฐ๋ณธ Port์ธ 8080์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋™์ด ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 9090 ๋“ฑ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

main/resources/application.properties

 

 

    ๐Ÿ“ Request Scope Example Develop

๋™์‹œ์— ์—ฌ๋Ÿฌ HTTP Request๊ฐ€ ์˜ค๋ฉด ์ •ํ™•ํžˆ ์–ด๋–ค Request๊ฐ€ ๋‚จ๊ธด Log์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์ด์—์š”.

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์€๊ฒƒ์ด ๋ฐ”๋กœ Request Scope์ธ ๊ฒƒ์ด์—์š”.

 

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด๋ณผ Code์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”!

 

[d06b992f...] request scope bean create[d06b992f...][http://localhost:8080/log-demo] controller test
[d06b992f...][http://localhost:8080/log-demo] service id = testId
[d06b992f...] request scope bean close

 

  • Common Format : [UUID] {requestURL} {message}
  • UUID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ ๊ตฌ๋ถ„
  • requestURL ์ •๋ณด๋„ ์ถ”๊ฐ€ํ•˜์—ฌ ์–ด๋–ค URL Request์—์„œ ๋‚จ์€ Log์ธ์ง€ ํ™•์ธ

 

JunyHarangLogger.java

 

์œ„์˜ Class๋Š” Log๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ JunyHarangLogger์ธ ๊ฒƒ์ด์—์š”.

@Scope(value = "request")๋ฅผ ํ†ตํ•ด request ์Šค์ฝ”ํ”„๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ์ด์—์š”. ์ด์ œ Bean์€ HTTP Request ๋‹น ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๊ณ , HTTP Request๊ฐ€ ๋๋‚˜๋Š” ์‹œ์ ์— ์†Œ๋ฉธ๋˜๋Š” ๊ฒƒ์ด์—์š”.

ํ•ด๋‹น Bean์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์— ์ž๋™์œผ๋กœ @PostConstruct ์ดˆ๊ธฐํ™” Method๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ uuid๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด์—์š”. ํ•ด๋‹น Bean์€ HTTP Request ๋‹น ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— uuid๋ฅผ ์ €์žฅํ•ด๋‘๋ฉด ๋‹ค๋ฅธ HTTP Request์™€ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๋‹ต๋‹ˆ๋‹ค!

ํ•ด๋‹น Bean์ด ์†Œ๋ฉธ๋˜๋Š” ์‹œ์ ์— @PreDestroy๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธธ ๊ฒƒ์ด์—์š”.

requestURL์€ ํ•ด๋‹น Bean์ด ์ƒ์„ฑ๋˜๋Š” ์‹œ์ ์—๋Š” ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ setter๋กœ ์ž…๋ ฅ ๋ฐ›๊ฒŒ ํ•œ ๊ฒƒ์ด์—์š”.

 

LogDemoController.java

 

์œ„์˜ Controller๋Š” Logger๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ Test์šฉ Controller์ธ ๊ฒƒ์ด์—์š”.

์—ฌ๊ธฐ์„œ HttpServletRequest๋ฅผ ํ†ตํ•ด ์š”์ฒญ URL์„ ๋ฐ›์•˜๊ตฌ์š”. (requestURL Value = http://localhost:8080/log-demo)

์ด๋ ‡๊ฒŒ ๋ฐ›์€ requestURL ๊ฐ’์„ JunyHarangLogger์— ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ์ด์—์š”. JunyHarangLogger๋Š” HTTP ์š”์ฒญ ๋‹น ๊ฐ๊ฐ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ HTTP ์š”์ฒญ ๋•Œ๋ฌธ์— ๊ฐ’์ด ์„ž์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ด๊ฒƒ์€ ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋„ค๋‹ค!๋ผ๋Š” ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  :

requestURL์„ JunyHarangLogger์— ์ €์žฅํ•˜๋Š” ๋ถ€๋ถ„์€ ์ปจํŠธ๋กค๋Ÿฌ ๋ณด๋‹ค ๊ณตํ†ต ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์Šคํ”„๋ง ์ธํ„ฐ์…‰ํ„ฐ๋‚˜ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ ๊ฐ™์€ ๊ณณ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

LogDemoService.java

 

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋„ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด์—์š”.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ request scope๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋งค๊ฐœ ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋กœ ์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ์„œ๋น„์Šค ๊ณ„์ธต์— ๋„˜๊ธด๋‹ค๋ฉด ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์•„ ๋“œ๋Ÿฌ์›Œ ์ง€๋Š” ๊ฒƒ์ด์—์š”. ๋” ๋ฌธ์ œ๋Š” requestURL ๊ฐ™์€ ์›น๊ณผ ๊ด€๋ จ๋œ ์ •๋ณด๊ฐ€ ์›น๊ฐ€ ๊ด€๋ จ์—†๋Š” ์„œ๋น„์Šค ๊ณ„์ธต๊นŒ์ง€ ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”. ์›น๊ณผ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์€ ์ปจํŠธ๋กค๋Ÿฌ๊นŒ์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ณ , ์„œ๋น„์Šค ๊ณ„์ธต์€ ์›น ๊ธฐ์ˆ ์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ๊ฐ€๊ธ‰์  ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ ๊ด€์ ์—์„œ ์ข‹์€ ๊ฒƒ์ด์—์š”.

request scope์˜ JunyHarangLogger ๋•๋ถ„์— ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๊ธฐ ์•Š๊ณ , JunyHarangLogger์˜ ๋ฉค๋ฒ„๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์ฝ”๋“œ์™€ ๊ณ„์ธต์„ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

๊ธฐ๋Œ€ํ•˜๋Š” ์ถœ๋ ฅ

 

 

๊ธฐ๋Œ€์™€๋Š” ๋‹ค๋ฅธ Exception

Error creating bean with name 'junyHarangLogger': Scope 'request' is not active for the 
current thread; consider defining a scoped proxy for this bean 
if you intend to refer to it from a singleton;

 

Main Method๊ฐ€ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์œ„์™€ ๊ฐ™์ด Exception์ด ํ„ฐ์ง€๋Š”๋ฐ, ๋ฉ”์‹œ์ง€ ๋งˆ์ง€๋ง‰์— ์‹ฑ๊ธ€ํ†ค์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—์š”. ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ์‹ฑ๊ธ€ํ†ค ๋นˆ์„ ์ƒ์„ฑํ•ด์„œ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋‚˜, request ์Šค์ฝ”ํ”„ ๋นˆ์€ ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”. ํ•ด๋‹น ๋นˆ์€ ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์™€์•ผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์ด์—์š”.

 

 

    ๐Ÿ“ Scope And Provider

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฒซ๋ฒˆ์งธ๋กœ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ ๋ฐ”๋กœ Provider์ธ ๊ฒƒ์ด์—์š”.

๊ฐ„๋‹จํžˆ ObjectProvider๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ๊ฒƒ์ด์—์š”.

 

package hello.core.web;
import hello.core.common.MyLogger;
import hello.core.logdemo.LogDemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;

	@Controller @RequiredArgsConstructor
	public class LogDemoController {
 		private final LogDemoService logDemoService;
 		private final ObjectProvider<JunyHarangLogger> jhLoggerProvider;
 
 	@RequestMapping("log-demo") @ResponseBody
 	public String logDemo(HttpServletRequest request) {
 		String requestURL = request.getRequestURL().toString();
 		JunyHarangLogger jhLogger = jhLoggerProvider.getObject();
 		jhLoggerProvider.setRequestURL(requestURL); 
        jhLoggerProvider.log("์ด๊ฒƒ์€ ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋„ค๋‹ค!");
 		logDemoService.logic("testId");
 		return "OK";
 }
}

 

 

package hello.core.logdemo;
import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;

	@Service @RequiredArgsConstructor
	public class LogDemoService {
 
 		private final ObjectProvider<JunyHarangLogger> jhLoggerProvider;
 
 		public void logic(String id) {
 		JunyHarangLogger jhLogger = jhLoggerProvider.getObject();
 		jhLogger.log("์„œ๋น„์Šค์—์„œ ๋„˜์–ด์˜จ ๋™๋ฌด id๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋„ค๋‹ค! \n" + id);
 }
}

 

Main()์„ ์‹คํ–‰ํ•ด์„œ WEB Browser์— [ http://localhost:8080/log-demo ] ๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ์ด์—์š”.

 

 

ObjectProvider ๋•์— ObjectProvider.getObject()๋ฅผ ๋ถˆ๋Ÿฌ๋‚ด๋Š” ์‹œ์ ๊นŒ์ง€ request Scope Bean์˜ ์ƒ์„ฑ์„ ์ง€์—ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

ObjcetProvider.getObject()๋ฅผ ๋ถˆ๋Ÿฌ๋‚ด๋Š” ์‹œ์ ์—๋Š” HTTP ์š”์ฒญ์ด ์ง„ํ–‰์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— request Scope Bean์˜ ์ƒ์„ฑ์ด ์ •์ƒ ์ฒ˜๋ฆฌ ๋œ๋‹ต๋‹ˆ๋‹ค!

 

ObjcetProvider.getObject()๋ฅผ LogDemoController, Log DemoService์—์„œ ๊ฐ๊ฐ ํ•œ๋ฒˆ์”ฉ ๋”ฐ๋กœ ํ˜ธ์ถœํ•ด๋„ ๊ฐ™์€ HTTP ์š”์ฒญ์ด๋ฉด ๊ฐ™์€ Spring Bean์ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์ด์—์š”. ์ด๊ฑธ ์ง์ ‘ ๊ตฌ๋ถ„ํ•˜๋ ค๋ฉด ์ •๋ง ํž˜๋“ค ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ“ Scope And Proxy

์ด๋ฒˆ์—๋Š” Proxy ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋ณผ๊ฒƒ์ด์—์š”.

๐Ÿ’ก ์ฐธ๊ณ  : Proxy๋ž€?

์‚ฌ์ „์  ์˜๋ฏธ : 1) ๋Œ€๋ฆฌ(๊ถŒ)
                  2) ๋Œ€๋ฆฌ์ธ
                  3) (์ธก์ •, ๊ณ„์‚ฐํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ๊ฒƒ์„ ๋Œ€ํ‘œํ•˜๋„๋ก ์ด์šฉํ•˜๋Š”) ๋Œ€์šฉ๋ฌผ

Proxy Server๋ž€?
Client๊ฐ€ ์ž์‹ ์„ ํ†ตํ•ด์„œ ๋‹ค๋ฅธ Network Svice์— ๊ฐ„์ ‘์ ์œผ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์ด๋‚˜, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ. Server์™€ Client ์‚ฌ์ด์— ์ค‘๊ณ„๊ธฐ๋กœ์จ ๋Œ€๋ฆฌ๋กœ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌ์ผœ 'Proxy', ๊ทธ ์ค‘๊ณ„ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์„ Proxy Server๋ผ๊ณ  ์นญํ•œ๋‹ค.

Spring Proxy๋ž€?
์› ๋ž˜ ๊ฐ์ฒด๋ฅผ Proxy๋กœ ๊ฐ์‹ธ๊ณ , Client ์ธก์˜ ์š”์ฒญ์„ ๊ฐ์‹ธ์ง„ Proxy Class๋ฅผ ํ†ตํ•ด ๋Œ€๋ฆฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์œ ๋„

 

 

 

 

proxyMode = ScopedProxyMode.TARGET_CLASS ์ด ๋ถ€๋ถ„์ด ์•„์ฃผ์•„์ฃผ ์ค‘์š”ํ•œ ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์€ ์ ์šฉ ๋Œ€์ƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋ฉด TARGET_CLASS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด INTERFACES๋ฅผ ์“ฐ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JunyHarangLogger์˜ ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , HTTP request์™€ ์ƒ๊ด€ ์—†์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ Bean์— ๋ฏธ๋ฆฌ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

LogDemoController.java

 

 

LogDemoService.java

 

Code๋ฅผ ์ž˜ ๋ณด๊ฒŒ ๋˜๋ฉด LogDemoController์™€ LogDemoService๋Š” Provider ์‚ฌ์šฉ ์ „๊ณผ ์™„์ „ ๋™์ผํ•œ ๊ฒƒ์ด์—์š”.

์™œ ๊ทธ๋Ÿด๊นŒ์š”??

 

 

 

    ๐Ÿ“ WEB Scope And Proxy Principle of motion

๋จผ์ € ์ฃผ์ž…๋œ JunyHarangLogger๋ฅผ ํ™•์ธ ํ•ด ๋ณผ๊ฒŒ์š”!

์‹คํ–‰ ๊ฒฐ๊ณผ

 

์œ„์— ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด Spring์ด ๋งŒ๋“  Proxy ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด ์ง„ ๊ฒƒ์ด์—์š”!

@Scop์˜ proxyMode = ScopedProxyMode.TARGET_CLASS๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” CGLIB๋ผ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, JunyHarangLogger๋ฅผ ์ƒ์† ๋ฐ›๋Š” ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ฒฐ๊ณผ๋ฅผ ํ™•์ธ ํ•ด ๋ณด๋ฉด ๋“ฑ๋กํ•œ ์ˆœ์ˆ˜ํ•œ JunyHarangLogger ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ [ JunyHarangLogger$$EnhancerBySpringCGLIB ]๋ผ๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋Œ€์‹  ๋“ฑ๋ก๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— [ jhLogger ] ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ง„์งœ ๋Œ€์‹  ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด์—์š”.

ac.getBean("jhLogger", JunyHarangLogger.class)๋กœ ์กฐํšŒํ•ด๋„ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์กฐํšŒ ๋œ๋‹ต๋‹ˆ๋‹ค! ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…๋„ ์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์ฃผ์ž…๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ฃผ๋‹ˆํ•˜๋ž‘์€ MyLoggerProxy๊ฐ€ ์•„๋‹Œ JunyHarangProxy

 

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์š”์ฒญ์ด ์˜ค๋ฉด ๊ทธ ๋•Œ ๋‚ด๋ถ€์—์„œ ์ง„๋น  ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ์œ„์ž„ ๋กœ์ง์ด ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์— ์ง„์งœ jhLogger๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ jhLogger.logic()์„ ๋ถ€๋ฅด๊ฒŒ ๋˜๋ฉด ์‚ฌ์‹ค ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด์—์š”.

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” request ์Šค์ฝ”ํ”„์˜ ์ง„์งœ jhLogger.logic()์„ ๋ถ€๋ฅด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ง€์š”.

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์›๋ณธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ๋Š” ์‚ฌ์‹ค ์›๋ณธ์ธ์ง€ ์•„๋‹Œ์ง€๋„ ๋ชจ๋ฅด๊ฒŒ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๋•Œ๋ฌธ์— ๋‹คํ˜•์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒƒ์ด์ง€์š”.

 

 

๋™์ž‘ ์ •๋ฆฌ

CGLIB๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋‚ด ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ์š”์ฒญ์ด ์˜ค๋ฉด ๊ทธ ๋•Œ ๋‚ด๋ถ€์—์„œ ์‹ค์ œ Bean์„ ์š”์ฒญํ•˜๋Š” ์œ„์ž„ ๋กœ์ง์ด ๋“ค์–ด ์žˆ๋‹ต๋‹ˆ๋‹ค!

๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ request Scope์™€๋Š” ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ƒฅ ๊ฐ€์งœ์ด๊ณ , ๋‚ด๋ถ€์— ๋‹จ์ˆœํ•œ ์œ„์ž„ ๋กœ์ง๋งŒ ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์€ ์‹ฑ๊ธ€ํ†ค์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

ํŠน์ง• ์ •๋ฆฌ

ํ”„๋ก์‹œ ๊ฐ์ฒด ๋•๋ถ„์— ํด๋ผ์ด์–ธํŠธ๋Š” ๋งˆ์น˜ ์‹ฑ๊ธ€ํ†ค Bean์„ ์‚ฌ์šฉํ•˜๋“ฏ ํŽธ๋ฆฌํ•˜๊ฒŒ request Scope๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์‚ฌ์‹ค Provider๋ฅผ ์‚ฌ์šฉํ•˜๋“  Proxy๋ฅผ ์‚ฌ์šฉํ•˜๋“  ํ•ต์‹ฌ์€ ์ง„์งœ ๊ฐ์ฒด ์กฐํšŒ๋ฅผ ๊ผญ ํ•„์š”ํ•œ ์‹œ์ ๊นŒ์ง€ ์ง€์—ฐ์ฒ˜๋ฆฌ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค. ๋‹จ์ง€ ์–ด๋…ธํ…Œ์ด์…˜ ์„ค์ • ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ ์›๋ณธ ๊ฐ์ฒด๋ฅผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‹คํ˜•์„ฑ๊ณผ DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ€์ง„ ํฐ ์žฅ์ ์ด๋ž๋‹ˆ๋‹ค.

๊ผญ ์›น ์Šค์ฝ”ํ”„๊ฐ€ ์•„๋‹ˆ์–ด๋„ ํ”„๋ก์‹œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ฃผ์˜์ 

 

๋งˆ์น˜ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ, ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ด๋Ÿฐ ํŠน๋ณ„ํ•œ ์Šค์ฝ”ํ”„๋Š” ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ตœ์†Œํ™”ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค. ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜์ค‘์— ์œ ์ง€๋ณด์ˆ˜ํ•  ๋•Œ ํ†  ๋‚˜์˜ค๋Š” ๊ฒƒ์ด์—์š”.


 

 

์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€ ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ช…๋ก์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•