로버트 C. 마틴의 클린 아키텍처를 읽고 내용 요약 및 생각 정리용 포스트
단일 책임 원칙(SRP)
단순히 하나의 함수는 하나의 기능만을 해야 한다는 뜻이 아니다.(너무 작은 범위)
단일 모듈은 단 하나의 액터(=이해관계자 집단)만을 책임져야 한다.
같은 액터를 책임지는 모듈끼리는 모으고(cohesion), 다른 책임을 지는 모듈과는 분리(decouple)시키는 것과 일맥상통.
관심사의 분리(separation of concerns)와도 관계가 있음
개방-폐쇄 원칙(OCP)
소프트웨어 개체는 확장에는 열려 있고, 변경에는 닫혀 있다.
이는 클래스나 모듈 설계에만 국한되지 않고 아키텍처 컴포넌트 수준에서도 중요.
열려 있다면 소스코드의 수정 없이 데이터 구조에 필드를 추가하거나 함수에 원소를 추가할 수 있음.
닫혀 있다면 다른 클래스에서 이를 구현/상속할 수 있고, 이 때 구현/상속 당하는 클래스는 이에 대해 알지 못한다.
저수준의 컴포넌트(예: View)가 고수준의 컴포넌트(예: Ineteractor)를 의존함으로써 고수준 컴포넌트를 저수준 컴포넌트의 변경으로부터 보호.
리스코프 치환 원칙(LSP)
상위 타입의 객체는 이를 상속한 하위 타입 객체와 행위의 변화 없이 호환될 수 있어야 한다.
상위 클래스의 메소드를 오버라이드 한 하위 클래스의 메소드는 상위 클래스 메소드의 제약조건을 따라야 하고, 하위 클래스에서 더 엄격한 유효성 검사 규칙을 적용해서는 안된다.
클래스 상속과 관련된 원칙에 국한되지 않고 인터페이스와 구현체에도 적용.
인터페이스 분리 원칙(ISP)
사용하지 않는 메소드에 종속되어서는 안된다.
Job 클래스와 client 사이에 인터페이스를 추가하고 각 기능별 인터페이스는 job 클래스에서 상속받은 메소드를 호출한다. (DIP와도 연관)
아키텍처 관점에서 보면 시스템이 불필요한 기능에 의존하게 되면 그 불필요한 기능의 변화로 인해 시스템을 변경해야 하는 상황이 발생할 수 있다.
의존성 역전 원칙(DIP)
모듈이 추상에 의존하고 구체에 의존하지 않는것.
여기서 구체는 변동성이 큰 구체.
제어흐름은 추상에서 구체로 이동하지만 소스 코드 의존성은 반대이다. 이것이 의존성 역전.
low-level이 직접적으로 high-level에 직접적으로 의존해야 하는 것은 아니고, 인터페이스가 상위 계층을 상속받아 하위 계층은 인터페이스를 구현하는 식으로 의존성을 역전시킬 수 있다.