[클린 아키텍처] 10장. ISP: 인터페이스 분리 원칙

혀어어언·2025년 7월 27일
0

📖 [10장] ISP: 인터페이스 분리 원칙

📘 클린 아키텍처 북스터디 정리입니다

📚 도서: 로버트 C. 마틴 《Clean Architecture》
🧑‍💻 목적: 올바른 설계에 대한 감각과 습관을 익히기 위해
🗓️ 진행 기간: 2025년 7월 ~ 매주 2장


✅ 핵심 요약 (Key Takeaways)

이 장의 핵심 문장은?

불필요한 짐을 실은 무언가에 의존하면 예상치도 못한 문제에 빠진다는 사실이다

저자가 전달하고자 하는 메세지 요약

  • 클라이언트가 필요한 메서드만 포함된 인터페이스에 의존하도록 설계할 필요가 있음

💡 내용 정리

ISP - Bad case

  • 클라이언트는 자신이 사용하지 않는 메서드까지 포함된 인터페이스에 의존하게 됨
  • 불필요한 의존으로 인해 인터페이스가 비대해지고 유연성이 저하됨
public interface MultiFunctionDevice {
    void print(Document d);
    void scan(Document d);
    void fax(Document d);
}

public class OldPrinter implements MultiFunctionDevice {	// OldPrinter는 프린트만 가능한 장비
    public void print(Document d) {
        System.out.println("프린트 중입니다");
    }

    public void scan(Document d) {	// 사용하지않는 메서드이지만 인터페이스에 구현을 강제당함
        throw new UnsupportedOperationException("스캔이 지원되지 않습니다");	
    }

    public void fax(Document d) {	// 사용하지않는 메서드이지만 인터페이스에 구현을 강제당함
        throw new UnsupportedOperationException("팩스가 지원되지 않습니다");
    }
}

ISP - Good case

  • 클라이언트는 자신이 실제로 사용하는 기능만을 포함한 인터페이스에 의존함
  • 인터페이스가 작고 명확하므로 유연성, 재사용성, 테스트 용이성이 높아짐
public interface Printer {
    void print(Document d);
}

public interface Scanner {
    void scan(Document d);
}

public interface Fax {
    void fax(Document d);
}

public class OldPrinter implements Printer {	// OldPrinter는 필요한 기능만 구현
    public void print(Document d) {
        System.out.println("Printing only...");
    }
}

public class ModernPrinter implements Printer, Scanner, Fax {
    public void print(Document d) { /* ... */ }
    public void scan(Document d) { /* ... */ }
    public void fax(Document d)  { /* ... */ }
}

ISP와 언어

  • ISP는 프로그래밍 언어 종류에 따라 영향받는 정도가 다름
  • 정적언어:
    - import, use, include와 같은 타입 선언문을 사용 강제 → 컴파일 타임에 타입 의존성 발생
    - 코드 변경 시 재컴파일 또는 재배포 필요
  • 동적언어:
    - 소스코드에 선언문이 존재하지 않기 때문에 런타임에 추론 → 불필요한 타입 의존 없음
    • 코드 변경이 있어도 재컴파일, 재배포 X

ISP와 아키텍처

ISP를 사용하는 근본적 동기

  • 필요 이상의 기능을 강요하는 인터페이스는 불필요한 결합을 초래함
  • ISP를 통해 작고 명확한 인터페이스로 분리하면, 유연하고 변경에 강한 시스템 설계 가능

ISP 위반의 영향

  • 소스코드 수준: 불필요한 재컴파일과 재배포 강제
  • 아키텍처 수준: 변경이 다른 컴포넌트로 전파 → 시스템 전체의 취약성 증가

결론

  • 클라이언트가 필요하지 않은 기능에까지 의존하는 인터페이스 설계는 시스템에 불필요한 결합과 부작용 초래할 수 있음
  • ISP를 준수하면 결합도는 낮추고 유연성은 높은 시스템 설계 가능

🛠 실무 적용 아이디어 (To Action)

✅ 오늘부터 실천할 작은 실천

  • 관심사에 따른 인터페이스 분리

0개의 댓글