패러다임
아키텍처 경계를 넘나들기 위한 매커니즘으로 다형성을 이용하는 객체지향을, 데이터 위치와 접근 방법에 규칙을 부과할 때는 함수형을 그리고 모듈 기반 알고리즘으로 구조적 프로그래밍을 사용합니다.
위 세 가지 패러다임과 아키텍처의 세가지 큰 관심사인(함수, 컴포넌트 분리, 데이터 관리)가 어떻게 되는지 알아보기 위해 위에서 언급된 세가지 프로그램이 방식을 살펴보겠습니다.
구조적 프로그래밍
(절차형 프로그램이라고도 불리는) 구조적 프로그래밍은 프로그램이 실행될 때 위에서 아래 방향으로 진행되도록 절차와 순서를 갖는 패러다임입니다. 이를 위해 순차, 선택, 반복의 구조를 반복해가며 코드를 진행하는데,
- 순차: 코드를 순서대로 진행
- 선택: 조건문, 선택문(if, switch~case)
- 반복: 반복문(for, while, do~while)
과거 goto문과 같은 흐름을 어지럽히는 흐름제어가 없어져 코드 가독성을 높혀주고, 기능을 모듈화 시킴으로써 유지보수성을 높히고 코드의 의미 파악을 쉽게하고 재사용성을 높혀줍니다. 아키텍처 관점으로 대규모 시스템을 모듈과 컴포넌트로 나눌 수 있고 더 나아가 아주 작은 기능들로 세분화 할 수 있습니다. 이런 특징을 이용하여 모듈, 컴포넌트, 서비스가 쉽게 테스트 할 수 있도록 제공해야 합니다.
객체지향 프로그래밍
캡슐화와 상속 또한 객체지향하면 원래는 빠지지 않고 나오는 이야기지만 실제로 객체지향이 아니더라도 구현이 가능한 반면 다형성은 완벽히 객체지향의 꽃입니다. 특정 기능의 선언 부분과 구현 부분을 분리하여 다양한 방법으로 사용할 수 있게 만들어주고 구체화 부분이 아닌 추상화 계층을 의존하여 의존성을 역전 시켜(DI) 소스코드의 의존성을 어디서든 역전시킬 수 있어 호출하는 방향이나 호출 당하는 방향 어느 쪽으로든 의존성의 방향에 대한 절대적인 권한을 갖게 할 수 있습니다. 이러한 특징을 이용하여 만약 UI, Business Logic, DB가 있다면 DB와 UI가 Business Logic에 의존하게 만들어 각자 분리된 컴포넌트로 배포할 수 있게 구성할 수 있습니다.
그래서 OO를 사용한 아키텍트는 플러그인 아키텍처를 구성할 수 있고 고수준 모듈은 저수준 모듈에 대한 독립성을 보장할 수 있는 장점이 있습니다.
함수형 프로그래밍
함수형 프로그래밍은 순수 함수 그리고 데이터가 변하지 않는 불변성을 갖도록 하는 패러다임인데 아키텍처를 설계 할 때 불변성은 중요합니다. 경합 조건, 교착상태 조건, 동시 업데이트 모두 가변 변수로 발생하기 때문입니다. 그말은 즉 복잡한 동시성 문제에 있어 자유로울 수 있다는 말입니다. 함수형 방식으로 작업된 많은 불변 컴포넌트들이 하나의 가변 컴포넌트와 통신하고, 그 가변 컴포넌트와 트랜잭션 메모리가 통신하는 방법이 예입니다.
함수형에서는 트랜잭션에 관한 처리를 상태가 아닌 트랜잭션 자체를 저장하는데서 아이디어를 얻었지만 너무 큰 공간이 요구되어 이벤트 소싱이라는 방법을 이용하는데, 상태가 필요할 때만 단순히 상태의 시작점 부터 모든 트랜잭션을 처리하는 방법입니다. 이 전략은 데이터에 변경과 삭제가 일어나지 않는 CR만 있어 동시성 문제도 발생하지 않습니다.
제어 흐름의 직접적인 전환에 규율을 가하는 구조적 프로그래밍, 간접적인 전환에 규율을 가하는 객체 지향 프로그래밍, 변수 할당에 규율을 가하는 함수형 프로그래밍 모두 프로그래머의 권한을 가져가고 능력을 보태주진 않습니다. 더 이상 가져갈 권한이 없기에 프로그래밍의 패러다임은 과거부터 현재까지 위 세 가지가 전부이고 앞으로도 그럴것입니다.
'software engineering' 카테고리의 다른 글
Clean Architecture - 아키텍처, 독립성, 경계, 정책과 수준 (0) | 2023.07.30 |
---|---|
클린 아키텍처 - 컴포넌트 (0) | 2023.07.26 |
클린아키텍처 - 설계원칙 (0) | 2023.07.16 |
클린 아키텍처 소개 (0) | 2023.07.10 |
클린 아키텍처, 소프트웨어 구조와 설계의 원칙 (0) | 2023.07.09 |