[Spring] ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ

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

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘ ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ Spring์˜ Singleton Container์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋‚ด์šฉ์€ ์ธํ”„๋Ÿฐ - ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

 

๋ฐฑ๊ฒฌ๋ถˆ์—ฌ์ผํƒ€ ์Šคํ”„๋ง ๋ถ€ํŠธ ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ with JPA:์ด์   ํ”„๋กœ์ ํŠธ๋‹ค!

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

 

๐Ÿ“‹ ๋ชฉ์ฐจ


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

 

 


 

 

๐Ÿ“Œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹ฑํดํ†ค


์›๋ž˜ ์Šคํ”„๋ง์€ Enterprise์šฉ์œผ๋กœ ์˜จ๋ผ์ธ ์„œ๋น„์Šค ๊ธฐ์ˆ ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ ๊ฒƒ์ด์—์š”. ๋ฌผ๋ก  ์›น์ด ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ๋„ ์–ผ๋งˆ๋“ ์ง€ ์Šคํ”„๋ง์„ ์ด์šฉํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์—ฌ๋Ÿฌ ๊ณ ๊ฐ์ด ๋™์‹œ์— ์š”์ฒญ์„ ํ•œ๋‹ค๋Š” ์ ์ธ๊ฒƒ์ด์—์š”.

 

 

์œ„์™€ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐœ๋…๋Œ€๋กœ๋ผ๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค new๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฐ˜ํ™˜ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

๐Ÿ“– Test ๊ฒฐ๊ณผ

 

์œ„์™€ ๊ฐ™์ด ์ด ์ „์— ๋งŒ๋“ค์—ˆ๋˜ ์Šคํ”„๋ง ์—†๋Š” ์ˆœ์ˆ˜ DI Container์ธ AppConfig๋Š” ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ณ ๊ฐ ํŠธ๋ž˜ํ”ฝ์ด ์ดˆ๋‹น 100์ด ๋‚˜์˜ค๋ฉด ์ดˆ๋‹น 100๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์†Œ๋ฉธ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๋•Œ๋ฌธ์— Memory ๋‚ญ๋น„๊ฐ€ ๋งค์šฐ ์‹ฌํ•ด์งˆ ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋”ฑ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๊ณ , ๊ณต์œ ํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž๋‹ˆ๋‹ค!

 

 

    ๐Ÿ“์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์ด๋ž€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”ฑ ํ•œ๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ธ ๊ฒƒ์ด์—์š”.

๊ทธ๋ž˜์„œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค 2๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์•„์ค€๋‹ต๋‹ˆ๋‹ค! private ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์ž„์˜๋กœ new๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด static ์˜์—ญ์— ๊ฐ์ฒด instance๋ฅผ ๋ฏธ๋ฆฌ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด์„œ ์˜ฌ๋ ค๋‘๋Š” ๊ฒƒ์ด์—์š”.

์ด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์˜ค์ง getInstance() Method๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , ์ด๊ฒƒ์„ ํ˜ธ์ถœํ•˜๋ฉด ํ•ญ์ƒ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋”ฑ ํ•œ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์กด์žฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ๋ง‰์•„ ํ˜น์‹œ๋ผ๋„ ์™ธ๋ถ€์—์„œ new๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ๋ง‰์•„์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 


๐Ÿ’ก์ฐธ๊ณ  : Static์ด๋ž€? 
'์ฃผ๋‹ˆํ•˜๋ž‘'์˜ [JAVA] Class Method(static Method)์™€ ์ธ์Šคํ„ด์Šค Method

 

์ž๋ฐ”์˜ Static์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์‹œ๊ฑฐ๋‚˜, ํ—ท๊ฐˆ๋ฆฌ์‹œ๋Š” ๋ถ„์€ ์—ฌ๊ธฐ์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

 

์œ„์˜ ์ฝ”๋“œ๋Š” ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์ธ ๊ฒƒ์ด์—์š”.

์œ„์— ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ์ž๋ฅผ private์œผ๋กœ ๋ง‰๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

private์œผ๋กœ ํ•˜๋ฉด new๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

 

๐Ÿ“– Test ๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•

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

 

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

2. isSameAS๋Š” ==์ฒ˜๋Ÿผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๊ณ , isEqual๋Š” Equals Mehotd์ฒ˜๋Ÿผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด Client์˜ ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์˜ ๋ฌธ์ œ์ 

 

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

์‹ฑ๊ธ€ํ†ค ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ํ•œ ์˜ˆ

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

 

 

 

๐Ÿ“Œ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ


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

์ง€๊ธˆ๊นŒ์ง€ ๊ณต๋ถ€ํ•œ ์Šคํ”„๋ง ๋นˆ์ด ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๋นˆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

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

์ด์ „์— ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๊ณผ์ •์„ ๋ณด๋ฉด ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์ฃ !

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

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

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

 

 

 

 

    ๐Ÿ“์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ ์ ์šฉ ๋’ค

 

 

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

 

๐Ÿ’ก์ฐธ๊ณ  :
์Šคํ”„๋ง์˜ ๊ธฐ๋ณธ ๋นˆ ๋“ฑ๋ก ๋ฐฉ์‹์€ ์‹ฑ๊ธ€ํ†ค์ด๋‚˜, ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์š”์ฒญ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณต.

 

 

    ๐Ÿ“์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์˜ ์ฃผ์˜์ 

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด, ์Šคํ”„๋ง ๊ฐ™์€ ์‹ฑ๊ธ€ํ†ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋˜์ง€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์œ ํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ Client๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€(stateful)ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ด์—์š”. ์ฆ‰, ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ต๋‹ˆ๋‹ค!

๊ทธ๋ง์ธ ์ฆ‰ ํŠน์ • Client์— ์˜์กด์ ์ธ ํ•„๋“œ(๋ฉค๋ฒ„๋ณ€์ˆ˜)๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ด์—์š”.

๋˜ํ•œ, ํŠน์ • Client๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๊ฒƒ์€ ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„๋“œ ๋Œ€์‹  ์ž๋ฐ”์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฏธํ„ฐ, ThreadLocal ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์Šคํ”„๋ง ๋นˆ์˜ ํ•„๋“œ์— ๊ณต์œ  ๊ฐ’์„ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ •๋ง ๋ฌด์‹œ๋ฌด์‹œํ•œ ์•ผ๊ทผ์— ์‹œ๋‹ฌ๋ฆฌ๊ฒŒ ๋ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”!

 

๐Ÿ’ก์ฐธ๊ณ  :
Thread(์“ฐ๋ ˆ๋“œ)๋ž€? ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰์ค‘์ธ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ณ , ์“ฐ๋ ˆ๋“œ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ๋™์ž‘๋˜๋Š” ์—ฌ๋Ÿฌ ์‹คํ–‰ ํ๋ฆ„
ํ”„๋กœ์„ธ์Šค๋Š” OS๋กœ ๋ถ€ํ„ฐ ํ• ๋‹น ๋ฐ›์€ ์ž‘์—… ๋‹จ์œ„, ์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น ๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰์˜ ๋‹จ์œ„

์ž๋ฐ”์—์„œ๋Š” JVM(Java Virtual Machin)์œ„์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋Œ์•„๊ฐ€๊ณ , ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ main Method ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๋˜ํ•œ, ์“ฐ๋ ˆ๋“œ๋Š” ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅ

ThreadLocal์ด๋ž€? ThreadLocal์€ Java Class๋กœ ThreadLocal์€ ์˜ค์ง ํ•œ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด์„œ ์“ฐ์—ฌ์งˆ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ๋‘ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ThreadLocal ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐ ํ•˜๋”๋ผ๋„ ์„œ๋กœ์˜ ThreadLocal ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

์ฆ‰, ThreadLocal ๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์ ‘๊ทผ ๊ฐ€๋Šฅ.

ThreadLocal ํ™œ์šฉ : ํ•œ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ๋œ ์ฝ”๋“œ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐœ๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ ๋•Œ ์‚ฌ์šฉ.

1. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด Spring Security์—์„œ ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ์ธ์ฆ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋‚˜ Session ์ •๋ณด
2. ์“ฐ๋ ˆ๋“œ์— ์•ˆ์ „ํ•ด์•ผ ํ•˜๋Š” Data ๋ณด๊ด€ ์‹œ

ThreadLocal ์ฃผ์˜์‚ฌํ•ญ : ์ด๊ฒƒ์€ Memory ๋ˆ„์ˆ˜์˜ ์œ„ํ—˜์ด ์žˆ๊ธฐ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
Thread pool ํ™˜๊ฒฝ์—์„œ ThreadLocal์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ€์ˆ˜์— ๋ณด๊ด€๋œ Data ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น Data๋ฅผ ์‚ญ์ œ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์žฌ ์‚ฌ์šฉ๋˜๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ Data๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

package hello.core.singleton;
  public class StatefulService {
	private int price; //์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•„๋“œ

	public void order(String name, int price) { 
    	System.out.println("name = " + name + " price = " + price); 
        this.price = price; //์—ฌ๊ธฐ๊ฐ€ ๋ฌธ์ œ!
	} // order() ๋
    
    public int getPrice() {
          return price;
	} // getPrice() ๋
} // Class ๋

 

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ ํ–ˆ์„ ๋•Œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š”?

 

package hello.core.singleton;
  import org.assertj.core.api.Assertions;
  import org.junit.jupiter.api.Test;
  import org.springframework.context.ApplicationContext;
  import
  org.springframework.context.annotation.AnnotationConfigApplicationContext;
  import org.springframework.context.annotation.Bean;
  public class StatefulServiceTest {
  
      @Test void statefulServiceSingleton() {
          ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);
          StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class);
          StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class);
	
          //ThreadA: A์‚ฌ์šฉ์ž 10000์› ์ฃผ๋ฌธ 
          statefulService1.order("userA", 10000);

          //ThreadB: B์‚ฌ์šฉ์ž 20000์› ์ฃผ๋ฌธ 
          statefulService2.order("userB", 20000);

          //ThreadA: ์‚ฌ์šฉ์žA ์ฃผ๋ฌธ ๊ธˆ์•ก ์กฐํšŒ
          int price = statefulService1.getPrice();

          //ThreadA: ์‚ฌ์šฉ์žA๋Š” 10000์›์„ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ, ๊ธฐ๋Œ€์™€ ๋‹ค๋ฅด๊ฒŒ 20000์› ์ถœ๋ ฅ 
          System.out.println("price = " + price);

          Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000);
            }
      static class TestConfig {
    
    	@Bean public StatefulService statefulService() {
              return new StatefulService();
        	  }
	  }
}

 

์œ„์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž A๊ฐ€ 10,000์›์–ด์น˜์˜ ์ฃผ๋ฌธ์„ ํ•˜๊ณ  ๋‚œ ๋’ค ์ž์‹ ์˜ ์ฃผ๋ฌธ ๊ธˆ์•ก์„ ์กฐํšŒํ•˜๊ธฐ ์ „์— ์‚ฌ์šฉ์ž B๊ฐ€ 20,000์›์˜ ์ฃผ๋ฌธ์„ ํ•ด ๋ฒ„๋ฆฌ๋ฉด ์‚ฌ์šฉ์ž A๊ฐ€ ์ฃผ๋ฌธํ•  ๋•Œ, 20,000์›์ด ์ถœ๋ ฅ๋˜๋Š” ์–ด๋งˆ๋ฌด์‹œํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

StatefulService์˜ price ํ•„๋“œ(๋ฉค๋ฒ„ ๋ณ€์ˆ˜)๋Š” ๊ณต์œ ๋˜๋Š” ๊ณณ์ธ๋ฐ, ํŠน์ • Client๊ฐ€ ๊ฐ’์„ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด์—์š”.

๊ณต์œ  ํ•„๋“œ๋Š” ์ •๋ง ์กฐ์‹ฌํ•ด์•ผ ํ•˜๊ณ , ์Šคํ”„๋ง ๋นˆ์€ ํ•ญ์ƒ ๋ฌด์ƒํƒœ(stateless)๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

๐Ÿ“Œ @Configuration๊ณผ ์‹ฑ๊ธ€ํ†ค


 

 

์ด์ƒํ•œ ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์œ„์˜ ์ฝ”๋“œ์—์„œ memberService Bean์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด memberRepository()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด๊ฒƒ์€ ๋‹ค์‹œ new MemoryMemberRepository()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋˜, orderService Bean์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ ์—ญ์‹œ memberRepository()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ด๊ฒƒ์€ ๋‹ค์‹œ new MemoryMemberRepository()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

๊ฐ๊ฐ ๋‹ค๋ฅธ 2๊ฐœ์˜ MemoryMemberRepository๊ฐ€ ์ƒ์„ฑ๋˜๋‹ˆ ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ ธ์•ผ ํ•˜๋Š”๋ฐ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ์š”?

 

MemberServiceImpl.java

 

OrderServiceImpl.java

 

์œ„์˜ ํด๋ž˜์Šค์— Test์šฉ Getter์— ์ฃผ๋ชฉํ•ด ์ฃผ์‹œ๊ธธ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ด์—์š”.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด MemberRepository๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด์—์š”. ๊ธฐ๋Šฅ ๊ฒ€์ฆ์„ ์œ„ํ•ด ์ž ๊น ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋ผ ์ธํ„ฐํŽ˜์ด์Šค๊นŒ์ง€ ๊ฑด๋“ค์ง„ ์•Š์„๊ฒƒ์ด์—์š”.

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

 

 

 

๐Ÿ“– Test ๊ฒฐ๊ณผ

 

memberRepository ์ธ์Šคํ„ด์Šค๋Š” ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ  ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

AppConfig์˜ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด ๋ถ„๋ช… ๊ฐ๊ฐ 2๋ฒˆ new MemoryRepository๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๊ฑด๋ฐ, ๋„˜๋‚˜ ์‹ ๊ธฐํ•œ ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ“@Configuration๊ณผ Bytecode ์กฐ์ž‘

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ, ์‹ฑ๊ธ€ํ†ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์ธ ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ๋นˆ์ด ์‹ฑ๊ธ€ํ†ค์ด ๋˜๋„๋ก ๋ณด์žฅํ•ด์ค˜์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋Ÿฐ๋ฐ, ์Šคํ”„๋ง์ด ์ž๋ฐ” ์ฝ”๋“œ๊นŒ์ง€ ์กฐ์ž‘ํ•˜๊ธด ์–ด๋ ค์šด ๊ฒƒ์ด์—์š”. ์œ„์— ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ถ„๋ช… 3๋ฒˆ์ด ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”๊ฒƒ์ธ๋ฐ ๋ง์ด์—์š”.

๊ทธ๋ž˜์„œ ์Šคํ”„๋ง์€ ํด๋ž˜์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” Library๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๋ชจ๋“  ๋น„๋ฐ€์€ @Configuration์„ ์ ์šฉํ•œ AppConfig๊ฐ€ ๋ฒ”์ธ์ธ ๊ฒƒ์ด์—์š”.

 

 

AnnotaionConfigApplicationContext์— ๋งค๊ฐœ ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ)๋กœ ๋„˜๊ธด ๊ฐ’์€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜์„œ AppConfig ์ž์ฒด๋„ ์Šคํ”„๋ง ๋นˆ์ด ๋œ๋‹ต๋‹ˆ๋‹ค!

AppConfig ์Šคํ”„๋ง ๋นˆ์„ ์กฐํšŒํ•ด์„œ ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ๊นŒ์š”?

 

 

bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$cae3c7e2

 

๋งŒ์•ฝ ์ˆœ์ˆ˜ ์ž๋ฐ” ํด๋ž˜์Šค ์˜€๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ์ด ๋˜์—ˆ์„ ๊ฒƒ์ด์—์š”.

 

class hello.core.AppConfig

 

ํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ~~~CGLIB๊ฐ€ ๋ถ™์œผ๋ฉด์„œ ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ฒŒ ์ถœ๋ ฅ์ด ๋œ ๊ฒƒ์ด์—์š”. 

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

 

 

๊ทธ ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ๋ฐ”๋กœ ์‹ฑ๊ธ€ํ†ค์ด ๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์€ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•ด์„œ ์ž‘์„ฑ ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์˜ˆ์ƒํ•˜์…จ์–ด์š”.

(์‹ค์ œ CGLIB์˜ ๋‚ด๋ถ€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋งค์šฐ ๋ณต์žก)

 

@Bean public MemberRepository memberRepository() {

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

 

@Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์ด๋ฏธ ์Šคํ”„๋ง ๋นˆ์ด ์กด์žฌํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ๋นˆ์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑํ•ด์„œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด์—์š”.

๊ทธ ๊ฒฐ๊ณผ ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋œ๋‹ต๋‹ˆ๋‹ค!

 

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

 

@Configuration์„ ์ ์šฉํ•˜์ง€ ์•Š๊ณ , @Bean๋งŒ ์ ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

@Configuration์„ ๋ถ™์ด๋ฉด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” CGLIB ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์„œ ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜์ง€๋งŒ, ๋ถ™์ด์ง€ ์•Š๊ณ , @Bean๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”.

 

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

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

memberRepository()์ฒ˜๋Ÿผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ํ•„์š”ํ•ด์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ ์‹ฑ๊ธ€ํ†ค์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ง€์š”.

๋”ฐ.๋ผ.์„œ ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด๊ฐ€ ๋‹ด๊ธด Class์—๋Š” ๋ฌด์กฐ๊ฑด @Configuration์„ ๋ถ™์ด๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด์—์š”!

 

 

 


 

 

๋ฐฑ๊ฒฌ๋ถˆ์—ฌ์ผํƒ€ ์Šคํ”„๋ง ๋ถ€ํŠธ ์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ with JPA:์ด์   ํ”„๋กœ์ ํŠธ๋‹ค!

COUPANG

www.coupang.com

"์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค."

 

 

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

728x90
๋ฐ˜์‘ํ˜•

'Back-End ์ž‘์—…์‹ค > Spring Framework' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JPQL] left ( outer ) join  (0) 2021.10.05
[JPA] @ManyToOne  (0) 2021.10.05
[Spring] ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ  (0) 2021.10.03
[Spring] Ioc, DI Container  (0) 2021.10.01
[Spring] AppConfig ๋ฆฌํŒฉํ„ฐ๋ง  (0) 2021.09.30