IT/architecture

[Clean Architecture 정리] 15장. 아키텍처

lakedata 2025. 2. 14. 22:21

15장 아키텍처란?

아키텍처

• 시스템을 구축하는 사람들이 만들어낸 시스템 형태
• 컴포넌트 분활, 컴포넌트 배치, 컴포넌트 의사소통 방식에 따라 정해진다.
• 아키텍처 주된 목적: 시스템 생명주기 지원(개발, 배포, 운영, 유지보수)
• 동작(운영) 보다 배포, 유지보수, 계속되는 개발 과정에서 어려움을 겪는다.

소프트웨어 아키텍트

• 프로그래머(발생하는 문제를 경험해보지 않으면 다른 프로그래머를 지원하는 작업을 제대로 수행할 수 없다) + 팀원들의 생산성을 극대화할 수 있는 설계

개발

시스템 아키텍처는 개발팀이 시스템을 쉽게 개발할 수 있는 구조여야 한다. (수명↑ 건강 ↑)

팀 구조가 다르다면 아키텍처 관련 결정에도 차이
팀 구조가 작을 때 : 개발자 다섯명이, 모노리틱 시스템
팀 구조가 클 때 : 일곱 명씩 구성된 총 다섯 팀 팀별, 단일 컴포넌트
*모노리틱( monolitic ) 프로그램(통짜 구조) :단일 코드 트리 구조의 프로그램, 컴포넌트 단위로 분리되지 않고 여러 기능이 하나로 결합된 형태

배포

소프트웨어 시스템이 사용될 수 있으려면 반드시 배포할 수 있어야 한다.
• 배포 비용이 높을수록 시스템의 유용성은 떨어진다.
• 소프트웨어 아키텍처는 시스템을 단 한 번에 쉽게 배포할 수 있도록 만드는 데 목표를 두어야 한다.
예를 들어, 개발 초기 단계에 ‘MSA(Micro-service Architecture) 마이크로서비스 아키텍처’ 사용 결정
인터페이스 대체로 안정화되고 시스템을 매우 쉽게 개발할 수 있다고 판단했지만 배포할 시기가 되면 위협적일 만큼 늘어난 수많은 마이크로서비스를 발견
만약 배포 문제를 초기에 고려했다면? 더 적은 서비스 서비스 컴포넌트와 프로세스 수준의 컴포넌트를 하이브리드 형태로 융합, 더 통합된 도구 사용하여 상호연결

운영

아키텍처가 시스템 운영에 미치는 영향은 개발, 배포, 유지보수에 미치는 영향보다는 덜 극적이다.
(하드웨어는 값이 싸고, 인력은 비싸다 - 스토리지 서버 추가로 해결 가능)
좋은 소프트웨어 아키텍처는 시스템을 운영하는데 필요한 요구도 알려준다.
• 시스템 아키텍처는 유스케이스, 기능, 시스템의 필수 행위를 일급(first-class) 엔티티로 격상시키고, 이들 요소가 개발자에게 주요 목표로 인식되도록 해야 한다.
• 이를 통해 시스템을 이해하기 쉬워지며, 따라서 개발과 유지보수에 큰 도움이 된다.
일급 엔티티(First-Class Entity)란? 소프트웨어 설계에서 시스템의 중심이 되는 중요한 개체

유지보수

유지보수는 모든 측면에서 봤을 때 소프트웨어 시스템에서 비용이 가장 많이 든다.

가장 큰 비용은 탐사(spelunking)와 이로 인한 위험부담에 있다.
• 탐사: 기존 소프트웨어에 새로운 기능을 추가하거나 결함을 수정할 때, 소프트웨어를 파헤쳐서 어디를 고치는게 최선인지, 그리고 어떤 전략을 쓰는게 최적일지를 결정할 때 드는 비용이다.
아키텍처를 신중하게 만들면 이 비용을 크게 줄일 수 있다.
• 시스템을 컴포넌트로 분리하고, 안정된 인터페이스를 두어 서로 격리한다.

선택사항 열어두기

소프트웨어 가치 : 행위적 가치, 구조적 가치(soft)
• 소프트웨어를 부드럽게 유지하는 방법은 선택사항을 가능한 한 많이, 그리고 가능한 한 오랫동안 열어 두는 것이다.
• 열어둬야 할 선택사항 - 중요치 않은 세부사항
• 모든 소프트웨어 시스템은 주요한 두 가지 구성요소로 분해할 수 있다.

  1. 정책 - 시스템의 진정한 가치가 살아있는 곳(모든 업무 규칙과 업무 절차를 구체화)
  2. 세부사항 - 사람, 외부 시스템, 프로그래머가 정책과 소통할 때 필요한 요소지만, 정책이 가진 행위에는 조금도 영향을 미치지 않음(입출력장치, 데이터베이스, 웹 시스템, 서버 프레임워크, 통신 프로토콜 등)

장치 독립성

장치 종속적 : 코드와 입출력 장치가 결합되어있는 형태
장치와 종속되어있다면 장치가 변경되거나 관리가 어려웠음
따라서 장치 독립성을 고안하게 된다.
• 오늘날의 운영체제는 입출력 장치를 소프트웨어 함수로 추상화 했고, 해당 함수는 천공카드와 같은 단위 레코드를 처리한다.
• 동일한 프로그램을 아무런 변경 없이도 카드에서 읽고 쓰거나 테이프에서 읽고 쓸 수 있게 되었다 -> 개방폐쇠의 원칙

광고우편

장치 독립성으로 인하여 어떤 장치를 사용할지 고려하지 않고 프로그램을 작성
• 정책을 세부사항으로부터 분리

물리적 주소 할당

• 시스템에서 고수준의 정책을 물리적 구조로부터 독립시킴으로써 애플리케이션과 하드웨어를 분리할 수 있다.

EX)
회계 시스템 디스크 드라이브에 여러 Agent, Employer, Member의 레코드를 저장
소프트웨어는 디스크가 200개의 실린더와 10개의 헤드로 구성되며, 각 실린더는 헤드별 수십 개의 섹터로 구성
헤더가 더 많거나 실린더가 더 많은, 또는 실린더당 섹터가 더 많은 새로운 디스크 드라이브로 업그레이드해야 한다면 무슨 일이 벌어질까? 하드 코딩된 코드를 전부 수정
VS
주소 할당 체계를 변경하여 상대 주소 사용 
디스크의 물리적 구조로부터 독립

결론

좋은 아키텍트란?
• 정책이 세부사항과 결합되지 않도록 엄격하게 분리
• 세부사항에 대한 결정을 가능한 한 오랫동안 미룰 수 있는 방향으로 정책을 설계
• 정책은 세부사항에 관한 어떤한 지식도 갖지 못하게 되며, 어떤 경우에도 세부사항에 의존하지 않게 된다.