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

[클린아키텍처] 21장 소리치는 아키텍처, 22장 클린 아키텍처

by bzerome240 2022. 3. 12.

 

좋은 아키텍처는 유스케이스를 중심으로 만든다.

  • 프레임워크, 데이터베이스, 웹서버 등의 개발환경을 중심으로 만들면 안된다.
    • -> 프레임워크는 도구일뿐이다. 
  • 웹 또한 전달 메커니즘(입출력 장치)이며, 시스템 아키텍처에는 영향을 주지 않는다.
    • -> 아키텍처 수정 없이도 시스템을 웹, 앱, 콘솔앱 등 전달할 수 있어야 한다.
  • 프레임워크, 웹서버, 데이터베이스 없이도 유스케이스 전부에 대해 단위 테스트가 가능해야한다.
    • -> 유스케이스 객체가 엔티티 객체(데이터베이스나 프레임워크 아닌 간단한 객체)를 조작해야 한다.  

 


 

지난 수십년 간 시스템 아키텍처와 관련된 여러 아이디어가 있다.

  • 육각형 아키텍처 Hexagonal Archiecture
  • DCI (Data Context and Interaction)
  • BCE (Boundary Control Entity)

 

시스템 아키텍처의 공통된 시스템 특징

  • 프레임워크 독립성
    • 프레임워크(라이브러리를 제공하는 소프트웨어)에 의존하지 않는다.
  • 테스트 용이성
    • 업무규칙은 UI, 데이터베이스, 웹서버 요소 없이도 테스트할 수 있다.
  • UI 독립성
    • 업무 규칙(시스템)을 변경하지 않아도 UI를 변경할 수 있다.
  • 데이터베이스 독립성
    • 오라클, MSSQL 서버를 몽고DB, 카우치DB등으로 교체할 수 있다.
  • 모든 외부 에이전시에 대한 독립성
    • 업무규칙은 외부와의 인터페이스에 대해 알지 못한다.

 


 

클린 아키텍처 다이어그램

https://velog.io/@_dodo_hee/TIL-46-Clean-Architecture-%EA%B8%B0%EB%B3%B8%EA%B5%AC%EC%84%B1%EC%9A%94%EC%86%8C

  • 안쪽 - 중요함, 고수준, 업무규칙, 정책
  • 바깥쪽 - 덜 중요함, 저수준
  • 소스코드 의존성은 안쪽(고수준)으로 향해야 한다.
  • 각 계층은 서로 분리되어져야 한다. 바깥이 안쪽에 영향을 주면 안된다.

 

엔티티

  • 메서드를 가지는 객체 또는 데이터구조와 함수의 집합
  • 핵심 업무 규칙(고수준 규칙)을 캡슐화한다.

 

유스케이스

  • 시스템의 모든 유스케이스를 캡슐화하고 구현한다.
  • 엔티티로 들어오고 나가는 데이터 흐름을 조정하며, 엔티티가 자신의 핵심 업무 규칙을 사용하여 유스케이스의 목적을 달성하도록 이끈다.
  • 이 계층에서 발생한 변경이 엔티티에 영향을 주면 안된다.

 

인터페이스 어댑터 (프레젠터, 뷰, 컨트롤러, 게이트웨이)

  • 데이터를 유스케이스와 엔티티에게 가장 편리한 형식에서 데이터베이스나 웹 같은 외부 에이전시에 가장 편리한 형식에으로 변환한다.
  • GUI의 MVC 아키텍처를 모두 포괄한다.
  • 데이터 흐름: 컨트롤러 -> 유스케이스 -> 프레젠터, 뷰

 

프레임워크와 드라이버 (웹, UI, 데이터베이스, 외부 인터페이스, 프레임워크)

  • 안쪽과 통신하기 위한 접합 코드가 존재한다.
  • 모든 세부사항이 위치한다.

 

경계 횡단하기 (다이어그램 우측 하단)

  • 제어흐름과 의존성이 반대이다.
    • 제어흐름: 컨트롤러 -> 유스케이스 -> 프레젠터 
    • 의존성은 유스케이스를 향한다.
  • 제어흐름을 따라 구현하면, 안쪽 원의 코드가 바깥쪽의 원 코드를 직접 호출하게 된다. -> 의존성 역전 원칙 (DIP) 사용하여 해결 가능
    • ex) 유스케이스에서 프레젠터를 호출해야할 때, 직접 호출하지 않고 유스케이스 출력포트 인터페이스를 호출하도록 한다. 프레젠터가 그 인터페이스를 구현한다.

 


 

데이터베이스를 사용하는 웹 기반 자바 시스템 다이어그램

https://velog.io/@kjha2142/%ED%81%B4%EB%A6%B0-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%984

1 웹서버는 사용자로부터 입력 데이터를 모아서 Controller로 전달

2 Controller는 데이터를 객체로 묶은 후 InputBoundary 인터페이스를 통해 UseCaseInteractor로 전달

3, 4 UseCaseInteractor는 데이터를 해석 후 DataAccessInterface를 사용하여 Entities가 사용할 데이터를 데이터베이스에서 불러와서 메모리로 로드한다.

5 UseCaseInteractor는 Entities로부터 데이터를 모아서 OutputData 객체를 구성한다.

6 OutputData는 OutputBoundary 인터페이스를 통해 Presenter로 전달된다.

7 Presenter는 OutputData를 ViewModel 객체처럼 화면에 출력할 수 있는 형식으로 재구성한다.

8 View에서는 이 데이터를 화면에 출력한다.

 

* 모든 의존성은 경계선 안쪽으로 가르지르며, 의존성 규칙을 지킨다.

 

 

728x90
반응형

댓글