독서(Reading)/클린아키텍처(Clean Architecture)

5부 아키텍처 17장 경계: 선 긋기

Chaany 2022. 12. 29.
728x90

1. 들어가며

  • 소프트웨어 아키텍처는 선(경계)을 긋는 기술
  • 경계는 소프트웨어 요소를 서로 분리하고, 경계 한편에 있는 요소가 반대편에 있는 요소를 알지 못하도록 막음 * 초기에 그어지는 선들은 가능한 한 오랫동안 결정을 연기시키기 위해, 그래서 이들 결정이 핵심적인 업무 로직을 오염시키지 못하게 만들려는 목적으로 쓰임
  • 이른 결정
    • 시스템의 업무 요구사항, 즉 유스케이스와 아무런 관련이 없는 결정
    • 프레임워크, 데이터베이스, 웹 서버, 유틸리티 라이브러리, 의존성 주입에 대한 결정 등
  • 좋은 아키텍처
    • 결정이 부수적이며, 결정을 연기할 수 있는 아키텍처
    • 결정을 가능한 한 최후의 순간에 내릴 수 있게 해주며, 결정에 따른 영향이 크지 않게 만듦

2. 두 가지 슬픈 이야기(실패 사례- 이른 결정)

  • P사
    • 모노리틱 데스크톱 애플리케이션에서 웹 서버로 전환하며 도메인 객체가 특정 인스턴스를 가져야한다는 결정을 이르게 내림으로써 개발 비용을 가중시킨 사례
  • W사
    • SOA를 약속하는 일련의 도구들에 대한 이른 결정, 즉 거대한 일련의 도메인 객체 서비스를 너무 이른 시기에 채택함으로써 개발 비용을 가중시킨 사례

3. FitNesse(성공 사례 - 적절한 결정)

  • 개발 초 업무 규칙과 데이터베이스 사이에 경계선을 그음 
  • 업무 규칙은 데이터 접근 메서드 외에는 데이터베이스에 관해서 알지 못함
  • 경계선을 긋는 행위는 결정을 늦추고 연기하는 데 도움이 되었고 시간을 절약해주고 골치를 썩지 않게 해주었음

4. 어떻게 선을 그을까? 그리고 언제 그을까?

  • 관련이 있는 것과 없는 것 사이에 선을 그음
    • GUI
    • 업무 규칙
    • 데이터베이스
  • 데이터베이스는 업무 규칙이 간접적으로 사용할 수 있는 도구
  • 업무 규칙은 스키마, 쿼리 언어, 또는 데이터베이스와 관련된 나머지 세부사항에 대해 어떤 것도 알아서는 안됨
  • 업무 규칙은 데이터를 가져오고 저장할 때 사용할 수 있는 함수 집합이 있다는 사실만 알아야 함
  • 함수 집합을 통해 데이터베이스를 인터페이스 뒤로 숨길 수 있음
  • 데이터베이스를 결정하기에 앞서 업무 규칙을 먼저 작성하고 테스트하는 데 집중할 수 있음 

5. 입력과 출력은?

  •  일반적으로 시스템의 행위를 입출력이 지닌 행위적 측면에서 생각하는 경향이 있음
  • 시스템에서 입출력은 중요하지 않음
  • 모델은 인터페이스를 전혀 필요로 하지 않음
  • 중요한 것은 업무 규칙
  • 관련성이 낮은 컴포넌트는 관련성이 높은 컴포넌트에 의존함(어떤 컴포넌트가 어떤 컴포넌트를 알고 있는지, 신경 쓰는 지)

6. 플러그인 아키텍처

  • 컴포넌트 추가와 관련한 일종의 패턴 = 시스템에서 서드파티 플러그인을 사용할 수 있게한 패턴
  • 소프트웨어 개발 기술의 역사는 플러그인을 손쉽게 생성하여, 확장가능하며 유지보수가 쉬운 시스템 아키텍처를 확립할 수 있게 만드는 방법에 대한 이야기
  • 선택적이거나 또는 수많은 다양한 형태로 구현될 수 있는 나머지 컴포넌트로부터 핵심적인 업무 규칙은 분리되어 있고,독립적임
  • 인터페이스는 플러그인 형태로 고려되었기에 수많은 종류의 사용자 인터페이스를 플러그인 형태로 연결할 수 있게 됨
  • 플러그인 구조를 가정한다고 해도 교체 작업은 사소한 일이 아니겠지만, 변경 작업을 현실성 있도록 만들어 줌

7. 플러그인에 대한 논의

  • 특정 모듈이 나머지 모듈에 영향받지 않기를 바람
  • 시스템을 플러그인 아키텍처로 배치함으로써 변경이 전파될 수 없는 방화벽을 생성할 수 있음
  • 경계는 변경의 축이 있는 지점에 그어짐
  • 경계의 한쪽에 위치한 컴포넌트는 경계 반대편의 컴포넌트와는 다른 속도로, 다른 이유로 변경됨
  • 업무 규칙은 의존성 주입 프레임워크와 다른 시점, 다른 이유로 변경되므로 반드시 경계가 필요함
  • 단일 책임 원칙은 어디에 경계를 그어야 할 지를 알려줌 

결론

  •  소프트웨어 아키텍처에서 경계선 그리는 법
    • 시스템을 컴포넌트 단위로 분할해야 함
    • 일부 컴포넌트는 핵심 업무 규칙에 해당하고, 나머지는 플러그인으로, 핵심 업무와는 직접적인 관련이 없지만 필수 기능을 포함함
    • 컴포넌트 사이의 화살표가 특정 방향, 즉 핵심 업무를 향하도록 이들 컴포넌트의 소스를 배치함
  • 의존성 역전 원칙과 안정된 추상화 원칙을 응용한 것
  • 의존성 화살표는 저수준 세부사항에서 고수준의 추상화를 향하도록 배치
공부할 단어
* 마샬링
* 직렬화
* 서버 팜
* 리치 아키텍처
* 미들웨어 서버
* 스텁
* 해시테이블
* 플랫 파일
728x90

댓글