CleanCode TIL (2022.02.18)

Henry Choยท2022๋…„ 2์›” 18์ผ
0

๋…ธ๊ฐœ๋ถ

๋ชฉ๋ก ๋ณด๊ธฐ
24/31

DAY 26

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 13. ๋™์‹œ์„ฑ(226~235p)


๐Ÿค“ย ์ฑ…์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

๊ฐ์ฒด๋Š” ์ฒ˜๋ฆฌ์˜ ์ถ”์ƒํ™”๋‹ค. ์Šค๋ ˆ๋“œ๋Š” ์ผ์ •์˜ ์ถ”์ƒํ™”๋‹ค.

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

  • ๋™์‹œ์„ฑ์€ coupling(๊ฒฐํ•ฉ) ์„ ์—†์• ๋Š” ์ „๋žต
  • what ๊ณผ when์„ ๋ถ„๋ฆฌํ•˜๋Š” ์ „๋žต
  • ์„œ๋ธ”๋ฆฟ ์›น ํ˜น์€ EJB ์ปจํ…Œ์ด๋„ˆ๋ผ๋Š” ์šฐ์‚ฐ์•ˆ์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์‹œ์„ฑ์„ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ด€๋ฆฌ
    • ์›น ์š”์ฒญ์‹œ๋งˆ๋‹ค ๋น„๋™๊ธฐ์‹์œผ๋กœ ์„œ๋ธ”๋ฆฟ์„ ์‹คํ–‰
    • ํŠน์ • ์‹œ์Šคํ…œ์€ throughput ๊ฐœ์„ ์„ ์œ„ํ•ด ๋™์‹œ์„ฑ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€ํ”ผ

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

์•„๋ž˜ ๋ช…์ œ๋งŒ ์ฐธ์ด๋‹ค

  • ๋™์‹œ์„ฑ์€ ๋‹ค์†Œ ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.
  • ๋™์‹œ์„ฑ์€ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋„ ๋ณต์žกํ•˜๊ฒŒ ํ•œ๋‹ค.
  • ๋™์‹œ์„ฑ ๋ฒ„๊ทธ๋Š” ์žฌํ˜„์ด ์–ด๋ ต๋‹ค โ†’ ์ผํšŒ์„ฑ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค
  • ๋™์‹œ์„ฑ ๊ตฌํ˜„์„ ์œ„ํ•ด์„œ๋Š” ๊ทผ๋ณธ์ ์ธ ์„ค๊ณ„ ์ „๋žต์„ ์žฌ๊ณ ํ•ด์•ผ ํ•œ๋‹ค

๋‚œ๊ด€

  • ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ๋™์‹œ์— ์ฐธ์กฐํ•  ๊ฒฝ์šฐ
public class X {
    private int lastIdUsed;
    public int getNextId() {
        return ++lastIdUsed;
    }
}
  • lastIdUsed ๋ฅผ 42๋กœ ์„ค์ •ํ•˜๊ณ  ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ X ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ  ํ•  ๊ฒฝ์šฐ
  • (43, 43) ๋‘ ์Šค๋ ˆ๋“œ ๋ชจ๋‘ 43์„ ๊ฐ€์ง€๋Š” ์ผ๋ถ€ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค

๋™์‹œ์„ฑ ๋ฐฉ์–ด ์›์น™

๋‹จ์ผ ์ฑ…์ž„ ์›์น™ SRP

  • ์ฃผ์–ด์ง„ ๋งค์„œ๋“œ/ํด๋ž˜์Šค/์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ€๊ฒฝํ•  ์ด์œ ๊ฐ€ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค
  • ๋™์‹œ์„ฑ์€ ๋ณต์žก์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ๋ถ„๋ฆฌํ•  ์ด์œ ๊ฐ€ ์ถฉ๋ถ„
  • ๋™์‹œ์„ฑ๊ณผ ๊ด€๋ จ์—†๋Š” ์ฝ”๋“œ์— ๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ๋ก€๊ฐ€ ๋งŽ๋‹ค
  • ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•ด์•ผํ•œ๋‹ค
    • ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋…์ž์ ์ธ ๊ฐœ๋ฐœ, ๋ณ€๊ฒฝ, ์กฐ์œจ ์ฃผ๊ธฐ๊ฐ€ ์žˆ๋‹ค
    • ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋…์ž์ ์ธ ๋‚œ๊ด€์ด ์žˆ๋‹ค.
    • ์ž˜๋ชป ๊ตฌํ˜„ํ•œ ๋™์‹œ์„ฑ ์ฝ”๋“œ๋Š” ๋ณ„์˜๋ณ„ ๋ฐฉ์‹์œผ๋กœ ์‹คํŒจํ•œ๋‹ค.

๋”ฐ๋ฆ„ ์ •๋ฆฌcorollary: ์ž๋ฃŒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ผ

  • ๊ณต์œ  ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๋‚ด ์ž„๊ณ„ ์˜์—ญcritical section ์„ synchronized ํ‚ค์›Œ๋“œ๋กœ ๋ณดํ˜ธ
  • ์ž๋ฃŒ๋ฅผ ์บก์Šํ™” ํ•˜์—ฌ ๊ณต์œ  ์ž๋ฃŒ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ๋ผ
    • ๋ณดํ˜ธํ•  ์ž„๊ณ„์˜์—ญ์„ ๋นผ๋จน์œผ๋ฉด ๊ณต์œ  ์ž๋ฃŒ ์ˆ˜์ •ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค
    • ๋ชจ๋“  ์ž„๊ณ„ ์˜์—ญ์„ ์˜ฌ๋ฐ”๋กœ ๋ณดํ˜ธํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š๋ผ ๋˜‘๊ฐ™์€ ๋…ธ๋ ฅ๊ณผ ์ˆ˜๊ณ  ๋ฐ˜๋ณต
    • ๋ฒ„๊ทธ๋ฅผ ๋” ์ฐพ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค

๋”ฐ๋ฆ„์ •๋ฆฌ: ์ž๋ฃŒ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ผ

  • ์ฒ˜์Œ ๋ถ€ํ„ฐ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์ œ์ผ ์ข‹๋‹ค
  • ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ณต์‚ฌํ•˜๋Š” ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์ด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์— ๋“œ๋Š” ๋ถ€ํ•˜๋ณด๋‹ค ์ด๋“์ผ ๊ฐ€๋Šฅ์„ฑ ํฌ๋‹ค

๋”ฐ๋ฆ„ ์ •๋ฆฌ: ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„

  • ๋…์ž์ ์ธ ์Šค๋ ˆ๋“œ๋กœ, ๊ฐ€๋Šฅํ•˜๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์„œ์—์„œ, ๋Œ๋ ค๋„ ๊ดœ์ฐฎ๋„๋ก ์ž๋ฃŒ๋ฅผ ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ๋ถ„ํ• 
  • Eg) HttpServlet์˜ ํŒŒ์ƒ ํด๋ž˜์Šค๋Š” ๋ชจ๋“  ์ •๋ณด๋ฅผ doGet๊ณผ doPost ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค
    • ๋…์ž์ ์ธ ์‹œ์Šคํ…œ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ผ

  • ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์•ˆ์ „ํ•œ Collection ์„ ์‚ฌ์šฉ
  • ์„œ๋กœ ๋ฌด๊ด€ํ•œ ์ž‘์—… ์ˆ˜ํ–‰์‹œ์—๋Š” executor ํ”„๋ ˆ์ž„ ์›Œํฌ ์‚ฌ์šฉ
  • ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์ฐจ๋‹จ ๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ
  • ์ผ๋ถ€ ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•จ

์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์•ˆ์ „ํ•œ ์ปฌ๋ ‰์…˜

  • ์–ธ์–ด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฒ€ํ† ํ•˜๋ผ
    • ์ž๋ฐ”์˜ ๊ฒฝ์šฐ java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks
  • ConcurrentHashMap ์€ HashMap๋ณด๋‹ค ์•ˆ์ „ํ•˜๋ฉฐ ์„ฑ๋Šฅ๋„ ์ข‹์Œ

์‹คํ–‰ ๋ชจ๋ธ์„ ์ดํ•ดํ•˜๋ผ

  • Bound Resource: ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž์›, ํฌ๊ธฐ๋‚˜ ์ˆซ์ž๊ฐ€ ์ œํ•œ์  eg) DB์—ฐ๊ฒฐ, ๊ธธ์ด์ผ์ •ํ•œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ฒ„ํผ
  • Mutual Exclusion: ํ•œ ๋ฒˆ์— ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๊ณต์œ  ์ž๋ฃŒ๋‚˜ ๊ณต์œ  ์ž์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
  • Starvation: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์˜ค๋ž˜๋™์•ˆ ์ž์›์„ ๊ธฐ๋‹ค๋ฆผ, ์งง์€ ์Šค๋ ˆ๋“œ๋งŒ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ฃผ๋ฉด ๊ธด ์Šค๋ ˆ๋“œ๋Š” Starvation์— ๋น ์ง
  • Deadlock: ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋๋‚˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆผ
  • Livelock: ๋ฝ ๊ฑฐ๋Š” ๋‹จ๊ณ„์—์„œ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ๋ฐฉํ•ด, ๊ณ„์† ์ง„ํ–‰ํ•˜๋ ค ํ•ด๋„ resonance ๋กœ ์˜ค๋ž˜๋™์•ˆ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•จ

์ƒ์‚ฐ์ž-์†Œ๋น„์ž

  • ๋Œ€๊ธฐ์—ด์€ ํ•œ์ •๋œ ์ž์›
  • ์ƒ์‚ฐ์ž ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด์•ผ ์ •๋ณด๋ฅผ ์ฑ„์šฐ๊ณ 
  • ์†Œ๋น„์ž ์Šค๋ ˆ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์— ์ •๋ณด๊ฐ€ ์žˆ์–ด์•ผ ๊ฐ€์ ธ์˜ด
  • ์ž˜๋ชป ์‹œ๊ทธ๋„์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ์ง„ํ–‰ ๊ฐ€๋Šฅํ•จ์—๋„ ์„œ๋กœ ๊ธฐ๋‹ค๋ฆผ

์ฝ๊ธฐ-์“ฐ๊ธฐ

  • ์ฝ๊ธฐ๊ฐ€ ์ฃผ๋กœ ๊ณต์œ  ์ž์›์„ ์“ฐ๋‹ค๊ฐ€ ์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋” ๊ณต์œ  ์ž์›์„ ๊ฐฑ์‹ ํ•˜๋Š”๊ฒฝ์šฐ ์ฒ˜๋ฆฌ์œจ์ด ๊ด€๊ฑด
  • ์ฝ๊ธฐ ์™€ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์š”๊ตฌ๋ฅผ ์ ์ ˆํžˆ ๋งŒ์กฑ์‹œ์ผœ์•ผํ•œ๋‹ค
    1. ์ฒ˜๋ฆฌ์œจ ๊ฐ•์กฐ: ์ฝ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒ„ํผ๋ฅผ ๊ธฐ๋‹ค๋ฆผ โ†’ ์“ฐ๊ธฐ๊ฐ€ Starvation ์— ๋น ์ง
    2. ๊ฐฑ์‹  ํ—ˆ์šฉ: ์“ฐ๊ธฐ ์Šค๋ ˆ๋“œ์—๊ฒŒ ์šฐ์„ ๊ถŒ์„ ์ฃผ๋ฉด ์ฒ˜๋ฆฌ์œจ์ด ๋–จ์–ด์ง

์‹์‚ฌํ•˜๋Š” ์ฒ ํ•™์ž๋“คDining Philosophers

  • ๋‘ฅ๊ทผ ์‹ํƒ์— ์ฒ ํ•™์ž(์Šค๋ ˆ๋“œ)์™€ ๊ฐ ์™ผ์ชฝ์— ํฌํฌ(์ž์›) ์ด ๋†“์˜€์„ ๋•Œ
  • ์ฒ ํ•™์ž๋Š” ๋ฐฐ๊ฐ€ ๊ณ ํ”„๋ฉด ๋ฐ˜๋“œ์‹œ ์–‘์†์œผ๋กœ ํฌํฌ ์„ ๋“ค๊ณ  ์ŠคํŒŒ๊ฒŒํ‹ฐ๋ฅผ ๋จน์Œ
  • ์™ผ์ชฝ ํ˜น์€ ์˜ค๋ฅธ์ชฝ ์ฒ ํ•™์ž๊ฐ€ ํฌํฌ ์‚ฌ์šฉ์ค‘์ด๋ฉด ๊ธฐ๋‹ค๋ ค์•ผํ•จ
  • ์ŠคํŒŒ๊ฒŒํ‹ฐ ๋‹ค ๋จน์—ˆ์œผ๋ฉด ๋ฐฐ๊ณ ํ”Œ๋•Œ๊นŒ์ง€ ์ƒ๊ฐ์— ์ž ๊น€

๐Ÿค”ย ๋– ์˜ค๋ฅด๋Š” ์ƒ๊ฐ

  • ๋™์‹œ์„ฑ์€ ๋‚ด์šฉ์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ์—๋งŒ ๊นจ๋‹ซ๊ฒŒ ๋˜๋ฉฐ ๋ฒ„๊ทธ ์žฌํ˜„์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ์‰ฌ์‰ฌํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์˜์—ญ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์ €์ž๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ฐฉ์–ด์›์น™์„ ๋ฏธ๋ฆฌ ๋”ฐ๋ผ์„œ ๋ฐœ์ƒ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

๐Ÿ”Žย ์งˆ๋ฌธ

๐Ÿ“ย ์†Œ๊ฐ 3์ค„ ์š”์•ฝ

  • ๋™์‹œ์„ฑ๋ฐฉ์–ด์›์น™1. ์ž๋ฃŒ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•˜๋ผ
  • ๋™์‹œ์„ฑ๋ฐฉ์–ด์›์น™2. ์ž๋ฃŒ ์‚ฌ๋ณธ์„ ์‚ฌ์šฉํ•˜๋ผ
  • ๋™์‹œ์„ฑ๋ฐฉ์–ด์›์น™3. ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ผ
profile
Full stack tech visionary

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