clean-architecture-book-thumbnail

개방-폐쇄 원칙(OCP)이라는 개념은 1988년 버트란트 마이어Bertrand Meyer가 다음과 같이 정의했다.

소프트웨어 개체(artifact)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.

즉, 소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 이때 산출물을 변경해서는 안된다.

Table of Contents

사고 실험

A기능을 이용하여 B 형태로 보여주는 기능이 있다고 치자. 이때 B 형태에 추가적인 사항이 생겨 C라는 형태로 보여주는 기능이 추가된다면 코드는 얼마나 변경될까?

  • 이상적인 변경량은 0이다.
  • 소프트웨어 아키텍처가 훌륭하다면 변경되는 코드의 양은 가능한 한 최소화 된다.

어떻게 아키텍처를 훌륭하게 만들까?

핵심은 단일 책임 원칙(SRP), 의존성 역전 원칙(DIP)이다.

  • 서로 다른 목적으로 변경되는 요소를 적절하게 분리하고(단일 책임 원칙, SRP), 이 요소들 사이의 의존성을 체계화함으로써(의존성 역전 원칙, DIP) 변경량을 최소화할 수 있다.
  • 아키텍트는 기능이 어떻게(how), 왜(why), 언제(when) 발생하는지에 따라서 기능을 분리하고, 분리한 기능을 컴포넌트의 계층구조로 조직화한다.
  • 컴포넌트 계층구조를 이와 같이 조직화하면 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있다.

방향성 제어

  • 컴포넌트간 의존성의 방향을 확실히 해야한다.
  • 의존성을 역전시켜 고수준의 컴포넌트를 보호한다.

정보 은닉

추이 종속성: 클래스 A가 클래스 B에 의존하고, 다시 크래스 B가 클래스 C에 의존한다면, 클래스 A는 클래스 C에 의존하게 된다.

  • 추이 종속성을 가지게 되면, 소프트웨어 엔티티는 '자신이 직접 사용하지 않는 요소에는 절대로 의존해서는 안 된다'는 소프트웨어 원칙을 위반하게 된다.

    • 인터페이스 분리 원칙(ISP), 공통 재사용 원칙(CRP)과 관련 있음.

결론

OCP는 시스템의 아키텍처를 떠받치는 원동력 중 하나다. 다음은 OCP의 목표이다.

  • 시스템을 확장하기 쉬운 동시에 변경으로 인해 시스템이 너무 많은 영향을 받지 않도록 한다.

    • 그러기 위해서는 시스템을 컴포넌트 단위로 분리하고, 저수준 컴포넌트에서 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있는 형태의 의존성 계층구조를 이뤄야 한다.

References

  • 모든 출처는 Clean Architecture 도서에 있습니다.