본문 바로가기

클린 아키텍처

(11)
[개발서적] 클린 아키텍처 11 - DIP: 의존성 역전 원칙 DIP : 의존성 역전 원칙 (Dependancy Inversion Principle)DIP에서 '유연성이 극대화된 시스템'을 말할 땐 소스 코드 의존성이 추상(abstraction)에 의존하며 구체(concretion)에는 의존하지 않는 것을 말한다. 즉, 상위 요소를 상속받을 때 구체화된 구현체를 직접 상속받는 것이 아니라 인터페이스 또는 추상 클래스와 같이 추상화된 클래스를 참조해야 한다 의미다. 그러나 모든 것에서 DIP를 강제하는 것은 현실적이지 않다. 우리가 현실적으로 지킬 수 있는 방법은 변동성이 큰 구체를 의존하지 않도록 피하는 것이다.안정화된 추상화추상 인터페이스이 변경되면 이를 구체화한 구현체들 또한 변경되어야 한다. 그러나 구체화된 구현체를 변경하는 경우에 인터페이스를 변경하는 경우는..
[개발서적] 클린 아키텍처 09 - LSP: 리스코프 치환 원칙 리스코프 치환 원칙이란?리스코프 치환 원칙이란 상위 타입 클래스(S)를 상속받는 하위 타입 클래스(o1)를 다른 하위 타입 클래스(o2)로 치환하더라도 상위 타입 클래스(S)를 호출하는 프로그램(P)의 행위가 변하지 않아야 한다는 것을 뜻한다. LSP를 준수하는 예시  위 다이어그램의 Billing 클래스는 License 클래스의 calcFee() 메서드를 호출하고 있다. 그리고 License는 PersonalLicense, BusinessLicense 두 가지 하위 타입을 가지고 있다. 두 하위 타입은 서로 다른 알고리즘을 이용해 라이선스 비용을 계산한다. Billing 클래스에서 어떤 하위 타입을 사용하더라도 calcFee() 메서드를 호출하는 행위는 변하지 않는다.  LSP를 위반하는 문제 (정사각..
[개발 서적] 클린 아키텍처 08 - OCP: 개방-폐쇄 원칙 개방-폐쇄 원칙소프트웨어 개체(artifact)는 확장에 열려 있어야 하고, 변경에는 닫혀 있어야 한다.  이 말은 소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 변경해서는 안된다는 의미다. 만약 소프트웨어에서 요구 사항을 살짝 확장하기 위해서 엄청난 수정이 발생하게 된다면 해당 소프트웨어 시스템의 아키텍처는 실패한 아키텍처가 된다.  사고 실험재무제표를 웹으로 보여주는 시스템을 예로 OCP를 알아보자. 해당 재무제표 시스템에서 웹이 아닌 보고서를 프린터로 출력해 달라는 요청사항이 생겼다면 새로운 코드를 작성해야 할 것이다. 훌륭한 소프트웨어 아키텍처라면 수정되는 코드의 양이 가능한 최소화될 것이다. 어떻게 하면 변경을 최소화할 수 있을까? 변경을 최소화할 수 있는 방법서로 다른 목적으로 변경되는 ..
[개발서적] 클린 아키텍처 07 - SRP : 단일 책임 원칙 (Single Responsibility principle) SRP의 오해SRP에 대해 흔히 오해하는 것들은 모든 모듈들이 단 하나의 일만 해야 한다는 것이다. 그러나 이러한 원칙은 SRP 가 아닌 전혀 다른 원칙이다. 이 원칙 "함수는 단 하나의 일만 해야 한다"는 커다란 함수를 작은 함수로 리팩터링하는 더 저수준에서 사용되는 원칙으로 SRP가 아니며 SOLID 원칙 또한 아니다.SRP(Single Responsibility principle) 원칙이란? SRP 원칙은 다음 문장으로 정의할 수 있다. 하나의 모듈은 하나의, 오직 하나의 액터(Actor)에 대해서만 책임져야 한다. 여기서 액터(Actor)는 변경을 요청하는 사용자 또는 이해관계자의 집단을 의미한다. 모듈은 함수와 데이터 구조로 구성된 응집된 집합으로 단일 액터를 책임지는 코드를 함께 묶어주는 것이..
[개발서적] 클린 아키텍처 07 - 설계 원칙 (SOLID) SOLID 원칙이란?SOLID 원칙은 깔끔한 코드(clean code)와 좋은 아키텍처를 정의한 원칙이다. SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법을 설명해 준다. 여기서 말하는 클래스는 함수와 데이터의 집합을 말한다. (클래스라는 말이 나온다 해서 OOP에만 적용된다는 뜻은 아니다.) 또한 SOLID 원칙은 중간 수준의 소프트웨어 구조가 아래와 같도록 만드는 데 있다.변경에 유연해야 한다.이해하기 쉽다.많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트의 기반이 된다,. SOLID 원칙SRP: 단일 책임 원칙 (Single Responsibility Principle) : - 콘웨어(Conway) 법칙에 따른 따름정리로 각 소프트웨어 모듈은..
[개발서적] 클린 아키텍처 06 - 함수형 프로그래밍 함수형 프로그래밍?알론조 처치가 1930년 람다 계산법을 기반으로 발명한 패러다임이다. 아래 정수를 제곱하는 예시를 통해 함수형 프로그래밍에 대해 설명한다. 정수 제곱하기정수의 제곱을 출력하는 간단한 예제로 함수형 언어에 대해 이해해 볼 수 있다.  자바 언어로 작성된 예시public class Squint { public static void main(String args[]) { for (int i=0; i 클로저 (함수형 언어) 예시(println (take 25 (map (fn [x] (* x x)) (range))))(println ;___ 출력한다. (4) (take 25 ;___ 처음부터 25까지 (3) (map (fn [x] (* x x)) ;__ 제곱을 (2) ..
[개발서적] 클린 아키텍처 05 - 객체 지향 프로그래밍 (Object-Orented) 객체 지향(Object-Orented) 설계 원칙이란?객체 지향 설계 원칙은 좋은 아키텍트를 설계하는 출발선이다. 그렇다면 객체 지향이란 무엇일까? 일반적으로 "데이터와 함수의 조합", "실제 세계를 모델링하는 새로운 방법"과 같은 답변을 답할 수 있을 것이다. 그러나 이 답변들은 OO에 대해 명확한 설명이라고 할 수는 없다. OO에 대한 본질을 설명하기 위해서 캡슐화(encapsulation), 상속(inheritance), 다형상(polyorphism)에 기대는 부류도 있다. OO는 이 세 가지 개념을 적절하게 조합한 것이거나, 또는 OO 언어는 최소한 세 가지 요소를 반드시 지원해야 한다고 말한다. 캡슐화OO는 데이터와 함수를 효과적으로 캡슐화하는 방법을 제공한다. 이를 통해 데이터와 함수가 응집력..
[개발서적] 클린 아키텍처 04 - 구조적 프로그래밍 구조적 프로그래밍구조적 프로그래밍은 에츠허르 비버 데이크스트라에 의해 발견되었다. 데이크스트라는 프로그래밍의 많은 세부사항으로 인해 프로그램이 정상동삭을 실패하는 문제를 증명이라는 수학적 원리 적용하여 유클리드 계층구조를 통해 해결하고자 했다.  데이크스트라는 갑자기 이 연구를 진행하면서 goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 된다는 사실을 발견했다. 반면  이런 goto 문장을 사용하더라도 모듈 분해할 때 문제가 되지 않는 경우가 있었다. 이러한 goto 문의 '좋은' 사용 방식은 if/then/else 와 do/while과 같은 분기와 반복이라는 단순한 제어구조였다.제어 구조데이크스트라는 분기와 반복과 같은 제어구조는 순차 실행과 결합 했을때 특별해지는 것을 발견했다..
[개발서적] 클린 아키텍처 03 - 패러다임의 개요 패러다임이란?패러다임은 어떤 프로그래밍 구조를 사용하지, 그리고 언제 이 구조를 사용해야 하는지를 결정한다. 현재까지 이러한 패러다임에는 세가지 종류가 있다. 구조적 프로그래밍최초로 적용된 패러다임으로 1968년 에츠허르 비버 데이크스트라가 발견했다. 데이크스트라는 무분별한 점프(goto 문장)는 프로그램 구조에 해롭다는 사실을 제시했다. 이러한 점프들을  if/then/else와 do/while/until과 같이 더 익숙한 구조로 대체했다. 구조적 프로그래밍은 제어흐름의 "직접적인 전환"에 대해 규칙을 부과한다. 객체 지향 프로그래밍두 번째로 도입된 패러다임은 구조적 프로그래밍보다 2년 앞선 1966년 올레 요한 달과 크리스텐 니가드에 의해 등장했다. 알골 언어의 함수 호출 스택 프레임을 힙으로 옮기면..
[개발서적] 클린 아키텍처 02 - 두 가지 가치에 대한 이야기 소프트웨어 시스템의 두 가지 가치소프트웨어 시스템은 두 가지 가치를 제공하는데 행위와 구조이다. 행위첫 번째 가치는 이해관계자가 기계를 통해 수익을 창출하거나 비용을 절약하도록 만들기 위한 것프로그래머는 이러한 이해관계자의 요구사항을 기계에 구현하고 버그를 수정하는 일만이 자신의 직업으로 믿는다. 그러나 이러한 행위만이 프로그래머가 가져야 하는 직업이 아니다. 구조두 번째 가치는 ‘소프트웨어’라는 단어에 있다. 소프트웨어는 합성어로 부드럽다(soft)와 제품(ware)의 합성어다. 즉 소프트웨어 부드러움을 지니도록 설계되어야 하고, 이는 변경하기 쉬워야 한다는 뜻이다. 프로그래머는 소프트웨어 설계 할 때는 변경사항이 쉬운 구조로 설계를 해야 한다. 소프트웨어에 새로운 요청사항을 적용하는 데 어려움을 느끼..