안녕하세요. 빅토리아입니다. 오늘은 클린아키텍처 책중 20장 업무규칙, 21장 소리치는 아키텍처, 22장 클린 아키텍처, 23장 프리젠터와 험블객체에 대해서 살펴보고자 합니다.
업무규칙
업무규칙이란 어떻게 구현되었는지와 상관없이 상업적으로 수익을 얻거나 비용을 줄일 수 있는 규칙 또는 절차이다.
예를 들어, 대출에 N%의 이자를 부과한다는 사실은 은행이 돈을 버는 업무 규칙으로, 프로그램으로 이자를 계산하든 사람이 계산하든 상관없는 파트입니다. 이러한 규칙을 핵심 업무 규칙이라고도 합니다.
이러한 핵심 업무 규칙은 데이터를 요구하며, 핵심 규칙과 핵심 데이터는 본질적으로 결합되어 있기 때문에 객체로 만드는데, 책에서는 이 객체를 엔티티라고 부릅니다.
엔티티
엔티티는 컴퓨터 시스템 내부의 객체로서, 핵심 업무 데이터와 이를 기반으로 동작하는 핵심 업무 규칙을 구현한 함수로 구성된다.
엔티티를 생성할 때 주의할 점은, 업무에서 핵심적인 개념을 구현하는 소프트웨어는 한 부분으로 모으고, 구축중인 자동화 시스템의 나머지 고려사항과는 분리시켜 독립적으로 존재할 수 있도록 둔다는 것입니다.
즉, 엔티티는 데이터베이스, 사용자 인터페이스, 서드파티 프레임워크와 같은 고려사항으로 영향받아선 안되고 어떤 시스템에서도 수행되어야 하는 별도의 소프트웨어 모듈입니다. 엔티티는 다양한 어플리케이션에서 사용할 수 있도록 일반화되어야 한다.
UML로 표현한 Loan 엔티티
유스케이스
유스케이스는 엔티티가 어떻게 춤을 출지 제어한다.
유스케이스는 엔티티가 자동화된 시스템에서 사용되는 방법을 담고있습니다. 이는 어플리케이션에 특화된 업무 규칙으로 엔티티 내부의 핵심 업무 규칙을 어떻게, 그리고 언제 호출할지 명시하는 규칙을 담습니다.
유스케이스는 위에서 말한 것과 같이 어플리케이션에 특화된 업무 규칙으로 사용자 인터페이스를 기술하지 않습니다. 사용자에게 유스케이스가 어떻게 보이는지 설명하는 것보다 사용자와 엔티티간의 상호작용을 규정합니다.
엔티티와 유스케이스
엔티티와 유스케이스와의 의존성 방향에 대해 살펴봅시다.
엔티티는 수많은 어플리케이션에서 사용될 수 있도록 일반화된 객체이기 때문에 고수준 개념이다.
유스케이스는 단일 어플리케이션에 특화되어 있어서, 어떤 시스템에 입력과 출력에 가까이 위치하게 되어 저수준 개념이다.
엔티티는 고수준 개념으로서 유스케이스와 같은 저수준 개념에 대해 알지 못합니다. 반대로 저수준 개념인 유스케이스는 고수준 개념인 엔티티에 대해 알고 있습니다. (이 두 관계는 의존성 역전 원칙을 준수하는 또 다른 예시입니다😃)
결론
업무 규칙은 소프트웨어 시스템이 존재하는 이유입니다. 업무 규칙은 사용자 인터페이스나 데이터베이스와 같은 저수준의 관심사로 인해 오염되어서는 안되고, 시스템에서 가장 독립적이며 가장 많이 재사용할 수있는 코드여야 합니다.
소리치는 아키텍처
여러분의 어플리케이션 아키텍처는 어떻게 소리치고 있나요? “레어노트 서비스야”,”미세톡톡 서비스야”라고 소리치고 있나요? 아니면 “노드JS야”,”장고야”라고 소리치고 있나요?
소프트웨어 아키텍처는 유스케이스를 지원하는 구조여야 하며, 어플리케이션의 유스케이스에 대해 소리쳐야 합니다. 아키텍처는 프레임워크에 대한 것이 아니며, 아키텍처를 프레임워크로부터 제공받아서도 안됩니다.
좋은 아키텍처는 유스케이스를 중심에 두기 때문에, 프레임워크나 도구, 환경에 구애를 받지 않고 유스케이스를 지원하는 구조를 아무런 문제 없이 기술할 수 있습니다.
책에서 소개하는 아키텍처에 대한 추가적인 조언은 다음과 같습니다.
웹은 전달 메커니즘(입출력 장치)이고, 시스템구조를 지배해서는 안된다.
프레임워크는 도구일 뿐, 아키텍처의 중심을 차지하는 일을 막아라.
(프레임워크로 인한 어려움을 겪지 않고도) 유스케이스 전부에 단위 테스트가 가능해야한다.
클린 아키텍처
아키텍처의 소프트웨어를 계층으로 분리함으로써 관심사의 분리라는 목표를 달성할 수 있다.
관심사의 분리를 통해 구축된 시스템은 다음과 같은 특징을 지닙니다.
프레임워크의 독립성 프레임워크는 도구에 불과하며, 프레임워크가 지닌 제약사항안으로 시스템을 집어 넣도록 강제하지 않아야 합니다.
테스트의 용이성 업무 규칙은 UI, 데이터베이스, 웹 서버, 이외 외부요소 없이도 테스트 할수 있어야 합니다.
UI 독립성 시스템의 나머지 부분을 변경하지 않고도 UI를 쉽게 변경할 수 있어야 합니다.
데이터베이스 독립성 데이터베이스를 업무규칙에 영향을 주지 않고 변경할 수 있어야 합니다.
모든 외부 에이전시에 대한 독립성 업무 규칙은 외부세계와의 인터페이스에 대해 몰라야 합니다.(의존성이 없어야 합니다)
클린 아키텍처
위 그림의 각 동심원은 소프트웨어에서 서로 다른 영역을 표현하는데, 안으로 들어갈 수록 고수준의 소프트웨어이며 추상적입니다.
위와 같은 아키텍처가 동작하는 가장 중요한 규칙은 의존성 규칙입니다. 소스코드의 의존성은 반드시 안쪽으로, 고수준의 정책을 향해야 합니다.
엔티티 엔티티는 전사적인 핵심 업무 규칙을 캡슐화합니다. 엔티티는 고수준이며 독립적이어야하고, 특정 어플리케이션의 무언가가 변경되더라도 엔티티 계층에는 절대 영향을 주어선 안됩니다.
유스케이스 유스케이스 계층에서는 엔티티로 들어오고 나가는 데이터의 흐름을 조정하며, 엔티티가 자신의 핵심 업무규칙을 이용해 해당 유스케이스의 목적을 달성하도록 합니다. 유스케이스 계층에서의 변경사항이 엔티티에 영향을 끼치면 안되고, 데이터베이스나 UI, 프레임워크에서 발생한 변경사항이 이 계층에 영향을 줘서는 안됩니다.
인터페이스 어댑터 어댑터는 데이터를 유스케이스와 엔티티에게 가장 편리한 형식에서 데이터베이스와 웹같은 에이전시에게 가장 편리한 형식으로 변환하는 작업을 담당합니다. 프리젠터, 뷰, 컨트롤러는 모두 이 계층에 속합니다.
프레임워크와 드라이버 가장 바깥층 계층으로 일반적으로 데이터베이스나 프레임워크나 도구들로 구성됩니다.
위 그림은 아키텍처의 하나의 예시일 뿐이며, 더 많은 원이 존재할 수도 있습니다. 하지만 어떤 경우에도 의존성 규칙은 적용됩니다(소스코드의 의존성은 언제나 안쪽을 향한다!)
결론
고수준의 개념(원의 안쪽)으로 이동할 수록 추상화와 정책의 수준은 높아지고, 저수준의 개념(원의 바깥)으로 이동할 수록 구체적인 세부사항으로 구성됩니다. 외부의 원에서 전달되는 데이터는 항상 내부의 원에서 사용하기에 가장 편리한 형태를 가져야 합니다.
소프트웨어를 계층으로 분리하고(관심사를 분리하고), 의존성 규칙을 준수한다면 클린한 아키텍처를 구축할 수 있을 것입니다. 이러한 아키텍처를 기반으로 테스트하기 쉬운 시스템을 만들게 될 것이며, 데이터베이스나 웹 프레임워크같은 시스템의 외부 요소가 구식이 되더라도 야단스럽지 않게 교체할 수 있을 것입니다.
프레젠터와 험블객체
험블객체
험블객체 패턴은 디자인패턴으로 테스트하기 어려운 행위와 테스트하기 쉬운 행위를 단위 테스트 작성자가 분리하기 쉽게 하기위해 고안되었습니다.
행위들을 두 개의 모듈 또는 클래스로 나눕니다. 이때 가장 기본적인 본질은 남기고, 테스트하기 어려운 행위를 모두 험블 객체로 옮깁니다. 이때 험블객체 이외의 객체는 테스트하기 쉬운 행위들이 있을 것이고, 아키텍처의 경계를 이렇게 분리하다보면 전체적인 시스템의 테스트의 용이성을 높일 수 있습니다.
프리젠터와 뷰
프리젠터는 어플리케이션으로부터 데이터를 받아 화면에 표현할 수 있는 포맷으로 만들어 뷰 모델에 세팅합니다. 그러면 뷰는 뷰 모델로 부터 그려줄 데이터를 찾아 화면으로 로드해줍니다.
프레젠터에서 포맷팅과 같은 로직을 수행하고, 뷰는 데이터를 조회하여 로드만해주기 때문에 프리젠터는 테스트하기 쉬운 객체이고 뷰는 험블객체입니다.
지금까지 업무규칙과 아키텍처에 대한 요약이었습니다. 읽어주셔서 감사합니다.😃
Get to know us better! Join our official channels below.
Telegram(EN) : t.me/Humanscape KakaoTalk(KR) : open.kakao.com/o/gqbUQEM Website : humanscape.io Medium : medium.com/humanscape-ico Facebook : www.facebook.com/humanscape Twitter : twitter.com/Humanscape_io Reddit : https://www.reddit.com/r/Humanscape_official Bitcointalk announcement : https://bit.ly/2rVsP4T Email : support@humanscape.io