기술도서

클린 아키텍처 요약 - 3부. 설계원칙 (2)

jasNote 2024. 4. 22. 14:29

 

8장. OCP : 개방 폐쇄 원칙

확장에는 열려있고 변경에는 닫혀 있어야 한다.

 

사고실험

OCP는 모듈 설계 뿐만 아니라 컴포넌트 수준에서도 중요한 의미를 가진다.

사고 실험을 통해 이해해보자.

  • '재무제표 보고 시스템'을 만든다고 생각해보자.
  • 프로세스 : 재무데이터 → (재무분석) → 보고용 재무데이터 → 웹 표시 or 프린터 출력
  • 목적을 달성하기 위해 처리과정을 컴포넌트 단위로 구분해보면 아래와 같다. (색이 들어간 네모박스가 컴포넌트 임)

 

 

컴포넌트 단위 분리 설명

  • 재무제표 보고 시스템을 위해 View, Presenter, Controller, Interactor, Database 5개의 컴포넌트 생성.
  • 컴포넌트간 관계 의존(화살표)은 오직 한 방향으로만 표시된다.
  • Controller와 Database의 의존을 받는 Interactor 컴포넌트는 고수준 정책을 담당한다.
  • Financial Data Gateway<I>를 중심으로 Financial Report Generator와 Financial Data Mapper가 의존 중이다. 해당 인터페이스가 없었다면 Interactor 컴포넌트는 Database 컴포넌트를 의존하는 관계가 된다. 그럼 고수준 정책을 유지하기 어려웠을 것이다. 때문에 의존성 역전을 통해 고수준 정책을 유지했다.

사고실험 컴포넌트 단위 분리

 
 
 

결론

저수준에서 고수준 컴포넌트를 보호할 수 있도록 계층구조를 만들어야 한다.

9장. LSP : 리스코프 치환 원칙

정의

“S 타입의 객체(o1), 각각에 대항하는 T 타입 객체(o2)가 있고, T 타입을 이용해서 정의한 모든 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다.”

텍스트만으로는 잘 이해가 되지 않으므로 아래 예제로 확인해보자.

상속을 사용하도록 가이드하기

  • 아래는 LSP를 준수한 설계이다.
  • Billing 행위가 License 하위 타입에 의존하지 않는다.
  • Personal License, Business License는 License를 치환할 수 있다.
  • 자식객체가 부모객체를 완전히 대체할 수 있는 원칙을 의미한다.

 

정사각형/직사각형 문제

  • 리스코프 치환에 위배되는 문제
  • 직사각형은 가로/세로의 길이가 다르기 때문에 각 세팅이 가능하다.
  • 정사각형은 가로/세로의 길이가 같기 때문에 각 세팅이 불가하다.

Rectangle r = new Rectangle
r.setW(5);
r.setH(2);
assert(r.area() == 10) // error : 정사각형 대입시 10이 아닌 4 결과 반환

 

결론

LSP를 조금이라도 위배하면 아키텍처가 오염된다. 그럼 상당량의 별도 로직이 필요하게 된다. LSP를 준수해라.