클린 아키텍처 1 ~ 4장

최준혁·2023년 11월 26일
0

1장: 설계와 아키텍처란

  • 설계: 저수준의 구조, 결정사항을 의미
  • 아키텍처: 저수준의 세부사항과는 분리된 고수준의 무언가를 가리킴
  • 이를 구분하는 것은 경계가 불분명하고 의미가 없다.
  • 소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는데 투입되는 인력을 최소화 하는 것
  • 비용은 최소화하고 생산성은 최대화 할 수 있는 설계와 아키텍처를 만들자!
  • 빨리 가는 유일한 방법은 제대로 가는 것이다.
  • 잘못된 설계와 아키텍처가 얼마나 많은 비용손실을 가져오는지 사례를 보여줬다.
    • 한 회사의 엔지니어들은 늘어나는데 생산성은 낮아지고, 끝내 코드 당 비용도 늘어난다.
    • 결국 이러한 비용 곡선은 사업 모델의 수익을 엄청나게 고갈 시키며, 회사의 성장을 멈추게 한다.

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

  • 행위와 아키텍처 : 모든 소프트웨어 시스템은 이해관계자에게 행위/구조 두 가지 가치를 제공
  • 변경사항을 적용하는데 드는 어려움은 변경되는 범위에 비례해야 하며, 변경사항의 형태와는 관련이 없어야 한다.
  • 더 높은 가치
    • 동작하지만 수정이 아예 불가능한 소프트웨어 VS 동작하지 않지만 쉽게 변경 가능한 소프트웨어
    • 동작 여부가 미래의 유연성보다 더 중요하다. 하지만, 변경이 불가능한 상태에 처할 때 까지 방치해서도 안된다
  • 아이젠하워 매트릭스 4가지 분류
    • 진짜로 긴급하지만 중요하지 않은 기능과 긴급하지 않지만 중요한 기능을 구분하지 못한다.
    • 우리는 가끔 중요한 일을 방치하고 긴급한 일 먼저 하려고 한다.
    • 중요한 일을 먼저 하자고 설득하는 것도 개발팀의 책임이다.
  • 기능을 개발하기 쉽고, 간편하게 수정가능하며, 확장하기 쉬운 아키텍처를 만들어야 한다.
  • 회사에서 각 팀팀은 팀이 가장 중요하다고 스스로 믿는 가치를 위해 투쟁한다.
  • 개발팀도 좋은 소프트웨어/아키텍처를 위해 싸우고 투쟁해야 한다. ㅎㅎㅎ

3장: 패러다임 개요

  • 구조적 프로그래밍
    • 1968년 에츠허르 비버 데이크스트라(Edsger Wybe Dijkstra)가 발견한 패러다임
    • 데이크스트라는 무분별한 점프(goto 문장)는 프로글매 구조에 해롭다는 사실을 제시
    • 이러한 점프들을 if/then/else와 do/while/until 과 같이 더 익숙한 구조로 대체함
    • 결론: 구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
  • 객체지향 프로그래밍
    • 1966년 요한 달(Ole Johan Dahl)과 크리스텐 니가드(Kristen Nygaard)에 의해 등장한 패러다임
    • 두 프로그래머는 알골(ALGOL) 언어의 함수 호출 스택 프레임(stack frame)을 힙(heap)으로 옮기면, 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오랫동안 유지됨을 발견
      • 바로 이러한 함수가 클래스의 생성자가 되고
      • 지역 변수는 인스턴스 변수
      • 중첩 함수는 메서드가 됨.
      • 그리고 함수 포인터를 특정 규칙에 따라 사용하는 과정을 통해 필연적으로 다형성이 등장함
    • 결론: 객체지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
  • 함수형 프로그래밍
    • 람다 계산법에 직접적인 영향을 받아 만들어진 패러다임
    • LISP 언어의 근간이 되는 개념이 바로 이 람다 계산법.
    • 람다 계산법의 기초가 되는 개념은 불변성
      • 심볼(symbol)의 값이 변경되지 않는 개념으로
      • 이는 함수형에 할당문이 전혀 없다는 뜻이기도 함
      • 대부분의 함수형 언어가 변수 값을 변경할 수 있는 방법을 제공하기는 하지만, 굉장히 까다로운 조건 아래에서만 가능
    • 결론: 함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.
  • 패러다임은 기본적으로 추가가 아니라 제한하는 것
    - 구조적 => goto문
    - 객체 지향 => 함수 포인터
    - 함수형 => 할당문
    - 패러다임은 위 3개가 전부이며 기본적으로 1950 ~ 1960연대와 지금과 전혀 다를게 없다.

4장: 구조적 프로그래밍

  • 네덜란드 출신 데이크스트라
  • 순차, 분기, 반복 세가지 구조 만으로 프로그램을 표현할 수 있다 라는 사실을 증명함 → 구조적 프로그래밍 탄생
  • 기능적분해
    • goto문이 아닌 순차, 분기, 반복의 제한적 흐름제어자로의 한정을 통해 저수준 모듈로의 분리가 가능해짐.
    • 때문에 divide and conquire로 모듈, 컴포넌트 세분화 가능해지니까 programming language도 유클리드 계층구조를 구축함으로서 수학과 같이 논리적 엄밀성을 가질 수 있을 것으로 기대했다.
  • 구조적 프로그래밍은 프로그램을 증명가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강조한다.
  • 구조적 프로그래밍이 가치 있는 이유는 프로그램에서 반증 가능한 단위를 만들어 내는 능력에 있다.
    - 아키텍트는 모듈, 컴포넌트, 서비스가 반증 가능하도록 테스트하기 쉽도록 만들기 위해 노력해야한다.
    - 이를 위해 구조적 프로그래밍과 유사한 제한적인 규칙들을 받아들여 활용해야 한다.
  • 다음장에서 제한적인 규칙들이 나온다.
profile
I LOVE MONDAY

0개의 댓글