로커트 C. 마틴의 클린 아키텍처를 읽고 정리합니다.
개요
- 좋은 벽돌로 좋은 아키텍처를 정의하는 원칙이 바로 SOLID이다.
- SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법을 설명해 준다.
목적
SOLID 원칙의 목적은 중간 수준의 소프트웨어 구조가 다음과 같도록 만드는데 있다.
- 변경에 유연하다.
- 이해하기 쉽다.
- 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된다.
1. SRP : 단일 책임 원칙
(Single Responsibility Principle)
- 하나의 모듈은 오직 하나의 액터에 대한 책임을 지도록 한다.
- 모듈이 오직 하나의 액터를 책임질 때 응집성(Cohesion)을 가진다고 말한다.
- SRP는 하나의 모듈이 하나의 일만 해야한다는 뜻이 아니다. (그건 조금더 저수준의 함수에 적용되는 다른 원칙이다)
2. OCP : 개방-폐쇄 원칙
(Open-Closed Principle)
- 변경은 쉽고(Open), 변경에 의해 영향은 최소화(Closed)하자!
- 결국 사람이 최소한의 노력을 들여, 최소한의 코드 영역에서 수정할 수 있도록 하자!
실천하기
- 서로 다른 목적으로 변경되는 요소를 적절하게 분리한다 (단일 책임 원칙)
- 요소 사이에 의존성의 방향을 제어하여, 중심적인 요소가 부수적인 요소에 의존하지 않도록 한다. 부수적인 요소가 인터페이스에 의존하도록 한다. (의존성 역전 원칙)
- 어떤 기능을 제공하는 객체 전체를 참조하는 대신, 필요한 인터페이스만 Open 하여 나머지 불필요한 정보들이 Closed 되도록 한다.
- 그래서 추이 종속성(A가 B에 의존하고, B가 C에 의존하면 A역시 C에 종속하는 성질)을 제거한다.
3. LSP : 리스코프 치환 원칙
(Liskov Substitution Principle)
- 세부 행위는 다르지만 그 목적이 동일한 서비스를 일관된 형식으로 요청할 수 있어야 한다.
- 그래서 서비스를 바꾸어도 사용자의 코드(행위)는 변하지 않아야 한다.
LSP를 위반하면
- 사용자의 모든 요청 코드에 서비스에 따른 if 문이 주렁주렁 생긴다.
- 그래서 사용하기도, 확장하기도 어려워진다.
4. ISP : 인터페이스 분리 원칙
(Interface Segregation Principle)
- 사용하지 않는 메쏘드가 있는 클래스에 의존하지 말라.
- 필요하지 않은 것에 의존하지 말라.
5. DIP : 의존성 역전 원칙
(Dependancy Inversion Principle)
- 중심적 요소는 여러 부수적 요소를 의존하는데 만약 중심적 요소가 부수적 요소에 의존하게 되면 하나의 부수적 요소의 변경이 중심적 요소의 변경을 초래할 수 있고 이로 인해 다른 모든 부수적 요소 관련 코드도 영향을 받게 됨