본문 바로가기

전체 글

4부 컴포넌트 원칙 - 컴포넌트 컴포넌트란? 컴포넌트는 시스템의 구성요소로 배포할 수 있는 가장 작은 단위 ex) 자바의 경우 jar파일이 하나의 컴포넌트가 될 수 있다. 예를 들어 마인크래프트의 모드 같은경우 jar파일을 이용하여 플러그인(모드 변경) 할 수 있다. 이때 이 jar하나는 마인크래프트라는 시스템의 구성요소로 적용 할 수 있으며 하나의 기능을 온전히 수행하는 작은 단위가 된다. 이 책에서의 컴포넌트 런타임에 플러그인 형태로 결합할 수 있는 동적 링크 파일 Why? 1) 컴포넌트의 역사 소프트웨어 초창기에는 메모리에서 프로그램 위치와 레이아웃을 프로그래머가 직정 제어했다. 또한 라이브러리 함수를 하나의 애플리케이션 코드에 포함시켜 컴파일 했다. 문제 컴파일 후 프로그램의 위치가 한번 결정되면 재배치 불가능 함수 라이브러리가.. 더보기
3부 설계원칙-DIP DIP란? 상위 레벨의 로직은 저수준의 로직에 절대 의존해서는 안된다. 대신 저수준의 로직이 고수준에 의존해야 한다. DIP의 사용 이유 변경으로 부터 보호 위 그림은 절차적 프로그래밍의 런타임 플로우와 소스코드의 의존성을 표현한 그림이다. 소스코드의 의존성과 런타임 플로우가 같은 방향으로 내려같은 것이 같다. 위 그림과 같다면 LL1의 변경은 ML1의 변경으로 이어지고 또 HL1그리고 마지막으로 Main의 변경으로 이어질 것이다. 이는 상위 로직이 하위 로직에 의존하기 때문이다. 위 그림과 같이 DIP를 적용하면 ML1하위에서의 변경 사항은 HL1에 영향을 주지 않는다. 이처럼 DIP를 사용하면 변경 사항으로 부터 보호 할 수 있다. 즉 상위 정책은 저수준의 세부 로직에 의존하지 않기 때문에 생기는 이.. 더보기
3부 설계원칙-ISP ISP란? 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.(사용하지 않는 메서드를 인터페이스로 분리 하는 원칙) ISP와 언어 정적 언어 타입(컴파일 언어) 사용자가 import, use, 또는 include와 같은 타입 선언문을 사용하도록 강제한다. 선엄문으로 인한 의존성때문에 변경이 발성시 재컴파일 재배포가 필요하다. 동적 언어 타입(인터프리터 언어) 선언문이 존재하지 않는다. 대신 런타임에 추론이 발생한다. 코드에 의존성이 존재하지 않기에, 재컴파일과 재배포가 필요 없다. 동적 타입 언어를 사용하면 정적 타입 언어를 사용할 때보다 유연하며 결합도가 낮은 시스템을 만들 수 있다. 위와 같이 ISP는 언어에 따라 영향도가 다르다. 문제 위 그림에서 User1, User2,U.. 더보기
3부 설계원칙-LSP LSP란? S타입의 객체 o1 T타입 객체 o2가 있고, T타입을 사용하는 프로그램 P에서 o2자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면 S는 T의 하위 타입니다. 위 코드에서 P의 o2.print는 어떤 타입(클래스)에 의존해서 행위를 진행하지 않는다. 즉 LSP란 치환하더라도 어떠한 특정 타입에 의존하지 않고 기대 된 기능을 실행해야 한다는 의미이다. LSP 사용가이드 사용가이드는 매우 간단하다. 위 구조처럼 인터페이스(인터페이스일 필요는 없다)를 사용하고 그를 상속 받는 하위 타입을 두고 사용하면 된다. 위 코드에서는 Billing 애플리케이션의 행위는 License라는 인터페이스에만 의존하지 하위타입 중 무엇을 사용하는지 의존하지 않기때문에 어떤 클래스든 치환이 가능하다. LSP위반시.. 더보기
3부 설계원칙-OCP OCP란? 소프트웨어 개체는 확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다. 확장에 열려있다? 확장에 열려있다는 뜻은 변경 사항이 발생 했을 때 새로운 타입을 추가함으로써 큰 변경 없이 새로운 기능을 추가하거나 변경할 수 있어야한다. 변경에 닫혀있다? 변경에 닫혀 있다는 뜻은" 객체를 직접적으로 수정하는 것을 제한해야한다." 좀 더 아키텍처의 관점에서의 뜻은 로우레벨의 변경사항으로 인해 하이레벨의 어플리케이션(규칙)등이 변경되서는 안된다. 예제 사진 1를 보면 copy가 키보드의 입력과 printer의 출력을 의존하고 있음을 볼수 있다. 그림 2 코드에서 요구사항이 들어 왔을 시 그림 3 처럼 if문에 펀처에서 읽었는지 키보드에서 읽었는지에 대한 코드를 Copy라는 클래스 자체를 수정해야 한다... 더보기
3부 설계원칙-SRP SRP(Single Responsibility Principle,단일 책임의 원칙) SRP란? 클래스는 하나의 책임을 가져야 한다. 책임 이란? SRP에서 하나의 책임이라는 것 단 하나의 일만 해야 한다는 뜻이 아니다. (하나의 일만해야한다는 원칙은 따로 있다. 함수는 반드시 하나의 일만 해야한다는 원칙이다.) SRP에서 하나의 책임이라는 것은 "변경의 이유가 하나, 오직 하나 뿐이여야 한다." 라는 뜻이다. 여기서 "변경 이유"는 변경을 요청하는 사람들을 가르킨다. 이러한 집단을 엑터라고 한다. 다시 정의 하면 SRP 는 "오직 하나의 액터에 대해서만 변경이 되어야 한다." SRP 위반시 문제 Collision 예제 요구사항: Policy Actors: business rule의 변경을 필요로 함 Ar.. 더보기
2부 패러다임 패러다임 패러다임이란? 패러다임은 프로그래밍을 하는 방법이다. 패러다임은 부정적인 의도를 가지는 일종의 추가적인 규칙을 부여한 것이다. 패러다임의 종류 구조적 프로그래밍 객체지향 프로그래밍 함수형 프로그래밍 구조적 프로그래밍(절차적 프로그래밍) 구조적 프로그래밍이란? 제어흐름의 직접적인 전환에 대한 규칙을 부여한다. 에츠허르 비버 데이크스트라 데이크스트라가 해결하고자 하는 문제가 있었음. 프로그래밍에 체계가 없기 때문에 프로그래밍을 하더라도 믿을 수 있는 결과를 내놓기 어려움. 수학적 증명을 통해 이 문제를 해결하고자 하였음. 수학적 증명은 실패 소프트웨어가 과학적 방법으로써 대상이 될 수 있는 상황을 마련. goto문장 데이크스트라는 goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방.. 더보기
1부 소개 행위란? 요구사항에 만족하는 코드를 작성하는 것(기능구현) 요구사항 위반시 디버그를 열고 문제를 해결하는 것(디버깅) 구조(아키텍처)란? 소프트웨어를 '부드럽게'만드는것 즉 변경사항에 대응하기 쉽도록 구성하는 것(유연성) 책의 저자는 변경사항의 어려움은 범위에 비례해야지 형태와 관련이 된면 안된다고 한다.(개인적인 해석으로는 시스템의 형태(구조)가 특정 형태에 종속적일수록 변경이 어렵기 때문에 그런것 같다.) 구조(아키텍처)의 목표 소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있다. 행위(기능) vs 구조(아키텍처) 결과적으로는 구조가 행위보다 더 높은가치(중요도)를 가진다. 그렇다고 구조만이 높은 가치가 있는것은 아니다 개발자에게 위 두가지는 둘다 .. 더보기