๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Java/CleanCode

[CleanCode] 13์žฅ ๋™์‹œ์„ฑ

728x90
๐Ÿ”น ์š”์•ฝ
 โ—ฝ ๋™์‹œ์„ฑ๊ณผ ๊น”๋”ํ•œ ์ฝ”๋“œ๋Š” ์–‘๋ฆฝํ•˜๊ฒŒ ์–ด๋ ต๋‹ค.
 โ—ฝ ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์งœ๊ธฐ๊ฐ€ ์‰ฝ๋‹ค. ๊ฒ‰์œผ๋กœ ๋ณด๊ธฐ์—๋Š” ๋ฉ€์ฉกํ•˜๋‚˜ ๊นŠ์ˆ™ํ•œ ๊ณณ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋„ ์งœ๊ธฐ ์‰ฝ๋‹ค. ์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ์‹œ์Šคํ…œ์ด ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ๋ฉ€์ฉกํ•˜๊ฒŒ ๋Œ์•„๊ฐ„๋‹ค. 

๐Ÿ”น์ด ์žฅ์—์„œ ๋‹ค๋ฃฐ ๋‚ด์šฉ
 โ—ฝ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ๋Œ๋ฆฌ๋Š” ์ด์œ 
 โ—ฝ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ๋Œ๋ฆฌ๋Š” ์–ด๋ ค์›€
โ—ฝ ๋™์‹œ์„ฑ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ฌธ์ œ์ 

๋™์‹œ์„ฑ์ด ํ•„์š”ํ•œ ์ด์œ ?

  • ๋™์‹œ์„ฑ์€ ๊ฒฐํ•ฉ(coupling)์„ ์—†์• ๋Š” ์ „๋žต์ด๋‹ค.
    • ์ฆ‰, ๋ฌด์—‡(what)๊ณผ ์–ธ์ œ(when)์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ „๋žต์ด๋‹ค.
  • ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ํ”„๋กœ๊ทธ๋žจ์€ ๋ฌด์—‡๊ณผ ์–ธ์ œ๊ฐ€ ์„œ๋กœ ๋ฐ€์ ‘ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ํ˜ธ์ถœ ์Šคํƒ์„ ์‚ดํŽด๋ณด๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ๊ฐ€ ๊ณง๋ฐ”๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค.
    • ํ”ํžˆ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ •์ง€์ (breakpoint)์„ ์ •ํ•œ ํ›„ ์–ด๋А ์ •์ง€์ ์— ๊ฑธ๋ ธ๋Š”์ง€ ๋ณด๋ฉฐ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.
  • ๋ฌด์—‡๊ณผ ์–ธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ์™€ ํšจ์œจ์ด ๊ทน์ ์œผ๋กœ ๋‚˜์•„์ง„๋‹ค.
    • ๊ตฌ์กฐ์ ์ธ ๊ด€์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฑฐ๋Œ€ํ•œ ๋ฃจํ”„ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์ž‘์€ ํ˜‘๋ ฅ ํ”„๋กœ๊ทธ๋žจ ์—ฌ๋Ÿฟ์œผ๋กœ ๋ณด์ธ๋‹ค.
    • ๋”ฐ๋ผ์„œ ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๊ณ  ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ๋„ ์‰ฝ๋‹ค.
  • ๐Ÿ’ก ์˜ˆ์‹œ) ์„œ๋ธ”๋ฆฟ(Servlet) ๋ชจ๋ธ

     โ—ฝ ์„œ๋ธ”๋ฆฟ์€ ์›น ํ˜น์€ EJB ์ปจํ…Œ์ด๋„ˆ(Enterprise JavaBeans)๋ผ๋Š” ์šฐ์‚ฐ ์•„๋ž˜์„œ ๋Œ์•„๊ฐ€๋Š”๋ฐ ์ด๋“ค ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์‹œ์„ฑ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
     โ—ฝ ์›น ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์›น ์„œ๋ฒ„๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰ํ•œ๋‹ค.
     โ—ฝ ์„œ๋ธ”๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋“ค์–ด์˜ค๋Š” ๋ชจ๋“  ์›น ์š”์ฒญ์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
     โ—ฝ ์›์น™์ ์œผ๋กœ ๊ฐ ์„œ๋ธ”๋ฆฟ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์„œ๋ธ”๋ฆฟ ์Šค๋ ˆ๋“œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ž์‹ ๋งŒ์˜ ์„ธ์ƒ์—์„œ ๋Œ์•„๊ฐ„๋‹ค.
     โ—ฝ ๊ทธ๋Ÿฌ๋ฉด ๋™์‹œ์„ฑ์ด ํ•„์š” ์—†์„๊นŒ? ์•„๋‹ˆ๋‹ค!
        โ–ช ์‹ค์ œ๋กœ ์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒฐํ•ฉ ๋ถ„๋ฆฌ(decoupling) ์ „๋žต์€ ์™„๋ฒฝ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„์ฃผ ๋ฉ€๋‹ค.
        โ–ช ์„œ๋ธ”๋ฆฟ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋™์‹œ์„ฑ์„ ์ •ํ™•ํžˆ ๊ตฌํ˜„ํ•˜๋„๋ก ๊ฐ๋ณ„ํ•œ ์ฃผ์˜์™€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค.
        โ–ช ๊ทธ๋Ÿผ์—๋„ ์„œ๋ธ”๋ฆฟ ๋ชจ๋ธ์ด ์ œ๊ณตํ•˜๋Š” ๊ตฌ์กฐ์  ์ด์ ์€ ์•„์ฃผ ํฌ๋‹ค.

๊ตฌ์กฐ์  ๊ฐœ์„ ๋งŒ์„ ์œ„ํ•ด ๋™์‹œ์„ฑ์„ ์ฑ„ํƒํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค.

  • ์–ด๋–ค ์‹œ์Šคํ…œ์€ ์‘๋‹ต ์‹œ๊ฐ„๊ณผ ์ž‘์—… ์ฒ˜๋ฆฌ๋Ÿ‰ (throughput) ๊ฐœ์„ ์ด๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์ง์ ‘์ ์ธ ๋™์‹œ์„ฑ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ1) ๋งค์ผ ์ˆ˜๋งŽ์€ ์›น ์‚ฌ์ดํŠธ์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์š”์•ฝํ•˜๋Š” ์ •๋ณด ์ˆ˜์ง‘๊ธฐ

  • ์ˆ˜์ง‘๊ธฐ๊ฐ€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด?
    • ํ•œ ๋ฒˆ์— ํ•œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•ด ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ด ๊ณผ์ •์—์„œ ํ•œ ์‚ฌ์ดํŠธ๋ฅผ ๋๋‚ด์•ผ ๋‹ค์Œ ์‚ฌ์ดํŠธ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    • ์›น ์‚ฌ์ดํŠธ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋ฉด ์ •๋ณด ์ˆ˜์ง‘ํ•˜๋Š” ์‹œ๊ฐ„๋„ ๋Š˜์–ด๋‚˜๊ณ , ๋งค์ผ ์‹คํ–‰ํ•˜๋ฏ€๋กœ 24์‹œ๊ฐ„ ์•ˆ์— ๋๋‚˜์•ผ ํ•˜์ง€๋งŒ 24์‹œ๊ฐ„์„ ๋„˜๊ธฐ๊ฒŒ ๋œ๋‹ค.
    • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์ˆ˜์ง‘๊ธฐ๋Š” ์›น ์†Œ์ผ“์—์„œ ์ž…์ถœ๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์•„์ฃผ ๋งŽ๋‹ค. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆ˜์ง‘๊ธฐ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 
    •  

 ๐Ÿ’ก ์˜ˆ์‹œ 2) ํ•œ ๋ฒˆ์— ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ: ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์€ 1์ดˆ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์ˆ˜๋ผ๋ฉด ์‹œ์Šคํ…œ์ด ์•„์ฃผ ๋นจ๋ฆฌ ๋ฐ˜์‘ํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์‹œ์Šคํ…œ์ด ์‘๋‹ตํ•˜๋Š” ์†๋„๋„ ๋Šฆ์–ด์ง„๋‹ค.
  • 150๋ช… ๋’ค์— ์ค„ ์„œ๋ ค๋Š” ์‚ฌ์šฉ์ž๋Š” ์—†๋‹ค. ๋Œ€์‹  ๋งŽ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋ฉด ์‹œ์Šคํ…œ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค. 

๐Ÿ’ก ์˜ˆ์‹œ 3) ์ •๋ณด๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ๋ถ„์„ํ•˜๋Š” ์‹œ์Šคํ…œ

  • ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„์—์•ผ ์ตœ์ข…์ ์ธ ๋‹ต์„ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ •๋ณด๋ฅผ ๋‚˜๋ˆ  ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ์—์„œ ๋Œ๋ฆฌ๋ฉด ์–ด๋–จ๊นŒ? ๋Œ€๋Ÿ‰์˜ ์ •๋ณด๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด? 

๋ฏธ์‹ ๊ณผ ์˜คํ•ด

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

๋‚œ๊ด€

๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ 

public class X {
    private int lastIdUsed;

    public int getNextId() {
        return ++lastIdUsed;
    }
}
  • ์ธ์Šคํ„ด์Šค X๋ฅผ ์ƒ์„ฑํ•˜๊ณ , lastIdUsed ํ•„๋“œ๋ฅผ 42๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ, ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์ด์ œ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ getNextId();๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ฒฐ๊ณผ๋Š” ์…‹ ์ค‘ ํ•˜๋‚˜๋‹ค.
    • ํ•œ ์Šค๋ ˆ๋“œ๋Š” 43์„ ๋ฐ›๋Š”๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” 44๋ฅผ ๋ฐ›๋Š”๋‹ค. lastIdUsed๋Š” 44๊ฐ€ ๋œ๋‹ค.
    • ํ•œ ์Šค๋ ˆ๋“œ๋Š” 44๋ฅผ ๋ฐ›๋Š”๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” 43์„ ๋ฐ›๋Š”๋‹ค. lastIdUsed๋Š” 44๊ฐ€ ๋œ๋‹ค.
    • ํ•œ ์Šค๋ ˆ๋“œ๋Š” 43์„ ๋ฐ›๋Š”๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” 43์„ ๋ฐ›๋Š”๋‹ค. lastIdUsed๋Š” 43์ด ๋œ๋‹ค. ๐Ÿค”

๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ์ฐธ์กฐํ•˜๋ฉด ์„ธ ๋ฒˆ์งธ์™€ ๊ฐ™์€ ๋†€๋ผ์šด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค! ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋ฐ” ์ฝ”๋“œ ํ•œ ์ค„์„ ๊ฑฐ์ณ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์ˆ˜์—†์ด ๋งŽ์€๋ฐ, ๊ทธ์ค‘์—์„œ ์ผ๋ถ€ ๊ฒฝ๋กœ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋†“๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋งŒ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ getNextId ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ž ์žฌ์ ์ธ ๊ฒฝ๋กœ๋Š” int์ผ ๊ฒฝ์šฐ ์ตœ๋Œ€ 12870๊ฐœ์— ๋‹ฌํ•œ๋‹ค. long์ผ ๊ฒฝ์šฐ๋Š” ์กฐํ•ฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ ์ˆ˜๊ฐ€ 2,704,156๊ฐœ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค! ๋ฌผ๋ก  ๋Œ€๋‹ค์ˆ˜ ๊ฒฝ๋กœ๋Š” ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋†“์ง€๋งŒ, ๋ฌธ์ œ๋Š” ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋†“๋Š” ์ผ๋ถ€ ๊ฒฝ๋กœ๋‹ค.

๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ด์œ 

๐Ÿ”น ๊ทธ๋ ‡๋‹ค๋ฉด ๋™์‹œ์„ฑ ์ฝ”๋“œ๊ฐ€ ์ผ์œผํ‚ค๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ์‹œ์Šคํ…œ์„ ๋ฐฉ์–ดํ•  ์ˆ˜ ์žˆ์„๊นŒ?

  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™Single Responsibility Principle, SRP
    • SRP: ์ฃผ์–ด์ง„ ๋ฉ”์„œ๋“œ/ํด๋ž˜์Šค/์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ด์œ ๋Š” ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์›์น™
    • ๋™์‹œ์„ฑ์€ ๋ณต์žก์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    • ๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผํ•  ์‚ฌํ•ญ
      1. ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋…์ž์ ์ธ ๊ฐœ๋ฐœ, ๋ณ€๊ฒฝ, ์กฐ์œจ ์ฃผ๊ธฐ๊ฐ€ ์žˆ๋‹ค.
      2. ๋™์‹œ์„ฑ ์ฝ”๋“œ์—๋Š” ๋…์ž์ ์ธ ๋‚œ๊ด€์ด ์žˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ ๊ฒช๋Š” ๋‚œ๊ด€๊ณผ ๋‹ค๋ฅด๋ฉฐ ํ›จ์”ฌ ์–ด๋ ต๋‹ค.
      3. ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋ณ„์˜๋ณ„ ๋ฐฉ์‹์œผ๋กœ ์‹คํŒจํ•œ๋‹ค. ์ฃผ๋ณ€์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ๋ฐœ๋ชฉ์„ ์žก์ง€ ์•Š๋”๋ผ๋„ ๋™์‹œ์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์–ด๋ ต๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•˜๋ผ.
  • ๋”ฐ๋ฆ„ ์ •๋ฆฌcorollary: ์ž๋ฃŒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ผ
    • ๊ฐ์ฒด ํ•˜๋‚˜๋ฅผ ๊ณต์œ ํ•œ ํ›„ ๋™์ผ ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋˜ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ„์„ญํ•˜๋ฏ€๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋†“๋Š”๋‹ค.
    • ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์•ˆ์œผ๋กœ ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋‚ด ์ž„๊ณ„ ์˜์—ญ(critical section)์„ synchronized ํ‚ค์›Œ๋“œ๋กœ ๋ณดํ˜ธํ•˜๋ผ๊ณ  ๊ถŒ์žฅํ•œ๋‹ค.
    • ์ด๋Ÿฐ ์ž„๊ณ„์˜์—ญ์˜ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ธฐ์ˆ ์ด ์ค‘์š”ํ•˜๋‹ค.
    • ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ปค์ง€๋Š” ๋ฌธ์ œ์ 
        1. ๋ณดํ˜ธํ•  ์ž„๊ณ„์˜์—ญ์„ ๋นผ๋จน๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค.
        1. ๋ชจ๋“  ์ž„๊ณ„์˜์—ญ์„ ์˜ฌ๋ฐ”๋กœ ๋ณดํ˜ธํ–ˆ๋Š”์ง€(DRY ์œ„๋ฐ˜) ํ™•์ธํ•˜๋А๋ผ ๋˜‘๊ฐ™์€ ๋…ธ๋ ฅ๊ณผ ์ˆ˜๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.
      • ๊ทธ๋ ‡์ง€ ์•Š์•„๋„ ์ฐพ์•„๋‚ด๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๊ฐ€ ๋”์šฑ ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ์ž๋ฃŒ๋ฅผ ์บก์Аํ™”ํ•˜๋ผ. ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ๋ผ.
  • ๋”ฐ๋ฆ„ ์ •๋ฆฌ: ์ž๋ฃŒ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ผ
    • ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ค„์ด๋ ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์ œ์ผ ์ข‹๋‹ค.
      • ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
      • ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด ์‚ฌ์šฉํ•œ ํ›„ ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•ด๋‹น ์‚ฌ๋ณธ์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
    ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ๋„ ์•„์ฃผ ๋‚ฎ์•„์ง„๋‹ค. ๊ฐ์ฒด์˜ ์‚ฌ๋ณธ์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‚ด๋ถ€ ์ž ๊ธˆ์„ ์—†์•  ์ ˆ์•ฝํ•œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์‚ฌ๋ณธ ์ƒ์„ฑ๊ณผ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋“œ๋Š” ๋ถ€ํ•˜๋ฅผ ์ƒ์‡„ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.
  • ๋”ฐ๋ฆ„ ์ •๋ฆฌ: ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ผ
    • ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ์ž๋ฃŒ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ํ•˜๋‚˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • ๋ชจ๋“  ์ •๋ณด๋Š” ๋น„๊ณต์œ  ์ถœ์ฒ˜์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ ๋กœ์ปฌ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ๋™๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์„ธ์ƒ์— ์ž์‹ ๋งŒ ์žˆ๋Š” ๋“ฏ์ด ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
      • ์˜ˆ) HttpServlet ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒํ•œ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ doGet๊ณผ doPost ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ์„œ๋ธ”๋ฆฟ์€ ๋งˆ์น˜ ์ž์‹ ์ด ๋…์ž์ ์ธ ์‹œ์Šคํ…œ์—์„œ ๋™์ž‘ํ•˜๋Š” ์–‘ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์„œ๋ธ”๋ฆฟ ์ฝ”๋“œ๊ฐ€ ๋กœ์ปฌ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์„œ๋ธ”๋ฆฟ์ด ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์€ ์ „๋ฌดํ•˜๋‹ค.
      • ๋ฌผ๋ก  ์„œ๋ธ”๋ฆฟ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋‹ค์ˆ˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ์ƒํ™ฉ์— ์ฒ˜ํ•œ๋‹ค.
    ๊ถŒ์žฅ์‚ฌํ•ญ: ๋…์ž์ ์ธ ์Šค๋ ˆ๋“œ๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ ๋Œ๋ ค๋„ ๊ดœ์ฐฎ๋„๋ก ์ž๋ฃŒ๋ฅผ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„ํ• ํ•˜๋ผ.
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ผ
    ์ž๋ฐ” 5๋กœ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์ž.
  1. ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค. (์ž๋ฐ” 5๋ถ€ํ„ฐ ์ œ๊ณตํ•œ๋‹ค.)
  2. ์„œ๋กœ ๋ฌด๊ด€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” executor ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  3. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ(blocking)๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
  4. ์ผ๋ถ€ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•˜๋‹ค.
  • ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜
    • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•ด๋„ ์•ˆ์ „ํ•˜๋ฉฐ, ์„ฑ๋Šฅ๋„ ์ข‹๋‹ค.
    • ConcurrentHashMap
      • ConcurrentHashMap์€ ๊ฑฐ์˜ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ HashMap๋ณด๋‹ค ๋น ๋ฅด๋‹ค. ๋™์‹œ ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, (๋ณดํ†ต ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”) ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ณตํ•ฉ ์—ฐ์‚ฐ์„ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ƒ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“  ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•œ๋‹ค.

    ํด๋ž˜์Šค ์„ค๋ช…
    ReentrantLock ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์ž ๊ทธ๊ณ  ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ์—์„œ ํ‘ธ๋Š” ๋ฝ(lock)์ด๋‹ค.
    Semaphore ์ „ํ˜•์ ์ธ ์„ธ๋งˆํฌ์–ด๋‹ค. ๊ฐœ์ˆ˜(count)๊ฐ€ ์žˆ๋Š” ๋ฝ์ด๋‹ค.
    CountDownLatch ์ง€์ •ํ•œ ์ˆ˜๋งŒํผ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋‚˜์„œ์•ผ ๋Œ€๊ธฐ ์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ชจ๋‘ ํ•ด์ œํ•˜๋Š” ๋ฝ์ด๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ์—๊ฒŒ ๋™์‹œ์— ๊ณตํ‰ํ•˜๊ฒŒ ์‹œ์ž‘ํ•  ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค.
    ๊ถŒ์žฅ์‚ฌํ•ญ: ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฒ€ํ† ํ•˜๋ผ. ์ž๋ฐ”์—์„œ๋Š” java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks๋ฅผ ์ตํ˜€๋ผ.
  • ์‹คํ–‰ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๋ผ
    ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋…ผํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ณธ ์šฉ์–ด๋ถ€ํ„ฐ ์ดํ•ดํ•˜์ž.
  • ์šฉ์–ด ์„ค๋ช…
    ํ•œ์ •๋œ ์ž์›(Bound Resource) ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž์›์œผ๋กœ, ํฌ๊ธฐ๋‚˜ ์ˆซ์ž๊ฐ€ ์ œํ•œ์ ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๊ธธ์ด๊ฐ€ ์ผ์ •ํ•œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฒ„ํผ ๋“ฑ์ด ์˜ˆ๋‹ค.
    ์ƒํ˜ธ ๋ฐฐ์ œ (Mutual Exclusion) ํ•œ ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๊ณต์œ  ์ž๋ฃŒ๋‚˜ ๊ณต์œ  ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
    ๊ธฐ์•„(Starvation) ํ•œ ์Šค๋ ˆ๋“œ๋‚˜ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ์˜ค๋žซ๋™์•ˆ ํ˜น์€ ์˜์›ํžˆ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ญ์ƒ ์งง์€ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ค€๋‹ค๋ฉด, ์งง์€ ์Šค๋ ˆ๋“œ๊ฐ€ ์ง€์†์ ์œผ๋กœ ์ด์–ด์งˆ ๊ฒฝ์šฐ, ๊ธด ์Šค๋ ˆ๋“œ๊ฐ€ ๊ธฐ์•„ ์ƒํƒœ์— ๋น ์ง„๋‹ค.
    ๋ฐ๋“œ๋ฝ(Deadlock) ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ๊ธฐ ํ•„์š”ํ•œ ์ž์›์„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ์œ ํ•˜๋Š” ๋ฐ”๋žŒ์— ์–ด๋А ์ชฝ๋„ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
    • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์‹คํ–‰ ๋ชจ๋ธ
  • ์ƒ์‚ฐ์ž-์†Œ๋น„์žProducer-Consumer
    • ํ•˜๋‚˜ ์ด์ƒ ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ๊ฐ€ ์ •๋ณด๋ฅผ ์ƒ์‚ฐํ•ด ๋ฒ„ํผ(buffer)๋‚˜ ๋Œ€๊ธฐ์—ด(queue)์— ๋„ฃ๋Š”๋‹ค.
      • ํ•˜๋‚˜ ์ด์ƒ ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ์™€ ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๊ธฐ์—ด์€ ํ•œ์ •๋œ ์ž์›์ด๋‹ค.
      • ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ์–ด์•ผ ์ •๋ณด๋ฅผ ์ฑ„์šด๋‹ค. ์ฆ‰, ๋นˆ ๊ณต๊ฐ„์ด ์ƒ๊ธธ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
      • ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์— ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ฆ‰, ์ •๋ณด๊ฐ€ ์ฑ„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
      • ๋Œ€๊ธฐ์—ด์„ ์˜ฌ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ์™€ ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๋Š” ์„œ๋กœ์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๋ณด๋‚ธ๋‹ค.
        • ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์— ์ •๋ณด๋ฅผ ์ฑ„์šด ๋‹ค์Œ ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ์—๊ฒŒ "๋Œ€๊ธฐ์—ด์— ์ •๋ณด๊ฐ€ ์žˆ๋‹ค"๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋‚ธ๋‹ค.
        • ์†Œ๋น„์ž ์‹œ๊ทธ๋„์€ ๋Œ€๊ธฐ์—ด์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด ๋“ค์ธ ํ›„ "๋Œ€๊ธฐ์—ด์— ๋นˆ ๊ณต๊ฐ„์ด ์žˆ๋‹ค"๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋‚ธ๋‹ค.
      • ๋”ฐ๋ผ์„œ ์ž˜๋ชปํ•˜๋ฉด ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ์™€ ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๊ฐ€ ๋‘˜ ๋‹ค ์ง„ํ–‰ ๊ฐ€๋Šฅํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋™์‹œ์— ์„œ๋กœ์—๊ฒŒ ์‹œ๊ทธ๋„์„ ๊ธฐ๋‹ค๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค.
  • ์ฝ๊ธฐ-์“ฐ๊ธฐReaders-Writers
    • ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ ์ฃผ๋œ ์ •๋ณด์›์œผ๋กœ ๊ณต์œ  ์ž์›์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์ด ๊ณต์œ  ์ž์›์„ ์ด๋”ฐ๊ธˆ ๊ฐฑ์‹ ํ•œ๋‹ค๊ณ  ํ•˜์ž. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ์œจ(throughput)์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ด๋‹ค.
    • ์ฒ˜๋ฆฌ์œจ(throughput)
      • ์ฒ˜๋ฆฌ์œจ์„ ๊ฐ•์กฐํ•˜๋ฉด ๊ธฐ์•„(starvation) ํ˜„์ƒ์ด ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์˜ค๋ž˜๋œ ์ •๋ณด๊ฐ€ ์Œ“์ธ๋‹ค. ๊ฐฑ์‹ ์„ ํ—ˆ์šฉํ•˜๋ฉด ์ฒ˜๋ฆฌ์œจ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.
      • ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๋™์•ˆ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ์ฝ์ง€ ์•Š์œผ๋ ค๋ฉด, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ์ฝ๋Š” ๋™์•ˆ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ณต์žกํ•œ ๊ท ํ˜• ์žก๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
      • ๋Œ€๊ฐœ๋Š” ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ์˜ค๋žซ๋™์•ˆ ์ ์œ ํ•˜๋Š” ๋ฐ”๋žŒ์— ์—ฌ๋Ÿฌ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ ์ฒ˜๋ฆฌ์œจ์ด ๋–จ์–ด์ง„๋‹ค.
      • ๋”ฐ๋ผ์„œ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์š”๊ตฌ์™€ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์š”๊ตฌ๋ฅผ ์ ์ ˆํžˆ ๋งŒ์กฑ์‹œ์ผœ ์ฒ˜๋ฆฌ์œจ๋„ ์ ๋‹นํžˆ ๋†’์ด๊ณ  ๊ธฐ์•„๋„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ด๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.
      • ๊ฐ„๋‹จํ•œ ์ „๋žต์€ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ๊ฐฑ์‹ ์„ ์›ํ•˜๋Š” ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
      • ํ•˜์ง€๋งŒ ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ„์† ์ด์–ด์ง„๋‹ค๋ฉด ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๋Š” ๊ธฐ์•„ ์ƒํƒœ์— ๋น ์ง„๋‹ค.
      • ๋ฐ˜๋ฉด, ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์šฐ์„ ๊ถŒ์„ ์ค€ ์ƒํƒœ์—์„œ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณ„์† ์ด์–ด์ง„๋‹ค๋ฉด ์ฒ˜๋ฆฌ์œจ์ด ๋–จ์–ด์ง„๋‹ค.
      • ์–‘์ชฝ ๊ท ํ˜•์„ ์žก์œผ๋ฉด์„œ ๋™์‹œ์— ๊ฐฑ์‹  ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.
  • ์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž๋“คDining Philosophers
    • ๋‘ฅ๊ทผ ์‹ํƒ์— ์ฒ ํ•™์ž๋“ค์ด ๋‘˜๋Ÿฌ ์•‰๊ณ , ๋ฐฐ๊ฐ€ ๊ณ ํ”„๋ฉด ์–‘์†์— ํฌํฌ๋ฅผ ์ง‘์–ด ๋“ค๊ณ  ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋จน์–ด์•ผ ํ•œ๋‹ค๋ฉด? ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ ์ฒ ํ•™์ž๊ฐ€ ํฌํฌ๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋จน์ง€ ๋ชปํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ์ฒ ํ•™์ž๋ฅผ ์Šค๋ ˆ๋“œ๋กœ, ํฌํฌ๋ฅผ ์ž์›์œผ๋กœ ๋ฐ”๊พธ์–ด ์ƒ๊ฐํ•ด๋ณด๋ฉด?
      • ๋งŽ์€ ๊ธฐ์—… ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ฒช๋Š” ๋ฌธ์ œ๋‹ค.
      • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์„ ์–ป์œผ๋ ค ๊ฒฝ์Ÿํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์„œ ์„ค๊ณ„ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ๋“œ๋ฝ, ๋ผ์ด๋ธŒ๋ฝ, ์ฒ˜๋ฆฌ์œจ ์ €ํ•˜, ํ˜ธ์œจ์„ฑ ์ €ํ•˜ ๋“ฑ์„ ๊ฒช๋Š”๋‹ค.
      • ์ผ์ƒ์—์„œ ์ ‘ํ•˜๋Š” ๋Œ€๋‹ค์ˆ˜ ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ๋ฌธ์ œ๋Š” (ํ˜•ํƒœ๊ฐ€ ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅผ์ง€๋ผ๋„) ์œ„ ์„ธ ๋ฒ”์ฃผ ์ค‘ ํ•˜๋‚˜์— ์†ํ•œ๋‹ค.
    • ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณต๋ถ€ํ•˜๊ณ  ํ•ด๋ฒ•์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‚˜์ค‘์— ์‹ค์ „ ๋ฌธ์ œ์— ๋ถ€๋‹ฅ์ณค์„ ๋•Œ ํ•ด๊ฒฐ์ด ์‰ฌ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค!
    ๊ถŒ์žฅ์‚ฌํ•ญ: ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ ํ•ด๋ฒ•์„ ์ดํ•ดํ•˜๋ผ
  • ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ฌ์ด์— ์กด์žฌํ•˜๋Š” ์˜์กด์„ฑ์„ ์ดํ•ดํ•˜๋ผ
    • ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฉ”์„œ๋“œ ์‚ฌ์ด์— ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋ฉด ๋™์‹œ์„ฑ ์ฝ”๋“œ์— ์ฐพ์•„๋‚ด๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธด๋‹ค.
    • ์ž๋ฐ” ์–ธ์–ด๋Š” ๊ฐœ๋ณ„ ๋ฉ”์„œ๋“œ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” synchronized๋ผ๋Š” ๊ฐœ๋…์„ ์ง€์›ํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ ๊ณต์œ  ํด๋ž˜์Šค ํ•˜๋‚˜์— ๋™๊ธฐํ™”๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์—ฌ๋Ÿฟ์ด๋ผ๋ฉด ๊ตฌํ˜„์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด๋ผ
    ๊ถŒ์žฅ์‚ฌํ•ญ: ๊ณต์œ  ๊ฐ์ฒด ํ•˜๋‚˜์—๋Š” ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๋ผ.
  • ๊ณต์œ  ๊ฐ์ฒด ํ•˜๋‚˜์— ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด ์˜ค๋ฉด?
    1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž ๊ธˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„๋ฅผ ์ž ๊ทผ๋‹ค. ๋งˆ์ง€๋ง‰ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๊นŒ์ง€ ์ž ๊ธˆ์„ ์œ ์ง€ํ•œ๋‹ค.
    2. ์„œ๋ฒ„์—์„œ ์ž ๊ธˆ ์„œ๋ฒ„์—๋‹ค "์„œ๋ฒ„๋ฅผ ์ž ๊ทธ๊ณ  ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    3. ์—ฐ๊ฒฐ(Adapter) ์„œ๋ฒ„ ์ž ๊ธˆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. '์„œ๋ฒ„์—์„œ ์ž ๊ธˆ' ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์›๋ž˜ ์„œ๋ฒ„๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ

  • ์ž๋ฐ”์—์„œ synchronized ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฝ์„ ์„ค์ •ํ•œ๋‹ค. ๊ฐ™์€ ๋ฝ์œผ๋กœ ๊ฐ์‹ผ ๋ชจ๋“  ์ฝ”๋“œ ์˜์—ญ์€ ํ•œ ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฝ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋ถ€ํ•˜๋ฅผ ๊ฐ€์ค‘์‹œํ‚จ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์—ฌ๊ธฐ์ €๊ธฐ์„œ synchronized ๋ฌธ์„ ๋‚จ๋ฐœํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.
  • ๋ฐ˜๋ฉด ์ž„๊ณ„์˜์—ญ(critical section)์€ ๋ฐ˜๋“œ์‹œ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” ์ž„๊ณ„ ์˜์—ญ ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.
  • ์ž„๊ณ„์˜์—ญ์ž„๊ณ„ ์˜์—ญ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ธ๋‹ต์‹œ๊ณ  ๊ฑฐ๋Œ€ํ•œ ์ž„๊ณ„ ์˜์—ญ ํ•˜๋‚˜๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ˆœ์ง„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋„ ์žˆ๋‹ค.
  • ํ•„์š” ์ด์ƒ์œผ๋กœ ์ž„๊ณ„์˜์—ญ ํฌ๊ธฐ๋ฅผ ํ‚ค์šฐ๋ฉด ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ฒฝ์Ÿ์ด ๋Š˜์–ด๋‚˜๊ณ  ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.

๊ถŒ์žฅ์‚ฌํ•ญ: ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„์€ ์ตœ๋Œ€ํ•œ ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.

์˜ฌ๋ฐ”๋ฅธ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค

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

๊ถŒ์žฅ์‚ฌํ•ญ: ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๊ณ ๋ฏผํ•˜๊ณ  ๋™์ž‘ํ•˜๊ฒŒ ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•˜๋ผ. ์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์šฐ๋ฏ€๋กœ ์ด๋ฏธ ๋‚˜์˜จ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฒ€ํ† ํ•˜๋ผ.

์Šค๋ ˆ๋“œ ์ฝ”๋“œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

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

๊ถŒ์žฅ์‚ฌํ•ญ: ๋ฌธ์ œ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ผ. ํ”„๋กœ๊ทธ๋žจ ์„ค์ •๊ณผ ์‹œ์Šคํ…œ ์„ค์ •๊ณผ ๋ถ€ํ•˜๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์ž์ฃผ ๋Œ๋ ค๋ผ. ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์›์ธ์„ ์ถ”์ ํ•˜๋ผ. ๋‹ค์‹œ ๋Œ๋ ธ๋”๋‹ˆ ํ†ต๊ณผํ•˜๋”๋ผ๋Š” ์ด์œ ๋กœ ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋ฉด ์ ˆ๋Œ€๋กœ ์•ˆ ๋œ๋‹ค.
  • ์Šค๋ ˆ๋“œ ํ…Œ์ŠคํŠธ ์‹œ ๊ณ ๋ คํ•  ์‚ฌํ•ญ
    1. ๋ง์ด ์•ˆ ๋˜๋Š” ์‹คํŒจ๋Š” ์ž ์ •์ ์ธ ์Šค๋ ˆ๋“œ ๋ฌธ์ œ๋กœ ์ทจ๊ธ‰ํ•˜๋ผ
      • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ๋•Œ๋•Œ๋กœ '๋ง์ด ์•ˆ ๋˜๋Š”' ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.
      • ๋Œ€๋‹ค์ˆ˜ ๊ฐœ๋ฐœ์ž๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๊ต๋ฅ˜ํ•˜๋Š” ๋ฐฉ์‹์„ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.
      • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ์— ์ž ์ž…ํ•œ ๋ฒ„๊ทธ๋Š” ์ˆ˜์ฒœ, ์ˆ˜๋ฐฑ๋งŒ ๋ฒˆ์— ํ•œ ๋ฒˆ์”ฉ ๋“œ๋Ÿฌ๋‚˜๊ธฐ๋„ ํ•œ๋‹ค. (์‹คํŒจ๋ฅผ ์žฌํ˜„ํ•˜๊ธฐ ์•„์ฃผ ์–ด๋ ต๋‹ค)
      • ๊ทธ๋ž˜์„œ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์šฐ์ฃผ์„ (cosmic-ray), ํ•˜๋“œ์›จ์–ด ๋ฌธ์ œ, ๋‹จ์ˆœํ•œ '์ผํšŒ์„ฑ' ๋ฌธ์ œ๋กœ ์น˜๋ถ€ํ•˜๊ณ  ๋ฌด์‹œํ•œ๋‹ค. ์ผํšŒ์„ฑ ๋ฌธ์ œ๋ž€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•˜๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ์‹œ์Šคํ…œ ์‹คํŒจ๋ฅผ '์ผํšŒ์„ฑ'์ด๋ผ ์น˜๋ถ€ํ•˜์ง€ ๋งˆ๋ผ.
    2. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ˆœ์ฐจ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ๋Œ๊ฒŒ ๋งŒ๋“ค์ž
      • ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋„๋Š”์ง€ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•œ๋‹ค.
        • ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ, ์Šค๋ ˆ๋“œ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” POJO๋ฅผ ๋งŒ๋“ ๋‹ค. POJO๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ์ƒ๊ธฐ๋Š” ๋ฒ„๊ทธ์™€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์ƒ๊ธฐ๋Š” ๋ฒ„๊ทธ๋ฅผ ๋™์‹œ์— ๋””๋ฒ„๊น…ํ•˜์ง€ ๋งˆ๋ผ. ๋จผ์ € ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ ๋ฐ–์—์„œ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋กœ ๋Œ๋ ค๋ผ.
    3. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ
      • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์„ค์ •์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๋ผ.
        • ํ•œ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, ์‹คํ–‰ ์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐ”๊ฟ”๋ณธ๋‹ค.
        • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ํ™˜๊ฒฝ์ด๋‚˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋Œ๋ ค๋ณธ๋‹ค
        • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋นจ๋ฆฌ, ์ฒœ์ฒœํžˆ, ๋‹ค์–‘ํ•œ ์†๋„๋กœ ๋Œ๋ ค๋ณธ๋‹ค
        • ๋ฐ˜๋ณต ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ๋‹ค์–‘ํ•œ ์„ค์ •์—์„œ ์‹คํ–‰ํ•  ๋ชฉ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ์‰ฝ๊ฒŒ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ.
    4. ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์กฐ์œจํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜๋ผ
      • ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์‹œํ–‰์ฐฉ์˜ค๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
      • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ์„ค์ •์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ ์ธก์ • ๋ฐฉ๋ฒ•์„ ๊ฐ•๊ตฌํ•œ๋‹ค.
      • ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์œจํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
      • ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ์•„๊ฐ€๋Š” ๋„์ค‘์— ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ•œ๋‹ค.
      • ํ”„๋กœ๊ทธ๋žจ ์ฒ˜๋ฆฌ์œจ๊ณผ ํšจ์œจ์— ๋”ฐ๋ผ ์Šค์Šค๋กœ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์กฐ์œจํ•˜๋Š” ์ฝ”๋“œ๋„ ๊ณ ๋ฏผํ•œ๋‹ค.
    5. ํ”„๋กœ์„ธ์„œ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ๋ ค๋ณด๋ผ
      • ์‹œ์Šคํ…œ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์Šค์™€ํ•‘(swapping)ํ•  ๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      • ์Šค์™€ํ•‘์„ ์ผ์œผํ‚ค๋ ค๋ฉด ํ”„๋กœ์„ธ์„œ ์ˆ˜๋ณด๋‹ค ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ๋ฆฐ๋‹ค.
      • ์Šค์™€ํ•‘์ด ์žฆ์„์ˆ˜๋ก ์ž„๊ณ„ ์˜์—ญ์„ ๋นผ๋จน์€ ์ฝ”๋“œ๋‚˜ ๋ฐ๋“œ๋ฝ์„ ์ผ์œผํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.
    6. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์—์„œ ๋Œ๋ ค๋ณด๋ผ
      • ์šด์˜์ฒด์ œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ •์ฑ…์ด ๋‹ฌ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.
      • ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋Œ์•„๊ฐ„๋‹ค.
      • ๋”ฐ๋ผ์„œ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ํ”Œ๋žซํผ ์ „๋ถ€์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ๋งˆ๋•…ํ•˜๋‹ค.
      ๊ถŒ์žฅ์‚ฌํ•ญ: ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ทธ๋ฆฌ๊ณ  ์ž์ฃผ ๋ชจ๋“  ๋ชฉํ‘œ ํ”Œ๋žซํผ์—์„œ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ผ.
    7. ์ฝ”๋“œ์— ๋ณด์กฐ ์ฝ”๋“œinstrument๋ฅผ ๋„ฃ์–ด ๋Œ๋ ค๋ผ. ๊ฐ•์ œ๋กœ ์‹คํŒจ๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ํ•ด๋ณด๋ผ
      • ํ”ํžˆ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค.
      • ์Šค๋ ˆ๋“œ ๋ฒ„๊ทธ๊ฐ€ ์‚ฐ๋ฐœ์ ์ด๊ณ  ์šฐ๋ฐœ์ ์ด๊ณ  ์žฌํ˜„์ด ์–ด๋ ค์šด ์ด์œ ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆ˜์ฒœ ๊ฐ€์ง€ ๊ฒฝ๋กœ ์ค‘์— ์•„์ฃผ ์†Œ์ˆ˜๋งŒ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
      • ์ฆ‰, ์‹คํŒจํ•˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์‹คํ–‰๋  ํ™•๋ฅ ์€ ๊ทน๋„๋กœ ์ €์กฐํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ฐพ์•„๋‚ด๊ธฐ๊ฐ€ ์•„์ฃผ ์–ด๋ ต๋‹ค.
      • ์ด๋ ‡๊ฒŒ ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ข€ ๋” ์ž์ฃผ ์ผ์œผํ‚ฌ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ? => ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค!
        • ์˜ˆ๋ฅผ ๋“ค์–ด, Object.wait(), Object.sleep(), Object.yield(), Object.priority() ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฝ”๋“œ๋ฅผ ๋‹ค์–‘ํ•œ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
        • ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ„๊ทธ๊ฐ€ ๋“œ๋Ÿฌ๋‚  ๊ฐ€๋Šฅ์„ฑ๋„ ๋†’์•„์ง„๋‹ค.
        • ์ž˜๋ชป๋œ ์ฝ”๋“œ๋ผ๋ฉด ์ดˆ๋ฐ˜์— ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•œ ์ž์ฃผ ์‹คํŒจํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.
  • ์ฝ”๋“œ์— ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋‘ ๊ฐ€์ง€
    • ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ
      • ์ฝ”๋“œ์—๋‹ค ์ง์ ‘ wait(), sleep(), yield(), priority() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ํŠน๋ณ„ํžˆ ๊นŒ๋‹ค๋กœ์šด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.
      public synchronized String nextIUrlOrNull() {
        if (hasNext()) {
          String url = urlGenerator.next();
          Thread.yield(); // ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
          updateHasNext();
          return url;
        }
        return url;
      }
      
      yield()๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ๋ฐ”๋€๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „์— ์‹คํŒจํ•˜์ง€ ์•Š์•˜๋˜ ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด์ค€๋‹ค. ์ฝ”๋“œ๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด yield()๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์€ ์•„๋‹ˆ๋‹ค. ์›๋ž˜ ์ž˜๋ชป๋œ ์ฝ”๋“œ์ธ๋ฐ ์ฆ๊ฑฐ๊ฐ€ ๋“œ๋Ÿฌ๋‚ฌ์„ ๋ฟ์ด๋‹ค.
      • ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•  ์ ์ • ์œ„์น˜๋ฅผ ์ง์ ‘ ์ฐพ์•„์•ผ ํ•œ๋‹ค.
      • ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์–ด๋””์„œ ํ˜ธ์ถœํ•ด์•ผ ์ ๋‹นํ•œ์ง€ ์–ด๋–ป๊ฒŒ ์•Œ๊นŒ?
      • ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘๋ฉด ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง„๋‹ค.
      • ๋ฌด์ž‘์œ„์ ์ด๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚ ์ง€๋„ ๋ชจ๋ฅด๊ณ  ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์‚ฌ์‹ค์ƒ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š์„ ํ™•๋ฅ ์ด ๋” ๋†’๋‹ค.
      ๋ฐฐํฌ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋ฐฉ๋ฒ•๋„ ํ•„์š”ํ•˜๋‹ค. ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์„ค์ •์„ ๋ฐ”๊ฟ”์ค„ ๋ฐฉ๋ฒ•๋„ ํ•„์š”ํ•˜๋‹ค.ํ™•์‹คํžˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” POJO์™€ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ์–ดํ•˜๋Š” ํด๋ž˜์Šค๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋ถ„ํ• ํ•˜๋ฉด ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ sleep, yield ๋“ฑ์œผ๋กœ POJO๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ์ง€๊ทธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋™ํ™”
๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด AOF(Aspect-Oriented Framework), CGLIB, ASM ๋“ฑ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ํด๋ž˜์Šค๋‹ค.

public class ThreadJigglePoint() {
  public static void jiggle(){

  }
}

์—ฌ๊ธฐ์„œ ๋‹ค์–‘ํ•œ ์œ„์น˜์— Thread.JigglePoint.jiggle() ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

public synchronized String nextUrlOrNull() {
  if (hasNext()) {
    ThreadJigglePoint.jiggle();
    String url = urlGenerator.next();
    ThreadJigglePoint.jiggle();
    updateHasNext();
    ThreadJigglePoint.jiggle();
    return url;
  }
  return null;
}

ThreadJigglePoint.jiggle() ํ˜ธ์ถœ์€ ๋ฌด์ž‘์œ„๋กœ sleep์ด๋‚˜ yield๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋•Œ๋กœ๋Š” ์•„๋ฌด ๋™์ž‘๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.ThreadJigglePoint ํด๋ž˜์Šค๋ฅผ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค. ํ•˜๋‚˜๋Š” jiggle() ๋ฉ”์„œ๋“œ๋ฅผ ๋น„์›Œ๋‘๊ณ  ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๋ฌด์ž‘์œ„๋กœ nop, sleep์ด๋‚˜ yield ๋“ฑ์„ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋‘˜์งธ ๊ตฌํ˜„์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜์ฒœ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ์Šค๋ ˆ๋“œ ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚ ์ง€ ๋ชจ๋ฅธ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ฒœ๋ฒˆ์— ์ด๋ฅด๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ๋‹ค๋ฉด ๋‚˜๋ฆ„๋Œ€๋กœ ํ•  ๋งŒํผ ํ–ˆ๋‹ค๊ณ  ๋งํ•ด๋„ ๋˜๊ฒ ๋‹ค. ์ฝ”๋“œ๋ฅผ ํ”๋“œ๋Š”(jiggle) ์ด์œ ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งค๋ฒˆ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ์ข‹์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์™€ ํ”๋“ค๊ธฐ(jiggling) ๊ธฐ๋ฒ•์€ ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚  ํ™•๋ฅ ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค€๋‹ค.

๊ถŒ์žฅ์‚ฌํ•ญ : ํ”๋“ค๊ธฐ ๊ธฐ๋ฒ•(jiggling)์„ ์‚ฌ์šฉํ•ด ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด๋ผ

๊ฒฐ๋ก 

  • (1) SRP๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค.
    • POJO๋ฅผ ์‚ฌ์šฉํ•ด ์Šค๋ ˆ๋“œ๋ฅผ ์•„๋Š” ์ฝ”๋“œ์™€ ๋ชจ๋ฅด๋Š” ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋Š” ์ „์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋งŒ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
    • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ์ตœ๋Œ€ํ•œ ์ง‘์•ฝ๋˜๊ณ  ์ž‘์•„์•ผ ํ•œ๋‹ค.
  • (2) ๋™์‹œ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ž ์ •์ ์ธ ์›์ธ์„ ์ฒ ์ €ํžˆ ์ดํ•ดํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์กฐ์ž‘ํ•˜๊ฑฐ๋‚˜ ์ž์› ํ’€์„ ๊ณต์œ ํ•  ๋•Œ ๋™์‹œ์„ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค
    • ๋ฃจํ”„ ๋ฐ˜๋ณต์„ ๋๋‚ด๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์„ ๊น”๋”ํ•˜๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๋“ฑ ๊ฒฝ๊ณ„ ์กฐ๊ฑด์˜ ๊ฒฝ์šฐ๊ฐ€ ๊นŒ๋‹ค๋กœ์šฐ๋ฏ€๋กœ ํŠน๋ณ„ํžˆ ์ฃผ์˜ํ•œ๋‹ค.
  • (3) ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•œ๋‹ค.
    • ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์œ ์‚ฌํ•œ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค.
  • (4) ๋ณดํ˜ธํ•  ์ฝ”๋“œ ์˜์—ญ์„ ์ฐพ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•๊ณผ ํŠน์ • ์ฝ”๋“œ ์˜์—ญ์„ ์ž ๊ทธ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค.
    • ์ž ๊ธ€ ํ•„์š”๊ฐ€ ์—†๋Š” ์ฝ”๋“œ๋Š” ์ž ๊ทธ์ง€ ์•Š๋Š”๋‹ค.
    • ์ž ๊ธด ์˜์—ญ์—์„œ ๋‹ค๋ฅธ ์ž ๊ธด ์˜์—ญ์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด ๊ณต์œ ํ•˜๋Š” ์ •๋ณด์™€ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ์ •๋ณด๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.
  • (5) ๊ณต์œ ํ•˜๋Š” ๊ฐ์ฒด ์ˆ˜์™€ ๋ฒ”์œ„๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ธ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ณต์œ  ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฑ…์ž„์„ ๋– ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • (6) ์Šค๋ ˆ๋“œ์˜ ์ผํšŒ์„ฑ ๋ฌธ์ œ๋Š” ๋Œ€๊ฐœ ์‹œ์Šคํ…œ์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ๋•Œ๋‚˜ ์•„๋‹ˆ๋ฉด ๋œฌ๊ธˆ์—†์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ๋งŽ์€ ํ”Œ๋žซํผ์—์„œ ๋งŽ์€ ์„ค์ •์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๊ณ„์† ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.
    • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์€ TDD 3๋Œ€ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋ฉด ์ž์—ฐํžˆ ์–ป์–ด์ง„๋‹ค.
    • ์‹œ๊ฐ„์„ ๋“ค์—ฌ ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋“œ๋Ÿฌ๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๊ฒŒ ๋†’์•„์ง„๋‹ค.
      • ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋„ ๊ดœ์ฐฎ๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ž๋™ํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค. ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ๋ณด์กฐ ์ฝ”๋“œ๋ฅผ ๊ณ ๋ คํ•˜์ž.
      • ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋Š” ์ถœ์‹œํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ตœ๋Œ€ํ•œ ์˜ค๋žซ๋™์•ˆ ๋Œ๋ ค๋ด์•ผ ํ•œ๋‹ค.

์ฐธ๊ณ  ๋งํฌ

๋ฐ˜์‘ํ˜•