본문 바로가기

프로그래밍 놀이터/디자인 패턴, 리펙토링125

[책 정리] 14장. 컴포넌트 결합 - Clean Architecture ADP : 의존성 비순환 원칙 -"컴포넌트 의존성 그래프에 순환(cycle)이 있어서는 안 된다." 개발자가 동일한 소스 파일을 수정하는 환경에서는 숙취 증후군(morning after syndrome)이 발생한다.잘 작동하던 코드가 다음날 작동하지 않는 것이다. 이에 대한 해결책은 두 가지가 있다.한 가지는 "주 단위 빌드(weekly build)"이며, 두 번째 해결책은 '의존성 비순환(Acyclic Dependencies Principle, ADP) 이다. * 주 단위 빌드 (Weekly Build) -개발자 모두 코드를 개인적으로 복사하여 작업하며, 전체적인 기준에서 작업을 어떻게 통합할지는 걱정하지 않는다.그런 후 금요일이 되면 변경된 코드를 모두 통합하여 시스템을 빌드한다.단점은 금요일에 통합.. 2020. 4. 18.
[책 정리] 13장. 컴포넌트 응집도 - Clean Architecture REP : 재사용/릴리스 등가 원칙 -"재사용 단위는 릴리스 단위와 같다."단일 컴포넌트는 응집성 높은 클래스와 모듈들로 구성되어야 함을 뜻한다.컴포넌트를 구성하는 모든 모듈은 서로 공유하는 중요한 테마나 목적이 있어야 한다. -하나의 컴포넌트로 묶인 클래스와 모듈은 반드시 함께 릴리스할 수 있어야 한다.하나의 컴포넌트로 묶인 클래스와 모듈은 버전 번호가 같아야 하며, 동일한 릴리스로 추적 관리되고, 동일한 릴리스 문서에 포함되어야 한다. CCP : 공통 폐쇄 원칙 -"동일한 이유로 동일한 시점에 변경되는 클래스를 같은 컴포넌트로 묶어라.서로 다른 시점에 다른 이유로 변경되는 클래스는 다른 컴포넌트로 분리하라." 이 원칙은 단일 책임 원칙(SRP)을 컴포넌트 관점에서 다시 쓴 것이다.단일 컴포넌트는 변경.. 2020. 4. 17.
[책 정리] 12장. 컴포넌트 - Clean Architecture -SOLID 원칙이 벽과 방에 벽돌을 배치하는 방법을 알려준다면, 컴포넌트 원칙은 빌딩에 방을 배치하는 방법을 설명해준다.대규모 소프트웨어 시스템은 작은 컴포넌트들로 만들어진다. -컴포넌트는 배포 단위다.컴포넌트는 시스템의 구성 요소로 배포할 수 있는 가장 작은 단위다.자바의 경우 jar 파일이 컴포넌트다. 루비에서는 gem, 닷넷에서는 DLL 이다.컴파일형 언어에서 컴포넌트는 바이너리 파일의 결합체다.인터프리터형 언어의 경우는 소스 파일의 결합체다. -컴포넌트가 마지막에 어떤 형태로 배포되든 잘 설계된 컴포넌트라면 반드시 독립적으로 배포 가능한, 따라서 독립적으로 개발 가능한 능력을 갖춰야 한다. 컴포넌트의 간략한 역사 재배치성 -과거 고정된 메모리 위치에만 라이브러리를 로드할 수 있었다.그래서 앱이 .. 2020. 4. 16.
[책 정리] 11장. DIP : 의존성 역전 원칙 - Clean Architecture -의존성 역전 원칙(DIP)에서 말하는 유연성이 극대화된 시스템이란 소스 코드 의존성이 추상(abstraction)에 의존하며 구체(concrete)에는 의존하지 않는 시스템이다.자바와 같은 정적 타입 언어에서 이 말은 use, import, include 구문은 오직 인터페이스나 추상 클래스 같은 추상적인 선언만을 참조해야 한다는 뜻이다.구체적인 대상에는 절대로 의존해서는 안 된다. DIP 를 논할 때 운영체제나 플랫폼 같이 안전성이 보장된 환경에 대해서는 이를 무시하는 편이다.이들 환경에 대한 의존성은 용납하는데, 변경되지 않는다면 의존할 수 있다는 사실을 이미 알고 있기 때문이다. -우리가 의존하지 않도록 피하고자 하는 것은 바로 변동성이 큰(volatile) 구체적인 요소다.그리고 이 구체적인 요.. 2020. 4. 15.
[책 정리] 10장. ISP : 인터페이스 분리 원칙 - Clean Architecture ISP 와 언어 -정적 타입 언어는 사용자가 import, user 또는 include 같은 타입 선언문을 사용하도록 강제한다.이처럼 소스 코드에 포함된 선언문으로 인해 소스 코드 의존성이 발생하고, 이로 인해 재컴파일 또는 재배포가 강제되는 상황이 무조건 초래된다. 루비나 파이썬 같은 동적 타입 언어에서는 소스 코드에 이러한 선언문이 존재하지 않는다. 대신 런타임 추론이 발생한다.동적 타입 언어를 사용하면 정적 타입 언어를 사용할 때보다 유연하며 결합도가 낮은 시스템을 만들 수 있는 이유가 이 때문이다. ISP 와 아키텍처 -일반적으로, 필요 이상으로 많은 걸 포함하는 모듈에 의존하는 것은 해로운 일이다.소스 코드 의존성의 경우 이는 분명한 사실인데, 불필요한 재컴파일과 재배포를 강제하기 때문이다. 결.. 2020. 4. 14.
[책 정리] 9장. LSP: 리스코프 치환 원칙 - Clean Architecture - 리스코프는 하위 타입(subtype)을 아래와 같이 정의했다. "여기에서 필요한 것은 다음과 같은 치환(substitution)원칙이다. S 타입의 객체 o1 각각에 대응하는 T타입 객체 o2 가 있고, T타입을 이용해서 정의한 모든 프로그램 P 에서 o2 의 자리에 o1 을 치환하더라도 P 의 행위가 변하지 않는다면, S는 T의 하위 타입이다." 상속을 사용하도록 가이드하기 - 사용자가 Interface 를 바라보면서 어떤 하위타입이 사용되는지에 의존하지 않는다면 이것은 LSP 를 준수한다고 볼 수 있다. 정사각형/직사각형 문제 - LSP 를 위반하는 전형적인 문제로는 유명한 정사각형/직사각형 문제가 있다. Squre 가 Rectangle 을 상속하는 경우.. Rectangle r = ... r.s.. 2020. 4. 13.
[책 정리] 8장. OCP: 개방-폐쇄 원칙 - Clean Architecture -개발-폐쇄 원칙(OCP) 는 다음과 같다."소프트웨어 개체(artifact)는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.다시 말해 소프트웨어 개체의 행위를 확장할 수 있어야 하지만, 이 때 개체를 변경해서는 안 된다." 소프트웨어 아키텍처를 공부하는 가장 근본적인 이유가 바로 이 때문이다.요구사항을 살짝 확장하는 데 소프트웨어를 엄청나게 수정해야 하면 이는 실패한 아키텍처이다. 사고 실험 -재무제표를 웹 페이지로 보여주는 시스템이 있다고 하자.웹 페이지에 표시되는 데이터는 스크롤 할 수 있고, 음수는 빨간색으로 출력한다.이제 이해관계자가 동일한 정보를 보고서 형태로 변환해서 흑백 프린터로 출력해 달라는 요청이 왔다.이 보고서에는 페이지 번호가 있어야 하고, 페이지마다 저절한 머리글과 바닥.. 2020. 4. 12.
[책 정리] 7장. SRP, 단일 책임 원칙 - Clean Architecture -좋은 소프트웨어 시스템은 깔끔한 코드(clean code)로부터 시작한다.SOLID 원칙은 함수와 데이터 구조를 클래스로 배치하는 방법, 그리고 이들 클래스를 서로 결합하는 방법을 설명해준다.SOLID 원칙의 목적은 중간 수준(모듈 수준)의 소프트웨어 구조가 아래와 같도록 만드는 데 있다. 변경에 유연하다. 이해하기 쉽다. 많은 소프트웨어 시스템에 사용될 수 있는 컴포넌트 기반이 된다.(재사용성) -SRP: 단일 책임의 원칙. Single Responsibility Principle 각 소프트웨어 모듈은 변경의 이유가 하나, 단 하나여야만 한다. -OCP : 개발, 폐쇄 원칙. Open Closed Principle 기존 코드를 수정하기보다는 반드시 새로운 코드를 추가하는 방식으로 시스템의 행위를 변경.. 2020. 4. 11.
[책 정리] 6장. 함수형 프로그래밍 - Clean Architecture 정수를 제곱하기 -함수형 언어에서 변수는 변경되지 않는다. 불변성과 아키텍처 -경합 조건(race condition), 교착 상태(dealock) 조건, 동시 업데이트(concurrent update) 문제가 모두 가변 변수로 인해 발생한다.우리가 동시성 앱에서 마주치는 모든 문제, 즉 다수의 스레드와 프로세스를 사용하는 앱에서 마주치는 모든 문제는 가변 변수가 없다면 절대로 생기지 않는다. -아키텍트라면 동시성(concurrency)문제에 지대한 관심을 가져야만 한다.우리는 스레드와 프로세스가 여러 개인 상황에서도 설계한 시스템이 여전히 강건하기를 바란다. 가변성의 분리 -불변성과 관련하여 가장 주요한 타협 중 하나는 앱 또는 앱 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일이다.상태 변.. 2020. 4. 10.