본문 바로가기

프로그래밍&IT/학습, 책

[클린 아키텍처] 1) 설계와 아키텍처, 개발 패러다임 (구조적, 객체지향, 함수형)

아키텍처는 시스템을 구체화하는 중요한 설계 결정을 표현하며, 결정의 중요도는 변경에 드는 비용으로 측정 - 그레디 부치

아키텍처란 프로젝트 초기에 제대로 정할 수 있기를 바라는 결정사항이지만, 제대로 정할 가능성이 그 외 사항들보다 반드시 더 높지는 않다 - 랄프 존슨

 

프로그램을 동작하도록 만드는 것과 제대로 만드는 것은 전혀 다르다.

 

1장. 설계와 아키텍처란?

"아키텍처"는 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킬 때 흔히 사용되고 "설계"는 저수준의 구조 또는 결정사항 등을 의미할 때가 많으나 아키텍트가 실제로 하는 일을 살펴보면 이런 구분은 무의미.

목표 : 필요한 시스템을 만들고 유지보수하는데 투입되는 인력을 최소화하는데 있다.

빨리 가는 유일한 방법은 제대로 가는 것.

 

좋은 S/W 아키텍처가 무엇인지 이해해야 하고, 비용 최소화 & 생산성 최대화할 수 있는 설계와 아키텍처를 가진 시스템을 만들려면 시스템 아키텍처가 지닌 속성을 알고 있어야.

 

2장. 두 가지 가치에 대한 이야기

1. 행위 --이해관계자가 기능 명세서나 요구사항 문서를 구체화할 수 있도록 돕고 이해관계자의 기계가 이런 요구사항을 만족하도록 코드 작성

2. 아키텍처 : soft + ware. "물건. ware"의 변경이 쉬워야 한다 (soft)

 

아이젠하워 매트릭스 - 중요함 & 긴급함 기준의 4가지 사항

  1. 긴급 O & 중요 O
  2. 긴급 X & 중요 O
  3. 긴급 O & 중요 X
  4. 긴급 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):
    • 이벤트 소싱은 시간 축을 따라 상태를 재구성하거나 특정 시점으로 되돌릴 수 있으며. 함수형 언어에서는 이를 순수 함수와 불변 데이터 구조를 활용해 자연스럽게 구현할 수 있습니다.

 


컴퓨터 프로그래밍은 순차, 분기, 반복, 참조로 구성된다.