본문 바로가기

책/클린 아키텍쳐 (완)

2부 벽돌부터 시작하기: 프로그래밍 패러다임

3장 패러다임 개요

구조적 프로그래밍

구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.

 

객체 지향 프로그래밍

객체 지향 프로그래밍느 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.

 

함수형 프로그래밍

함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.

 

5장 객체 지향 프로그래밍

  • 좋은 아키텍처를 만드는 일은 객체 지향 oo 설계 원칙을 이해하고 응용하는데서 출발한다.
  • oo의 본질을 설명하기 위해 세 가지 주문에 기대는 부류도 있는데, 캡슐화, 상속, 다형성이 바로 그 주문이다.

캡슐화?

이 때문(기존의 C언어에서도 완벽한 캡슐화가 가능했다.)에 OO가 강력한 캡슐화에 의존한다는 정의는 받아들이기 힘들다. 실제로 많은 OO언어가 캡슐화를 거의 강제하지 않는다.

 

상속?

따라서 OO 언어가 완전히 새로운 개념을 만들지는 못했지만, 데이터 구조에 가면을 씌우는 일(상속)을 상당히 편리한 방식으로 제공했다고 볼 수는 있다.

 

다형성?

  • OO 언어는 다형성을 제공하지는 못했지만 다형성을 좀 더 안전하고 더욱 편리하게 사용할수 있게 해준다.
  • OO 언어는 이러한 관례를 없애주며, 따라서 실수할 위험이 없다. OO언어를 사용하면 다형성은 대수롭지 않은 일이 된다.

다형성이 가진 힘

당시 우리는 장치에 의존적인 수많은 프로그램을 만들고 나서야, 이들 프로그램이 다른 장치에서도 동일하게 동작할 수 있도록 만드는 것이 우리가 진정 바랐던 일임을 깨달았다.

 

의존성 역전

  • 소스 코드 의존성(상속 관계)이 제어흐름과는 반대인 점을 주목하자. 이는 의존성 역전이라고 부르며, 소프트웨어 아키텍트 관점에서 이러한 현상은 심오한 의미를 갖는다.
  • OO 언어가 다형성을 안전하고 편리하게 제공한다는 사실은 소스 코드 의존성을 어디에서든 역전시킬 수 있다는 뜻이기도 하다.
  • 즉, 소스 코드 의존성이 제어 흐름의 방향과 일치되도록 제한되지 않는다.
  • 다시 말해 특정 컴포넌트의 소스 코드가 변경되면, 해당 코드가 포함된 컴포넌트만 다시 배포하면 된다. 이것이 바로 배포 독립성이다.
  • 시스템의 모듈을 독립적으로 배포할 수 있게 되면, 서로 다른 팀에서 각 모듈을 독립적으로 개발할 수 있다. 그리고 이것이 개발 독립성이다.
  • OO란 다형성을 이용하여 전체 시스템의 모든 소스 코드 의존성에 대한 절대적인 제어 권한을 획득할 수 있는 능력이다.

6장 함수형 프로그래밍

정수를 제곱하기

함수형 언어에서 변수는 변경되지 않는다.

 

불변성과 아키텍쳐

경합조건(race condition), 교착상태(deadlock), 동시 업데이트(concurrent update) 문제가 모두 가변 변수로 인해 발생하기 때문이다.

 

가변성의 분리

  • 불변성과 관련하여 가장 주요한 타협 중 하나는 애플리케이션, 또는 애플리케이션 내부의 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일이다.
  • 말하려는 요지는, 애플리케이션을 제대로 구조화하려면 변수를 변경하는 컴포넌트와 변경하지 않는 컴포넌트를 분리해야 한다는 것이다. 그리고 이렇게 분리하려면 가변 변수들을 보호하는 적절한 수단을 동원해 뒷받침해야 한다.

이벤트 소싱

  • 이벤트 소싱에 깔려 있는 기본 발상이 바로 이것이다. 이벤트 소싱은 상태가 아닌 트랜잭션을 저장하자는 전략이다.
  • 더 중요한 점은 데이터 저장소에서 삭제되거나 변경되는 것이 하나도 없다는 사실이다. 결과적으로 애플리케이션은 CRUD가 아니라 그저 CR만 수행한다. 또한 데이터 저장소에서 변경과 삭제가 전혀 발생하지 않으므로 동시 업데이트 문제 또한 일어나지 않는다.

결론

소프트웨어, 즉 컴퓨터 프로그램은 순차, 분기, 반복, 참조로 구성된다. 그 이상도 이하도 아니다.

' > 클린 아키텍쳐 (완)' 카테고리의 다른 글

6부 세부사항  (0) 2024.05.31
5부 아키텍처  (0) 2024.05.02
4부 컴포넌트 원칙  (0) 2024.04.30
3부 설계원칙  (1) 2024.04.27
1부 소개  (0) 2024.04.01