본문 바로가기
클린아키텍처

[클린아키텍처] 17장 경계: 선긋기, 18장 경계 해부학

by bzerome240 2022. 3. 10.

경계 Boundary

  • 소프트 웨어 아키텍처는 경계 Boundary 를 긋는 기술이다.
  • 소프트웨어 요소를 서로 분리하고, 경계 한편에 있는 요소가 반대편에 있는 요소를 알지 못하도록 막는다.
  • 프로젝트 초기 또는 매우 나중에 생길 수 있다. 

 

결합 coupling

  • 경계와 반대되는 기술
  • 인적자원 효율을 떨어뜨리는 요인
  • 유스케이스와 관련없는 프레임워크, DB, 웹서버, 라이브러리 등 너무 일찍 내려진 결정에 따른 결합

 

좋은 아키텍처는 이러한 결정이 부수적이며, 결정을 나중에 내려도 큰 영향이 없어야한다. 

 


어떻게 선을 그을까? 언제 그을까?

1 GUI와 업무 규칙은 선이 있어야한다. O

2 데이터베이스와 GUI도 선이 있어야한다. O

3 데이터베이스와 업무규칙도 선이 있어야한다 O

-> ??? 데이터베이스가 업무 규칙이랑 관련이 없다는데에 이해하지 못할 수 있다. But, 데이터베이스는 업무규칙이 간접적으로 사용할 수 있는 도구이므로 선이 있어야한다

 

 

인터페이스 뒤로 숨은 데이터베이스 & 경계선

  • DatabaseAccess의 화살표를 보면 바깥으로 나간다 == DatabaseAccess가 존재한다는 사실을 알고있는 클래스는 없다.
  • 관련성 낮은 컴포넌트가 관련성 높은 컴포넌트에 의존한다.

 

위의 예제의 결론

1 데이터베이스는 오라클, mysql 등으로 구현할 수 있으며 업무규칙에 영향을 주지 않는다.

2 데이터베이스에 대한 결정은 나중에하고, 먼저 업무 규칙을 작성하고 테스트하라

 


 

플러그인

: 특수 처리, 추가 기능 및 추가 기능을 생성하기 위해 핵심 시스템을 향상 또는 확장하기위한 사용자 정의 코드를 포함하는 독립 실행 형 독립 구성 요소

 

 

플러그인 아키텍처

플러그인 아키텍처는 1 코어 시스템과 2 플러그인 모듈로 구성된다.

https://ichi.pro/ko/peulleogeu-in-akitegcheo-244924925155328

 

 

 


 

최종 결론

  • 소프트웨어 아키텍처에서 경계선을 그리려면 먼저 시스템을 컴포넌트 단위로 분할해야 한다.
  • 일부 컴포넌트는 핵심 업무 규칙, 나머지 컴포넌트는 플러그인에 해당한다.
  • 컴포넌트 사이의 화살표가 핵심 업무를 향하도록 배치한다. (저수준 -> 고수준)

 

 

경계선 분할은 의존성 역전 원칙 (DIP) , 안정된 추상화 원칙 (SAP)와 관련이 있다.

* DIP: 변하기 쉬운 클래스에 의존하지 않고, 추상적인 클래스에 의존해야한다.

* SAP: 의존성은 추상화 방향으로 향해야 한다.

 

 


 

경계는 소스코드 모듈 하나가 의존하는 다른 소스 코드를 바꿔햐하는것을 막아내는 방화벽을 구축하고 관리하는 수단으로써 존재한다.

 

 

 

저수준 클라이언트에서 고수준 서비스를 호출할 때

https://medium.com/humanscape-tech/clean-architecture-%EA%B2%BD%EA%B3%84-974c8f62909d

  • 제어흐름은 왼쪽에서 오른쪽으로 경계를 횡단한다.
  • 의존성도 왼쪽에서 오른쪽으로 경계를 횡단한다. (저수준 -> 고수준)
  • 경계에서 호출되는쪽에 Data 정의가 위치한다.

 

고수준 클라이언트에서 저수준 서비스를 호출할 때 (DIP)

https://medium.com/humanscape-tech/clean-architecture-%EA%B2%BD%EA%B3%84-974c8f62909d

  • 제어흐름은 왼쪽에서 오른쪽으로 경계를 횡단한다.
  • But 의존성은 제어흐름과 반대로 경계를 횡단한다. (저수준 -> 고수준)
  • 호출하는 쪽에 Data 정의가 위치한다.

 

정적 링크된 모노리티(단일체) 구조의 실행 파일이라도 이처럼 규칙적인 방식으로 구조를 분리하면 프로젝트를 개발, 테스트, 배포하는 작업에 큰 도움이 된다.

 


 

배포형 컴포넌트와 모놀리티(단일체)는 동일하다.

 

스레드

: 실행계획과 순서를 체계화하는 방법

모든 스레드가 단 하나의 컴포넌트에 포함될 수도 있고, 많은 컴포넌트에 걸쳐 분산될 수 있다.

모놀리티(단일체와) 배포형 컴포넌트는 모두 스레드를 활용할 수 있다.

 

로컬 프로세스 경계

: 훨씬 강한 물리적 형태를 띠는 아키텍처 경계

 

서비스 경계

: 물리적 형태를 띠는 가장 강력한 아키텍처 경계

 

로컬프로세스와 서비스의 특징

  • 주로 명령행이나 시스템 호출을 통해 생성된다
  • 함수호출에 비해 매우 느리므로 빈번한 통신을 줄여야 한다.
  • 지연에 따른 문제를 고수준에서 처리할 수 있어야 한다.
  • 저수준 서비스는 반드시 고수준 서비스에 '플러그인'되어야 한다.
  • 고수준 서비스의 소스 코드에는 저수준 서비스를 특정짓는 정보 ex) URI 도 포함해서는 안된다.

 

 

대다수의 시스템은 한가지 이상의 경계 전략을 사용한다

 

한 시스템 안에서도 통신이 빈번한 로컬 경계와 지연을 중요하게 고려해는 경계가 혼합되어 있다.

 

 

 

728x90
반응형

댓글