클린 아키텍처 1장 - 3장

nyongho·2022년 7월 6일
0
post-thumbnail

1부

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

일반적으로 설계는 저수준, 아키텍처는 고수준의 구조나 결정사항을 가리킬 때 쓰이는 용어이다. 그러나 설계와 아키텍처 사이에는 근본적인 차이가 없다.고수준에서 저수준으로 향하는 의사결정이 연속적으로 이루어진다고 보는 것이 맞다.

소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있다.

즉, 비용은 최소화, 생산성은 최대화 하는것. 이 사항을 만족할 수 있다면 좋은 설계라고 볼 수 있다.

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

소프트웨어 개발자의 두 가지 책임: 행위(behavior)와 구조(structure)

행위(behavior): 요구사항을 버그 없이 구현하는 것. (프로그램을 동작하게 만드는 것)
구조(structure): 시스템의 아키텍처를 유연하게 만들기. (프로그램을 유지보수하기 쉽게 설계하는 것)

둘 중 더 높은 가치는 무엇인가?

업무 관리자에게 묻는다면 '행위'가 우선이라고 말할 것이지만 이 책에서는 '구조'를 우선시해야 한다고 주장한다.

  • 완벽하게 동작하지만 수정이 불가능한 프로그램을 내게 준다면, 이 프로그램은 요구사항이 변경될 때 동작하지 않게 되고, 결국 프로그램이 돌아가도록 만들 수 없다. 따라서 이러한 프로그램은 앞으로는 거의 쓸모가 없다.

  • 동작은 하지 않지만 변경이 쉬운 프로그램을 내게 준다면, 나는 프로그램이 돌아가도록 만들 수 있고, 변경사항이 발생하더라도 여전히 동작하도록 유지보수할 수 있다. 따라서 이러한 프로그램은 앞으로도 계속 유용한 채로 남는다.

    기능을 급하게 개발하는 것보다 유연한 구조를 설계하는 것이 중요하다고 관리자를 설득하는 것은 개발자의 역할이며 책임이다.

2부

2-1. 패러다임의 개요

프로그래밍 패러다임은 사전적인 의미로 프로그래밍에 대한 이론적인 틀이나 체계를 뜻한다. 이를 간단하게 말하면 프로그래밍을 하는 방법이라고 할 수 있다. 언제, 어디에 이 구조를 사용할지 결정하며, 따라서 대체로 각 언어에 독립적이다.

2-2. 구조적 프로그래밍

GOTO란 프로그래밍에서 어느 특정 줄 번호나 레이블로 건너뛰거나 돌아갈 때 쓰는 명령이다. 순간이동 같은 개념이라고 보면 된다.

  1. GOTO 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는 사실을 발견함
    (증명을 시도하는 과정에서 아무런 원칙없이 마음대로 제어 흐름을 바꿔버림)

  2. GOTO 문장의 좋은 사용 방식은 if, then, else 등의 분기와 반복의 경우이다

뵘, 야코피니는 모든 프로그램을 순차, 분기, 반복 세 가지 구조만으로 표현할 수 있다는 사실을 증명함 (수학적 접근)

수학: 일단 증명만 된다면 객관적이고 영원불변한 진리로 거듭
과학: 수많은 실험과 관찰(반증 가능성)을 통해 그것이 옳음이 밝혀졌지만 이 또한 '현재로써 옳게 인식되는 이론'일 뿐 불변의 진리가 되지는 않음

과학은 근본적으로 이론과 법칙을 절대적으로 증명할 수 없다. 과학적 방법은 반증은 가능하지만 증명을 불가능하다.
과학은 서술된 내용이 사실임을 증명하는 방식이 아니라, 서술이 틀렸음을 증명하는 방식으로 동작한다.

테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수 없다.

이렇듯 소프트웨어 개발은 수학적인 구조를 다루는 듯 보이더라도, 수학 보다는 오히려 과학과 가깝다.

일정 수준 이상의 버그가 존재하지 않는 프로그램임은 입증할 수 있다.
어디까지나 본질은 입증하는 것이기 때문에 프로그램은 입증을 위한 최소 조건인 순차, 분기, 반복 의 구조를 벗어날 수 없다.

결국 구조적 프로그래밍 위에서 가능하다는 의미이다.

2-3. 객체 지향 프로그래밍

프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식.

추상화 - 공통의 속성이나 기능을 묶어 이름을 붙이는 것

캡슐화 - 객체의 특정 프로퍼티에 직접 접근하지 못하도록 막는 것을 의미

상속 - 상위 개념의 특징을 하위 개념이 물려받는 것

다형성 - 부모클레스에서 물려받은 가상 함수를 자식 클래스 내에서 오버라이딩 되어 사용되는 것

2-4. 함수형 프로그래밍

함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

부수 효과(Side Effect)를 제거할 경우 프로그램의 동작을 이해하고 예측하기 쉬워지기 때문에 부수 효과가 없는 순수 함수들로만 작성되는 방법.

중요 키워드 - 순수함수, 불변성

결론

  • 구조적 프로그래밍: 구조적으로 설계하고 절차적으로 실행되게끔 하여 안전하게 만듦
  • 객체지향 프로그래밍: 추상화와 다형성을 통해 의존성을 약화시킴으로써 안전하게 만듦
  • 함수형 프로그래밍: 불변성을 통해 부작용을 줄이고 안전하게 만듦
profile
두 줄 소개

0개의 댓글