CleanCode TIL (2022.02.19)

Henry ChoΒ·2022λ…„ 2μ›” 19일
0

λ…Έκ°œλΆ

λͺ©λ‘ 보기
25/31

DAY 27

πŸ”–Β μ˜€λŠ˜ 읽은 λ²”μœ„ : 13. λ™μ‹œμ„±(235~244p)


πŸ€“Β μ±…μ—μ„œ κΈ°μ–΅ν•˜κ³  싢은 λ‚΄μš©

λ™κΈ°ν™”ν•˜λŠ” λ©”μ„œλ“œ 사이에 μ‘΄μž¬ν•˜λŠ” μ˜μ‘΄μ„±μ„ μ΄ν•΄ν•˜λΌ

  • 곡유 객체 ν•˜λ‚˜μ—λŠ” λ©”μ„œλ“œ ν•˜λ‚˜λ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€
    1. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 잠금: 첫 번째 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 μ„œλ²„λ₯Ό μž κ·Όλ‹€. λ§ˆμ§€λ§‰ λ©”μ„œλ“œ ν˜ΈμΆœμ‹œκΉŒμ§€ μž κΈˆμ„ μœ μ§€
    2. μ„œλ²„μ—μ„œ 잠금: μ„œλ²„λ₯Ό 잠그고 λͺ¨λ“  λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ μž κΈˆμ„ ν•΄μ œν•˜λŠ” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„
    3. Adapted μ„œλ²„: 잠금 μˆ˜ν–‰ν•˜λŠ” 쀑간 단계 생성, μ„œλ²„μ—μ„œ 잠금과 μœ μ‚¬ν•˜μ§€λ§Œ μ›λž˜ μ„œλ²„λŠ” λ³€κ²½ν•˜μ§€ μ•ŠμŒ

동기화 ν•˜λŠ” 뢀뢄을 μž‘κ²Œ λ§Œλ“€μ–΄λΌ

  • synchronized ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄ 락을 μ„€μ •
    • ν•œ λ²ˆμ— ν•œ μŠ€λ ˆλ“œλ§Œ 싀행이 κ°€λŠ₯
    • μŠ€λ ˆλ“œλ₯Ό μ§€μ—°μ‹œν‚€κ³  λΆ€ν•˜λ₯Ό 가쀑
    • λ‚¨λ°œν•˜λ©΄ μ•ˆλ˜μ§€λ§Œ critical section은 λ°˜λ“œμ‹œ λ³΄ν˜Έν•΄μ•Όν•œλ‹€
    • critical section 수λ₯Ό μ€„μ΄μž

μ˜¬λ°”λ₯Έ μ’…λ£Œ μ½”λ“œλŠ” κ΅¬ν˜„ν•˜κΈ° μ–΄λ ΅λ‹€

  • λ°λ“œλ½μ΄ λ°œμƒ ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό κ³ λ―Ό, μ–΄λ ΅λ‹€λ©΄ 이미 λ‚˜μ˜¨ μ•Œκ³ λ¦¬μ¦˜ κ²€ν† 
    • λΆ€λͺ¨κ°€ λͺ¨λ“  μžμ‹μ„ μ’…λ£Œν•˜λΌκ³  ν–ˆμ§€λ§Œ 일뢀 μžμ‹λ“€μ΄ μƒμ‚°μž-μ†ŒλΉ„μž 관계인 경우
    • λΆ€λͺ¨κ°€ μžμ‹μ΄ λλ‚˜κΈ°λ₯Ό κΈ°λ‹€λ¦¬μ§€λ§Œ μžμ‹μ€‘ ν•˜λ‚˜κ°€ λ°λ“œλ½μ΄λ©΄ λΆ€λͺ¨λ„ λ°λ“œλ½

μŠ€λ ˆλ“œ μ½”λ“œ ν…ŒμŠ€νŠΈν•˜κΈ°

  • 문제λ₯Ό λ…ΈμΆœν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•˜λΌ
  • μŠ€λ ˆλ“œκ°€ ν•˜λ‚˜μΌλ•Œμ™€ μ—¬λŸ¬κ°œμΌ λ•Œμ˜ λ³΅μž‘μ„±κ³Ό 경우의 μˆ˜λŠ” λ‹€μ–‘ν•˜λ‹€

말이 μ•ˆλ˜λŠ” μ‹€νŒ¨λŠ” μž μ •μ μΈ μŠ€λ ˆλ“œ 문제둜 μ·¨κΈ‰

  • μ‹œμŠ€ν…œ μ‹€νŒ¨λ₯Ό β€˜μΌνšŒμ„±β€™ 이라 μΉ˜λΆ€ν•˜μ§€ 마라

닀쀑 μŠ€λ ˆλ“œλ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ€ 순차 μ½”λ“œλΆ€ν„° μ œλŒ€λ‘œ 돌게 λ§Œλ“€μž

  • μŠ€λ ˆλ“œ ν™˜κ²½ λ°–μ—μ„œ μƒκΈ°λŠ” 버그와 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μƒκΈ°λŠ” 버그λ₯Ό λΆ„λ¦¬ν•˜λΌ
  • μŠ€λ ˆλ“œ ν™˜κ²½ λ°–μ—μ„œ 일단 정상이어야 ν•œλ‹€

닀쀑 μŠ€λ ˆλ“œλ₯Ό μ“°λŠ” μ½”λ“œ 뢀뢄을 λ‹€μ–‘ν•œ ν™˜κ²½μ— μ‰½κ²Œ λΌμ›Œ 넣을 수 μžˆλ„λ‘ μŠ€λ ˆλ“œ μ½”λ“œλ₯Ό κ΅¬ν˜„

닀쀑 μŠ€λ ˆλ“œλ₯Ό μ“°λŠ” μ½”λ“œ 뢀뢄을 상황에 맞게 μ‘°μœ¨ν•  수 있게 μž‘μ„±ν•˜λΌ

  • μŠ€λ ˆλ“œ 개수λ₯Ό μ‰½κ²Œ μ‘°μœ¨ν•˜λ„λ‘ μ½”λ“œ κ΅¬ν˜„
  • ν”„λ‘œκ·Έλž¨ λ„λŠ” 쀑에 μŠ€λ ˆλ“œ 개수 λ³€κ²½ν•˜λŠ” 방법도 κ³ λ €
  • ν”„λ‘œκ·Έλž¨ 처리율과 νš¨μœ¨μ— 따라 슀슀둜 μŠ€λ ˆλ“œ 개수λ₯Ό μ‘°μœ¨ν•˜λŠ” μ½”λ“œλ„ κ³ λ―Ό

ν”„λ‘œμ„Έμ„œ μˆ˜λ³΄λ‹€ λ§Žμ€ μŠ€λ ˆλ“œ 돌렀보기

  • μ‹œμŠ€ν…œμ΄ μŠ€λ ˆλ“œλ₯Ό μŠ€μ™€ν•‘ ν•  λ•Œλ„ λ¬Έμ œκ°€ λ°œμƒν•˜λ―€λ‘œ ν”„λ‘œμ„Έμ„œ μˆ˜λ³΄λ‹€ λ§Žμ€ μŠ€λ ˆλ“œλ₯Ό 돌렀보자
  • μŠ€μ™€ν•‘μ΄ μž¦μ„μˆ˜λ‘ μž„κ³„μ˜μ—­μ„ 빼먹은 μ½”λ“œλ‚˜ λ°λ“œλ½μ„ μΌμœΌν‚€λŠ” μ½”λ“œ μ°ΎκΈ° 쉽닀

λ‹€λ₯Έ ν”Œλž«νΌμ—μ„œ 돌렀보라

  • 닀쀑 μŠ€λ ˆλ“œ μ½”λ“œλŠ” ν”Œλž«νΌμ— 따라 λ‹€λ₯΄κ²Œ λŒμ•„κ°„λ‹€
  • μ½”λ“œκ°€ λŒμ•„κ°ˆ κ°€λŠ₯성이 μžˆλŠ” ν”Œλž«νΌ μ „λΆ€μ—μ„œ ν…ŒμŠ€νŠΈ μˆ˜ν–‰ν•΄μ•Όν•œλ‹€

μ½”λ“œμ— 보쑰(instrument)μ½”λ“œλ₯Ό λ„£μ–΄ 돌리고, κ°•μ œλ‘œ μ‹€νŒ¨λ₯Ό 일으켜라

  • λ³΄μ‘°μ½”λ“œλ‘œ μ‹€ν–‰ μˆœμ„œλ₯Ό λ°”κΏ”μ£Όλ©΄ μŠ€λ ˆλ“œ 버그λ₯Ό μΌμœΌν‚€κΈ° 쉬움
  • 직접 κ΅¬ν˜„ν•˜κΈ°
    • μ½”λ“œμ— wait(), sleep(), yield(), priority() ν•¨μˆ˜λ₯Ό μΆ”κ°€

      public synchronized String nextUrlOrNull() {
          if (hasNext()) {
              String url = urlGenerator.next();
              Thread.yield(); // ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ μΆ”κ°€λ˜μ—ˆλ‹€. updateHasNext();
              return url;
          }
          return null;
      }
    • 문제점

      • 보쑰 μ½”λ“œ μ‚½μž… μœ„μΉ˜λ₯Ό 직접 μ°Ύμ•„μ•Ό 함
      • μ–΄λ–€ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ 호좜?
      • 배포 ν™˜κ²½μ— 보쑰 μ½”λ“œ 남기면 μ„±λŠ₯이 떨어짐
      • 보쑰 μ½”λ“œ μžˆμ–΄λ„ 문제 μ•ˆλ‚  ν™•λ₯ μ΄ λ†’λ‹€
  • μžλ™ν™”λ‘œ κ΅¬ν˜„ν•˜κΈ°
    • AOF, CGLIB, ASM 같은 도ꡬ ν™œμš©

      public class ThreadJigglePoint {
          public static void 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 λ₯Ό 호좜 ν˜Ήμ€ μ•„λ¬΄λ™μž‘λ„ ν•˜μ§€μ•ŠμŒ(nop)

    • 배포 전에 μ œκ±°ν•˜κΈ° μˆ˜μ›”ν•¨

κ²°λ‘ 

  • SRP μ€€μˆ˜
  • λ™μ‹œμ„± 였λ₯˜λ₯Ό μΌμœΌν‚€λŠ” μž μ •μ μΈ 원일을 μ² μ €νžˆ 이해
  • μ‚¬μš©ν•˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ™€ κΈ°λ³Έ μ•Œκ³ λ¦¬μ¦˜μ„ 이해
  • λ³΄ν˜Έν•  μ½”λ“œμ˜μ—­μ„ μ°Ύμ•„λ‚΄λŠ” 방법과 νŠΉμ • μ½”λ“œ μ˜μ—­μ„ μž κ·ΈλŠ” 방법을 이해
  • 보쑰 μ½”λ“œλ₯Ό μΆ”κ°€ν•˜κ³  μ‹œκ°„μ„ λ“€μ—¬ ν…ŒμŠ€νŠΈ

πŸ€”Β λ– μ˜€λ₯΄λŠ” 생각

  • λ™μ‹œμ„±μ€ ν˜„μ—…μ—μ„œλ„ 쉽지 μ•Šμ€ λ¬Έμ œκ°€μΈκ°€ 보닀. λ‚΄κ°€ κ΄€λ¦¬ν•˜λ˜ DBμ—μ„œ λ°λ“œλ½μ΄ λ°œμƒν•  λ•Œλ§ˆλ‹€ κ°œλ°œμžλ“€μ—κ²Œ 빨리 μ’€ μˆ˜μ •ν•΄λ‹¬λΌκ³  ν–ˆμ—ˆλŠ”λ°..(λ„ˆλ¬΄ λΉˆλ„κ°€ μž¦κΈ΄ν–ˆλ‹€ γ… γ… ) μ–Όλ₯Έ λ‚˜λ„ κ°œλ°œμ„ κ³΅λΆ€ν•΄μ„œ 같이 λ΄λ“œλ €μ•Όκ² λ‹€.

πŸ”ŽΒ μ§ˆλ¬Έ

πŸ“Β μ†Œκ° 3쀄 μš”μ•½

  • 곡유 객체 ν•˜λ‚˜μ—λŠ” λ©”μ„œλ“œ ν•˜λ‚˜λ§Œ μ‚¬μš©ν•˜μž
  • 동기화 ν•˜λŠ” 뢀뢄을 μž‘κ²Œ λ§Œλ“€κ³  synchronized 둜 락을 μ„€μ •
  • μžλ™ 보쑰 μ½”λ“œλ₯Ό ν™œμš©ν•΄ κ°•μ œλ‘œ μ‹€νŒ¨λ₯Ό μΌμœΌν‚€μž
profile
Full stack tech visionary

0개의 λŒ“κΈ€