아키텍처는 시스템을 구체화하는 중요한 설계 결정을 표현하며, 그 결정의 중요도는 변경에 드는 비용으로 측정 - 그레디 부치
아키텍처란 프로젝트 초기에 제대로 정할 수 있기를 바라는 결정사항이지만, 제대로 정할 가능성이 그 외 사항들보다 반드시 더 높지는 않다 - 랄프 존슨
프로그램을 동작하도록 만드는 것과 제대로 만드는 것은 전혀 다르다.
1장. 설계와 아키텍처란?
"아키텍처"는 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킬 때 흔히 사용되고 "설계"는 저수준의 구조 또는 결정사항 등을 의미할 때가 많으나 아키텍트가 실제로 하는 일을 살펴보면 이런 구분은 무의미.
목표 : 필요한 시스템을 만들고 유지보수하는데 투입되는 인력을 최소화하는데 있다.
빨리 가는 유일한 방법은 제대로 가는 것.
좋은 S/W 아키텍처가 무엇인지 이해해야 하고, 비용 최소화 & 생산성 최대화할 수 있는 설계와 아키텍처를 가진 시스템을 만들려면 시스템 아키텍처가 지닌 속성을 알고 있어야.
2장. 두 가지 가치에 대한 이야기
1. 행위 --이해관계자가 기능 명세서나 요구사항 문서를 구체화할 수 있도록 돕고 이해관계자의 기계가 이런 요구사항을 만족하도록 코드 작성
2. 아키텍처 : soft + ware. "물건. ware"의 변경이 쉬워야 한다 (soft)
아이젠하워 매트릭스 - 중요함 & 긴급함 기준의 4가지 사항
- 긴급 O & 중요 O
- 긴급 X & 중요 O
- 긴급 O & 중요 X
- 긴급 X & 중요 X
3장. 패러다임 개요
구조적 프로그래밍
- 제어흐름의 직접적인 전환에 대해 규칙 부과
객체 지향 프로그래밍
- 제어흐름의 간접적인 전환에 대해 규칙을 부과
함수형 프로그래밍
- 할당문에 대해 규칙을 부과한다
4장. 구조적 프로그래밍
- goto 가 모듈을 더 작은 단위로 분해하는 과정에 방해가 되는 경우가 있다. 모듈을 분리할 수 없다면 분할 정복 접근법을 사용할 수 없게 된다.
- 결국 if, then, else , do , while 같은 분기, 반복 제어구조를 사용하며 모듈을 재귀적으로 세분화가 가능.
- 이런 제어구조는 순차적인 실행과 결합 시 특별하다.
- 모듈을 증명 가능한 더 작은 단위로 나눠 개발할 수 있다.
5장 객체 지향 프로그래밍
- 데이터와 함수의 조합
- 캡슐화 : 데이터 은닉, 일부 함수만이 외부에 노출. private, public + protected 등
- 상속 : 단순히 어떤 변수, 함수를 하나의 유효범위로 묶어서 재정의하는 일에 불과.
- 다형성
- 다형성을 이용해 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어권한 획득
- 아키텍트는 플러그인 아키텍처 구성할 수 있고, 고수준의 정책을 포함하는 모듈은 저수준의 세부사항을 포함하는 모듈에 대해 독립성보장.
6장 함수형 프로그래밍
언어 비교 (자바 vs 클로저)
for (int i=0; i<25; i++)
System.out.println (i * i);
(println (take 25 (map (fn [x] (* x x)) (range)))) =>
(println ; 출력.
(take 25 ; 처음부터 25까지
(map (fn [x] (* x x)) ; 제곱을
(range)))) ; 정수의
println, take, map, range 모듀 함수
- 자바의 경우, 가변변수를 사용하는데, 프로그램 실행 중 상태가 변할 수 있다. ex) i
- 클로저에선 x 같은 변수가 한 번 초기화되면 절대로 변하지 않는다. => 함수형 언어에서 변수는 변경되지 않는다.
- 경합, 교착, 동시 업데이트 문제가 모두 가변변수로 인해 발생. (동시성. concurrent 문제 관련)
- 이벤트 소싱? 데이터 상태를 변경하거나 저장하는 대신, 시스템의 상태 변화가 발생한 모든 이벤트를 기록하고 이를 통해 현재 상태를 재구성하는 패턴을 의미.
- 불변성(Immutability):
- 함수형 언어는 데이터 변경을 지양하고 불변 데이터를 사용한다. 이벤트 소싱은 상태를 "변경"하는 대신 새로운 이벤트를 추가하는 방식으로 설계되므로, 불변성과 철학적으로 일치합
- 상태는 항상 "기록된 이벤트들의 축적 결과"로 표현된다.
- 순수 함수(Pure Functions):
- 이벤트를 기반으로 현재 상태를 계산하는 로직이 순수 함수로 작성될 수 있다.
- 이벤트 리스트를 입력으로 받아 현재 상태를 출력하는 방식으로 구현된다.
- 시간에 따른 상태 재구성(Time-Travel Debugging):
- 이벤트 소싱은 시간 축을 따라 상태를 재구성하거나 특정 시점으로 되돌릴 수 있으며. 함수형 언어에서는 이를 순수 함수와 불변 데이터 구조를 활용해 자연스럽게 구현할 수 있습니다.
컴퓨터 프로그래밍은 순차, 분기, 반복, 참조로 구성된다.
'프로그래밍&IT > 학습, 책' 카테고리의 다른 글
[클린 코드] 7. 동시성, 개선, 휴리스틱 (0) | 2025.01.19 |
---|---|
[클린 코드] 6. 창발성 (0) | 2025.01.15 |
[클린 코드] 5. 시스템 (0) | 2025.01.13 |
[클린 코드] 5. 오류처리, 경계, 단위테스트 (0) | 2025.01.12 |
[클린 코드] 4. 객체와 자료구조 (0) | 2025.01.09 |