클린 아키텍처 - 아키텍처4

jaehee kim·2022년 1월 30일
0

Clean Architecture

목록 보기
6/7
post-thumbnail

클린 아키텍처

아키텍처의 목표는 소프트웨어를 계층으로 분리함으로써 관심사의 분리를 달성하는 것이다.

아키텍처의 특징

  • 프레임워크 독립성
  • 테스트 용이성
  • UI 독립성
  • 데이터베이스 독립성
  • 모든 외부 에이전시에 대한 독립성

    그림에서 각각의 원은 서로 다른 영역을 표현한다. 안으로 들어갈수록 고수준 소프트웨어가 된다.
    이러한 아키텍처에서 가장 중요한 규칙은 의존성 규칙(Dependency Rule) 이다.

소스 코드 의존성은 반드시 안쪽으로, 고수준의 정책을 향해야 한다.

내부의 원에 속한 코드는 외부의 원에 선언된 어떤 것에 대해서도 언급하면 안된다.

엔티티

엔티티는 전사적인 핵심 업무 규칙을 캡슐화한다.

외부의 무언가가 변경되더라도 엔티티가 변경될 가능성은 지극히 낫다.

유스케이스

애플리케이션에 특화된 업무 규칙을 포함한다.

엔티티로 들어오고 나가는 데이터 흐름을 조정하며, 엔티티가 자신의 핵심 업무 규칙을 사용해서 유스케이스의 목적을 달성하도록 한다. 이 계층에서 발생한 변경이 엔티티에 영향을 줘서는 안 된다.
운영 관점에서 애플리케이션이 변경된다면 유스케이스가 영향을 받는다.

인터페이스 어댑터

일련의 어댑터들로 구성된다.

프레젠터, 뷰, 컨트롤러는 모두 인터페이스 어댑터 계층에 속한다.
데이터를 엔티티와 유스케이스에게 가장 편리한 형식에서 임의의 프레임워크가 이용하기 편리한 형식으로 변환한다.
이 원 안에 속한 어떤 코드도 데이터베이스에 대해 조금도 알아서는 안 된다.
이 계층에는 데이터를 외부 서비스와 같은 외부적인 형식에서 유스케이스나 엔티티에서 사용되는 내부적인 형식으로 변환하는 또 다른 어댑터가 필요하다.

프레임워크와 드라이버

가장 바깥쪽 계층은 일반적으로 데이터베이스나 웹 프레임워크 같은 프레임워크나 도구들로 구성된다.

안쪽 원과 통신하기 위한 접합 코드 외에는 특별히 더 작성해야 할 코드가 많지 않다.
모든 세부사항이 위치하는 곳이다.


경계 횡단하기

그림 우측 하단에 방법이 그려져있다.

의존성 역전 원칙을 사용해서 제어흐름과 의존성의 방향이 반대가 되도록 한다.

유스케이스에서 프레젠터를 호출해야 한다고 가정했을 때, 직접 호출하게되면 의존성 규칙을 위배한다. 그래서 유스케이스가 내부 원의 인터페이스(Use Case Output Port)를 호출하도록 하고, 외부 원의 프레젠터가 그 인터페이스를 구현하도록 만든다.

경계를 가로질러 데이터를 전달할 때, 데이터는 항상 내부의 원에서 사용하기에 가장 편리한 형태를 가져야한다.


전형적인 시나리오

e.g. 데이터베이스를 사용하는 웹 기반 자바 시스템의 시나리오

1. 웹 서버는 사용자로부터 입력 데이터를 모아서 Controller로 전달한다.
2. Controller는 데이터를 InputBoundary 인터페이스를 통해 UseCaseInteractor로 전달한다.
3. UseCaseInteractor는 이 데이터를 Entities 제어하는데 사용한다.
4. UseCaseInteractorDataAccessInterface를 사용하여 Entities가 사용할 데이터를 데이터베이스에서 불러와서 메모리로 로드한다.
5. Entities가 완성되면, UseCaseInteractorEntities로부터 데이터를 모아서 OutputData를 구성한다.
6. OutputDataOutputBoundary 인터페이스를 통해 Presenter로 전달된다.
7. PresenterOutputDataViewModel과 같이 화면에 출력할 수 있는 형식으로 재구성한다.
8. View에서는 이 데이터를 화면에 출력한다.


결론

소프트웨어를 계층으로 분리하고 의존성 규칙을 준수한다면 본질적으로 테스트하기 쉬운 시스템을 만들게 될 것이고, 시스템의 외부 요소가 구식이 되더라도, 어렵지 않게 교체할 수 있다.





Reference

Clean Architecture - Robert C. Martin

0개의 댓글