본문 바로가기

Design/Architecture

(17)
[Clean Architecture] 컴포넌트 사이의 관계와 원칙(1) : ADP ADP (의존성 비순환 원칙) 란? 컴포넌트 의존성 그래프에 순환이 있어서는 안 된다. ADP를 이야기하기 전에 숙취 증후군에 대해서 알아보자. 숙취 증후군은 당신이 하루종일 작업하여 무언가를 작동하게 만들어 놓았지만, 그 기능이 의존하는 무언가를 다른 팀이 수정하여, 다음 날 출근하면 그 기능이 전혀 돌아가지 않는 것을 이야기한다. 숙취 증후군 해결책으로 두 가지 방법이 발전되어 왔는데 하나씩 알아보도록 하자. 1. 주단위 빌드 모든 개발자는 일주일의 첫 4일 동안은 각자 개발을 진행한다. 금요일이 되면 변경된 코드를 모두 통합하여 시스템을 빌드하는 작업을 진행한다. 하지만 금요일 안에 모든 작업이 완료되지 못하는 경우가 발생하고, 결국 기존에 계획했던 4일 개발 하루 통합이 지켜지지 못하는 상황이 발..
[Clean Architecture] 컴포넌트 응집도 이번에는 컴포넌트 응집도와 관련된 3가지 원칙을 알아보자. 1. REP(Reuse/Release Equivalence Principle) : 재사용 / 릴리스 등가 원칙 재사용 단위는 릴리스 단위와 같다 이 원칙을 소프트웨어 설계와 아키텍처 관점에서 보면 단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 함을 뜻한다. 컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 한다. 하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스할 수 있어야 한다. (당연한 사실!!) 하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호가 같아야 한다. 동일한 릴리스로 추적 관리, 동일한 릴리스 문서에 포함되어야 한다. CCP와 CRP는 REP를 엄격하게 제약을 가하는 측면에서 정의한다. ..
[Clean Architecture] 컴포넌트 SOLID 원칙이 벽과 방에 벽돌을 배치하는 방법을 알려준다면, 컴포넌트 원칙은 빌딩에 방을 배치하는 방법을 설명해 준다. 큰 빌딩과 마찬가지로 대규모 소프트웨어 시스템은 작은 컴포넌트들로 만들어진다. 컴포넌트란? 컴포넌트는 배포단위이다. 자바에서는 jar파일 루비에서는 gem파일 닷넷에서는 DLL파일 인터프리터형 언어에서는 소스 파일의 결합체 잘 설계된 컴포넌트라면 반드시 독립적으로 배포 가능한, 따라서 독립적으로 개발 가능한 능력을 갖춰야 한다. 컴포넌트의 역사 컴포넌트의 역사를 간단히 훑어보도록 하자. 초기 라이브러리 함수는 소스코드에 직접 포함시켰음. => 메모리크기의 제한으로 인해, 컴파일을 나눠서해야했으므로 컴파일 과정이 매우 느렸음 라이브러리를 소스코드로 부터 분리하고, 미리 별도 컴파일하여..
[Clean Architecture]SOLID 원칙 : 5.DIP 의존성 역전 원칙 DIP 란? 의존성 역전 원칙은 유연성을 극대화시키는데 그 목적이 있다. 이는 소스 코드 의존성이 추상(abstraction)에 의존하며, 구체(concretion)에는 의존하지 않는 시스템을 이야기한다. 즉, 정적 타입의 언어에서는 use, import, include를 통해 인터페이스 혹은 추상 클래스와 같은 추상적인 선언만 참조해야한다는 뜻이다. 하지만 정적타입 언어인 JAVA를 예로들면, String이나 Integer와 같은 구체클래스도 사용하면 안된다는 걸까? 그렇지 않다. String이나 Integer와 같은 클래스는 매우 안정적인 클래스 이기 때문에 변경되는 일이 적다. 따라서 DIP를 논할 때, 운영체제나 플랫폼 같이 안정성이 보장된 환경에 대해서는 무시하는 편이다. 즉, 우리가 주의해야할..
[Clean Architecture]SOLID 원칙 : 4.ISP 인터페이스 분리 원칙 ISP 란? 이 단원에서는 책에서 한줄로 명확하게 ISP를 정의하는 문장은 없었으나, 내용상 아래와 같이 요약할 수 있겠다. 유연하며 낮은 결합도가 낮은 구조를 통해 불필요한 의존성을 제거해야한다는 원칙. 책에 있는 위 다이어그램을 통해 ISP를 이해해보도록 하자. (정적 타입 언어를 사용한다 가정) 위 그림을 보게되면, OPS라는 클래스의 인스턴스를 User1, User2, User3라는 프로그램에서 사용하고있다. 이때, User1은 OPS.op1()만, User2는 OPS.op2()만, User3는 OPS.op3()만 사용한다고 가정한다. 위 구조상 User1의 경우 op2와 op3를 사용하지 않음에도 불구하고, op1뿐만 아니라 op2, op3에도 의존성을 가지고 있다. 따라서 op1이 아닌 다른 ..
[Clean Architecture]SOLID 원칙 : 3.LSP 리스코프 치환 원칙 LSP 란? 바바라 리스코프라는 사람이 정의한 하위 타입에 대해 먼저 생각해보자 . 여기에서 필요한 것은 다음과 같은 치환 원칙이다. S 타입의 객체 o1 각각에 대응하는 T 타입 객체 o2가 있고, T타입을 이용해서 정의한 모든 프로그램 P에서 o2자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다. 말이 쪼금 헷갈리니... 상황을 다시 적어본다면,, 어떤 프로그램 P가 있는데 이게 T타입을 이용해서 만들었고, 만약에 이 T 타입의 객체 o2자리에 S 타입의 객체 o1로 치환해도 P행위가 변하지 않는다면 S는 T의 하위 타입이다... 즉 S는 T를 상속하였고 그 기능들을 다 가지고 있을 것이고, 따라서 S든 T든 P행위에도 영향을 끼치지 않았겠지? 무튼 LSP 원칙이 이러..
[Clean Architecture]SOLID 원칙 : 2.OCP 개방-폐쇄 원칙 OCP란? 소프트웨어 개체(artifact)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 이 말을 다시 적으면 "소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 이때 개체를 변경해서는 안 된다" 라는 뜻이다. 소프트웨어에서 기능을 추가하려고하는데 시스템을 엄청 많이... 수정해야한다면, 이는 엄청난 실패이다. 이러한 상황을 피할 수 있는 설계가 OCP원칙을 따른 설계라고 할 수 있을 것이다. OCP는 단순히 클래스와 모듈 수준을 넘어 아키텍쳐는 더 중요한 의미를 가진다. OCP의 목표 시스템을 확장하기 쉬운 동시에 변경으로 인해 시스템이 너무 많은 영향을 받지 않도록 하는데 있다. 사고 실험 이번 장에서는 사고실험 예시로 나온 클래스 설계 도면을 보면서 OCP를 이해해 보도록 하자. (..
[Clean Architecture]SOLID 원칙 : 1.SRP 단일 책임 원칙 SRP 란? SRP란, 하나의 모듈은오직 하나의 액터(actor)에 대해서만 책임져야 한다는 원칙이다. SRP는 SOLID 원칙 중에서 의미 전달이 어려운 원칙이다. 단일 책임의 원칙이라고 하여 하나의 모듈은 단하나의 일만 해야한다는 의미가 아님에 주의하자. (이는 함수는 반드시 하나의 일만 해야한다는 원칙이다. 이는 커다란 함수를 작은 함수들로 리펙터링하는 더 저수준에서 사용. SRP와 혼동하지 말자!) SRP 원칙에 대한 설명에서 Actor는 이해관계자들이라고 생각하면 된다. 예를 들면 평가 모듈은 오직 평가 담당자(actor)에 대해서만 책임져야한다.(한 액터에 의한 수정이 다른 액터를 위한 모듈에 영향이 주어서안됨!) 모듈이란 무슨 뜻인가? 모듈이란 내가 이해하기 쉬운 언어로 함수와 데이터 구조로..