[Book] ν΄λ¦°μ½”λ“œ - 8μž₯ 경계

2021. 1. 23. 13:31Β·πŸ“ Book/✏ Clean Code

8μž₯ κ²½κ³„

μ‹œμŠ€ν…œμ— λ“€μ–΄κ°€λŠ” λͺ¨λ“  μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό 직접 κ°œλ°œν•˜λŠ” κ²½μš°λŠ” λ“œλ¬Όλ‹€. 
λ•Œλ‘œλŠ” νŒ¨ν‚€μ§€λ₯Ό 사고 μ˜€ν”ˆ μ†ŒμŠ€λ₯Ό μ΄μš©ν•œλ‹€.
μ–΄λ–€ μ‹μœΌλ‘œλ“  이 μ™ΈλΆ€ μ½”λ“œμ™€ 우리 μ½”λ“œμ˜ 경계λ₯Ό κΉ”λ”ν•˜κ²Œ μ²˜λ¦¬ν•˜κ³  톡합해야 ν•œλ‹€.

 

1. μ™ΈλΆ€ μ½”λ“œ μ‚¬μš©ν•˜κΈ°

νŒ¨ν‚€μ§€ μ œκ³΅μžλ‚˜ ν”„λ ˆμž„μ›Œν¬ μ œκ³΅μžλŠ” μ μš©μ„±μ„ μ΅œλŒ€ν•œ λ„“ν˜€ 더 λ§Žμ€ ν™˜κ²½μ—μ„œ λŒμ•„κ°€κΈΈ μ›ν•œλ‹€.

ν•˜μ§€λ§Œ μ‚¬μš©μžλŠ” μžμ‹ μ˜ μš”κ΅¬μ— μ§‘μ€‘ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό 더 μ›ν•œλ‹€.

 

예둜 java.util.Map을 μ‚΄νŽ΄λ³΄μž. Map이 μ œκ³΅ν•˜λŠ” κΈ°λŠ₯μ„±κ³Ό μœ μ—°μ„±μ€ ν™•μ‹€νžˆ μœ μš©ν•˜μ§€λ§Œ 그만큼 μœ„ν—˜λ„ 크닀.

  • λ„˜κΈ°λŠ” μͺ½μ—μ„œλŠ” Map λ‚΄μš©μ„ μ‚­μ œν•˜μ§€ μ•ŠμœΌλ¦¬λΌ 믿을 수 μžˆμ§€λ§Œ, Map이 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œ 쀑 Clear()κ°€ μ‘΄μž¬ν•œλ‹€. 즉, Map μ‚¬μš©μžλΌλ©΄ λˆ„κ΅¬λ‚˜ Map λ‚΄μš©μ„ μ§€μšΈ 수 μžˆλ‹€.
  • μ–΄λ–€ 클래슀λ₯Ό μ €μž₯ν•˜λŠ” Map 객체λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ œλ„€λ¦­μŠ€λ‚˜ Warpper 클래슀λ₯Ό 톡해 관리해야 ν•œλ‹€.
// 1. κΈ°λ³Έ ν˜•νƒœ
// μΊμŠ€νŒ…μ˜ 뢀담을 μ•ˆκ²Œ λœλ‹€.
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);

// 2. generic
// Map 객체가 ν•„μš” μ΄μƒμ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 것은 막지 λͺ»ν•œλ‹€.
Map<String, Sensor> sensors = new HashMap<String, Sensor>();
Sensor s = sensors.get(sensorId);

// 3. Wrapping
// κ²½κ³„μ˜ μΈν„°νŽ˜μ΄μŠ€(이 κ²½μš°μ—λŠ” Map의 λ©”μ„œλ“œ)λŠ” μˆ¨κ²¨μ§„λ‹€.
// Map의 μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€κ²½λ˜λ”λΌλ„ μ—¬νŒŒλ₯Ό μ΅œμ†Œν™”ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ Generic을 μ‚¬μš©ν•˜λ˜ 직접 μΊμŠ€νŒ…ν•˜λ˜ 그건 κ΅¬ν˜„ λ””ν…ŒμΌμ΄λ©° Sensor클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” μΈ‘μ—μ„œλŠ” μ‹ κ²½μ“Έ ν•„μš”κ°€ μ—†λ‹€.
// μ΄λŠ” λ˜ν•œ μ‚¬μš©μžμ˜ λͺ©μ μ— λ”± 맞게 λ””μžμΈλ˜μ–΄ μžˆμœΌλ―€λ‘œ μ΄ν•΄ν•˜κΈ° 쉽고 잘λͺ» μ‚¬μš©ν•˜κΈ° μ–΄λ ΅κ²Œ λœλ‹€.
public class Sensors {
    private Map sensors = new HashMap();

    public Sensor getById(String id) {
        return (Sensor)sensors.get(id);
    }
}

 

2. 경계 μ‚΄ν”Όκ³  읡히기

μ™ΈλΆ€μ—μ„œ κ°€μ Έμ˜¨ νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μ–΄λ””μ„œ μ–΄λ–»κ²Œ μ‹œμž‘ν•΄μ•Ό μ’‹μ„κΉŒ?

  1. 타사 라이브러리λ₯Ό 가져와 μ‚¬μš©λ²•μ΄ λΆ„λͺ…μΉ˜ μ•ŠμœΌλ‹ˆ λŒ€κ°œλŠ” ν•˜λ£¨λ‚˜ 이틀 λ¬Έμ„œλ₯Ό 읽으며 μ‚¬μš©λ²•μ„ κ²°μ •ν•œλ‹€.
  2. 우리 μͺ½ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ˜ˆμƒλŒ€λ‘œ λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
  3. λ•Œλ‘œλŠ” 우리 버그인지 라이브러리 버그인지 μ°Ύμ•„λ‚΄λŠλΌ 였랜 λ””λ²„κΉ…μœΌλ‘œ 골치λ₯Ό μ•“λŠ”λ‹€.

 

μ™ΈλΆ€ μ½”λ“œλ₯Ό μ΅νžˆκΈ°λ„ μ–΄λ ΅κ³  μ™ΈλΆ€ μ½”λ“œλ₯Ό ν†΅ν•©ν•˜κΈ°λ„ μ–΄λ ΅λ‹€.

λ‹€λ₯΄κ²Œ μ ‘κ·Όν•΄λ³΄μž.

 

κ³§λ°”λ‘œ 우리 μͺ½ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ μ™ΈλΆ€ μ½”λ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” λŒ€μ‹  λ¨Όμ € κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•΄ μ™ΈλΆ€ μ½”λ“œλ₯Ό ν•™μŠ΅ν•œλ‹€.

이λ₯Ό ν•™μŠ΅ ν…ŒμŠ€νŠΈλΌ λΆ€λ₯Έλ‹€.

  • ν•™μŠ΅ ν…ŒμŠ€νŠΈλŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•˜λ €λŠ” λ°©μ‹λŒ€λ‘œ μ™ΈλΆ€ APIλ₯Ό ν˜ΈμΆœν•œλ‹€. (ν†΅μ œλœ ν™˜κ²½μ—μ„œ APIλ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜λŠ”μ§€λ₯Ό ν™•μΈν•˜λ €λŠ” μ…ˆμ΄λ‹€.)
  • ν•™μŠ΅ ν…ŒμŠ€νŠΈλŠ” APIλ₯Ό μ‚¬μš©ν•˜λ €λŠ” λͺ©μ μ— μ΄ˆμ μ„ λ§žμΆ˜λ‹€.
  • ν•™μŠ΅ ν…ŒμŠ€νŠΈλŠ” 이해도λ₯Ό λ†’μ—¬μ£ΌλŠ” μ •ν™•ν•œ μ‹€ν—˜μ΄λ‹€.
// 1. log4j 라이브러리λ₯Ό λ‹€μš΄λ°›μž.
// "hello"κ°€ 좜λ ₯되길 λ°”λΌλ©΄μ„œ μ•„λž˜μ˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ³΄μž.
public void testLogCreate() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.info("hello");
}

// 2. "AppenderλΌλŠ” 게 ν•„μš”ν•˜λ‹€"λΌλŠ” μ—λŸ¬λ₯Ό λ±‰λŠ”λ‹€.
// 쑰금 더 μ½μ–΄λ³΄λ‹ˆ ConsoleAppenderλΌλŠ” 게 μžˆλŠ” κ±Έ μ•Œμ•„λƒˆλ‹€.
// κ·Έλž˜μ„œ ConsoleAppenderλΌλŠ” 객체λ₯Ό λ§Œλ“€μ–΄ λ„£μ–΄μ€˜λ΄€λ‹€.
public void testLogAddAppender() {
    Logger logger = Logger.getLogger("MyLogger");
    ConsoleAppender appender = new ConsoleAppender();
    logger.addAppender(appender);
    logger.info("hello");
}

// 3. "Appender에 좜λ ₯ 슀트림이 μ—†λ‹€"라고 ν•œλ‹€.
// μ΄μƒν•˜λ‹€. κ°€μ§€κ³  μžˆλŠ” 게 이성적일 것 같은데...
// κ΅¬κΈ€μ˜ 도움을 빌렀, λ‹€μŒκ³Ό 같이 ν•΄λ³΄μ•˜λ‹€.
public void testLogAddAppender() {
    Logger logger = Logger.getLogger("MyLogger");
    logger.removeAllAppenders();
    logger.addAppender(new ConsoleAppender(
        new PatternLayout("%p %t %m%n"),
        ConsoleAppender.SYSTEM_OUT));
    logger.info("hello");
}

// μ„±κ³΅ν–ˆλ‹€.
// ν•˜μ§€λ§Œ ConsoleAppenderλ₯Ό λ§Œλ“€μ–΄λ†“κ³  ConsoleAppender.SYSTEM_OUT을 λ°›λŠ” 건 μ΄μƒν•˜λ‹€.
// κ·Έλž˜μ„œ λΉΌλ΄€λ”λ‹ˆ 잘 λŒμ•„κ°„λ‹€.
// ν•˜μ§€λ§Œ PatternLayout을 μ œκ±°ν•˜λ‹ˆ λŒμ•„κ°€μ§€ μ•ŠλŠ”λ‹€.
// κ·Έλž˜μ„œ λ¬Έμ„œλ₯Ό μ‚΄νŽ΄λ΄€λ”λ‹ˆ "ConsoleAppender의 κΈ°λ³Έ μƒμ„±μžλŠ” unconfigured μƒνƒœ"λž€λ‹€.
// λͺ…λ°±ν•˜μ§€λ„ μ•Šκ³  μ‹€μš©μ μ΄μ§€λ„ μ•Šλ‹€... λ²„κ·Έμ΄κ±°λ‚˜, 적어도 "일관적이지 μ•Šλ‹€"라고 λŠκ»΄μ§„λ‹€.

// 쑰금 더 ꡬ글링, λ¬Έμ„œ 읽기, ν…ŒμŠ€νŠΈλ₯Ό 거쳐 log4j의 λ™μž‘λ²•μ„ μ•Œμ•„λƒˆκ³  그것을 κ°„λ‹¨ν•œ μœ λ‹› ν…ŒμŠ€νŠΈλ‘œ κΈ°λ‘ν–ˆλ‹€.
// 이제 이 지식을 기반으둜 log4jλ₯Ό λž˜ν•‘ ν•˜λŠ” 클래슀λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

3. 아직 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ°

λ•Œλ‘œλŠ” 우리 지식이 경계λ₯Ό λ„ˆλ¨Έ 미치치 λͺ»ν•˜λŠ” μ½”λ“œ μ˜μ—­λ„ μžˆλ‹€.

μ•Œλ €κ³  해도 μ•Œ μˆ˜κ°€ μ—†λ‹€. λ•Œλ‘œλŠ” 더 이상 내닀보지 μ•ŠκΈ°λ‘œ κ²°μ •ν•œλ‹€.

 

  • μ €μžλŠ” 무선톡신 μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν•˜λŠ” ν”„λ‘œμ νŠΈλ₯Ό ν•˜κ³  μžˆμ—ˆλ‹€.
  • κ·Έ νŒ€ μ•ˆμ˜ ν•˜λΆ€ νŒ€μœΌλ‘œ 솑신기λ₯Ό λ‹΄λ‹Ήν•˜λŠ” νŒ€μ΄ μžˆμ—ˆλŠ”λ° λ‚˜λ¨Έμ§€ νŒ€μ›λ“€μ€ 솑신기에 λŒ€ν•œ 지식이 거의 μ—†μ—ˆλ‹€.
  • μ†‘μ‹ κΈ°νŒ€μ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜μ§€ μ•Šμ•˜λ‹€. ν•˜μ§€λ§Œ μ €μžλŠ” μ†‘μ‹ κΈ°νŒ€μ„ κΈ°λ‹€λ¦¬λŠ” λŒ€μ‹  μ›ν•˜λŠ” κΈ°λŠ₯을 μ •μ˜ν•˜κ³  μΈν„°νŽ˜μ΄μŠ€λ‘œ λ§Œλ“€μ—ˆλ‹€.
    • μ›ν•˜λŠ” κΈ°λŠ₯: μ§€μ •ν•œ 주파수λ₯Ό μ΄μš©ν•΄ 이 μŠ€νŠΈλ¦Όμ—μ„œ λ“€μ–΄μ˜€λŠ” 자료λ₯Ό μ•„λ‚ λ‘œκ·Έ μ‹ ν˜Έλ‘œ μ „μ†‘ν•˜λΌ
  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•¨μœΌλ‘œμ¨ 메인 λ‘œμ§μ„ 더 κΉ”λ”ν•˜κ²Œ μ§€ 수 μžˆμ—ˆκ³  λͺ©ν‘œλ₯Ό λͺ…ν™•ν•˜κ²Œ λ‚˜νƒ€λ‚Ό 수 μžˆμ—ˆλ‹€.
  • Adapter Pattern으둜 API μ‚¬μš©μ„ μΊ‘μŠν™”ν•΄ APIκ°€ λ°”λ€” λ•Œ μˆ˜μ •ν•  μ½”λ“œλ₯Ό ν•œ 곳으둜 λͺ¨μ•˜λ‹€.
  • API μΈν„°νŽ˜μ΄μŠ€κ°€ λ‚˜μ˜¨ λ‹€μŒ 경계 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό 생성해 μš°λ¦¬κ°€ APIλ₯Ό μ˜¬λ°”λ₯΄κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈν•  μˆ˜λ„ μžˆλ‹€.

 

4. κΉ¨λ—ν•œ 경계

μ†Œν”„νŠΈμ›¨μ–΄ 섀계가 μš°μˆ˜ν•˜λ‹€λ©΄ λ³€κ²½ν•˜λŠ”λ° λ§Žμ€ νˆ¬μžμ™€ μž¬μž‘μ—…μ΄ ν•„μš”ν•˜μ§€ μ•Šλ‹€.

  • 경계에 μœ„μΉ˜ν•˜λŠ” μ½”λ“œλŠ” κΉ”λ”νžˆ λΆ„λ¦¬ν•˜κ³  κΈ°λŒ€μΉ˜λ₯Ό μ •μ˜ν•˜λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ„ μž‘μ„±ν•œλ‹€.
  • 이μͺ½ μ½”λ“œμ—μ„œ μ™ΈλΆ€ νŒ¨ν‚€μ§€λ₯Ό μ„Έμ„Έν•˜κ²Œ μ•Œμ•„μ•Ό ν•  ν•„μš”κ°€ μ—†λ‹€.
  • ν†΅μ œκ°€ λΆˆκ°€λŠ₯ν•œ μ™ΈλΆ€ νŒ¨ν‚€μ§€μ— μ˜μ‘΄ν•˜λŠ” λŒ€μ‹  ν†΅μ œκ°€ κ°€λŠ₯ν•œ 우리 μ½”λ“œμ— μ˜μ‘΄ν•˜λŠ” 편이 μ’‹λ‹€.
  • μ™ΈλΆ€ νŒ¨ν‚€μ§€λ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œλ₯Ό κ°€λŠ₯ν•œ 쀄여 경계λ₯Ό κ΄€λ¦¬ν•˜μž.
  • μƒˆλ‘œμš΄ 클래슀둜 경계λ₯Ό κ°μ‹Έκ±°λ‚˜ Adapter νŒ¨ν„΄μ„ 톡해 μš°λ¦¬κ°€ μ›ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό νŒ¨ν‚€μ§€κ°€ μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ λ³€ν™˜ν•˜μž.
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Book/✏ Clean Code' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Book] ν΄λ¦°μ½”λ“œ - 10μž₯ 클래슀
  • [Book] ν΄λ¦°μ½”λ“œ - 9μž₯ λ‹¨μœ„ ν…ŒμŠ€νŠΈ
  • [Book] ν΄λ¦°μ½”λ“œ - 7μž₯ 였λ₯˜ 처리
  • [Book] ν΄λ¦°μ½”λ“œ - 6μž₯ 객체와 자료 ꡬ쑰
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Book] ν΄λ¦°μ½”λ“œ - 8μž₯ 경계
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”