-사실 모바일 클린 아키텍처 패턴이라는 개념은 사실 존재하지 않는다. 이런 아키텍처 패턴이 이제까지 존재하던 패턴이라기보다는 "밥 아저씨"가 주장하던 클린 아키텍처를 모바일에서 어떻게 잘 구현할 수 있을까를 고민하다가 나온 결과물이라고 볼 수 있다. 따라서 명시적으로 단 하나의 패턴이 아니고 정답이 있지 않기 때문에 사람들마다 생각이 다 다르다. 약간 사회적인 합의 같은 개념이다.
-밥아저씨는 이런말을 했다. "소프트웨어 아키텍처는 선을 긋는 기술이며, 나는 이러한 선을 경계라고 부른다. 경계는 소프트웨어 요소를 서로 분리하고 , 경계 한편에 있는 요소가 반대편에 있는 요소를 알지 못하도록 막는다." 이 말이 모바일 개발자들에게 많은 영향을 끼친말이다.
-밥아저씨가 말한 선의 구분에서 가장 중요한 것은 단일 책임 원칙이다. 모바일 앱에서 가장 큰 액터는 앱을 사용하는 사람이고 , 또 다른 액터의 종류에는 비즈니스 로직의 어떤 실행자일 수 도 있고 , 그리고 외부에서부터 노팅이나 알람이나 시스템 이벤트일 수 도 있다. 그리고 서버로부터 전달되는 푸시 같은 정보일 수 도 있고 , 서버로부터 오는 명령 같은 것일 수 도 있다. 그리고 이것들을 또 다시 세분화 할 수 도 있다. 예를들어 이용자 액터를 회원가입하는 이용자 , 검색하는 이용자 등등으로 나눌 수 있고 해당 이용자가 하는 행위들을 실제로 일어나게 만드는 많은 액터들이 존재한다. 이런것들을 구별하는 것으로부터 모바일 클린 아키텍처를 시작 할 수 있다. 또한, 이것들을 조금 더 높은 규모로 생각해보면 도출되는 하나의 원칙이 존재한다. 바로 CCP 원칙이다. 공통 폐쇄 원칙 (Common Closure Principle == SRP단일 책임 원칙 + OCP개방-폐홰 원칙)이라는 것인데 , 이는 각 계층은 모듈들의 모임이라는 것이다. 여기서 계층이라는 것은 하나의 모듈 또는 여러 모듈들의 모임을 크게 말하는 것을 계층이라고 말 할 수 있다.
-즉, CCP 원칙에서 말하고자 하는 것은
그렇다면 CCP(공통 폐쇄 원칙)원칙 기준으로 어떤 클래스가 가장 하위 레벨의 클래스일까? 바로 도메인 계층이다.
-도메인 계층(==UseCases) : 클린 아키텍처 관점에서 도메인 계층은 유스케이스라고 불린다. 왜냐하면 앱의 니즈 즉, 임의의 앱이 회원가입도 해야되고 장바구니에 물건도 넣어야 되고 결제도 해야되 이런 것들을 비즈니스의 요구사항이라고 부르는데 , 이러한 비즈니스 로직을 담고 있는 도메인 계층이다. 이러한 비즈니스 요구를 충족하기 위해서 사용자에게 어떤 것들을 보여주는 지가 UI 계층으로 나오게 된다. 도메인 계층 이외의 계층들에 대한 설명은 하단에 존재한다. 결론은 가장 위에 있는 가장 높은 수준의 계층은 도메인 계층이라는 것이다.
-아래 사진은 클린 아키텍처 개념과 관련된 그림이다.
-위 그림을 설명해 보자면, 안쪽에 있는 동그라미 일수록 가장 높은 계급이라는 것이다.
엔티티 : 엔터프라이즈 업무 규칙을 가지고 있으며 엔터프라이즈 업무 규칙을 정의한 동그라미이다.
(주의!!그림에 작성된 엔티티의 개념은 데이터 모델링과 데이터 베이스 설계와 관련된 엔티티를 말하는 것이 아니다.)
유스케이스 : 엔티티가 가지고 있는 엔터프라이즈 업무 규칙이 앱에서 지니는 의미를 정의한 동그라미이다.
프레젠터 : 유스케이스에 서비스를 제공한다. viewModel이라고 생각하면 이해하기가 쉽다.
게이트웨이 : DB 또는 네트워크에 접근
컨트롤러 : 입력을 받아들이고 외부 장치와 소통하는 채널
(주의!! MVC의 컨트롤러를 의미하는 것이 아니다.)
바깥쪽에 있는 게 실제 입출력에 관련된 것들이 있다.
가장 안쪽 동그라미의 요소일 수록 가장 고수준이며 외부로부터 보호되고 있고 완전히 감싸져있어서 바로 바깥쪽의 동그라미의 요소랑만 직접 소통이 가능하다.
-위의 그림을 모바일 아키텍처에 어떻게 적용해야 할지 개발자들끼리 토론하다가 나온 그림은 아래의 그림이다.
각 계층에 대한 자세한 설명은 앞으로 다른 Velog 글에서 다룰 것임.
-아래 그림은 안드로이드에 적용된 클린 아키텍처에 관한 그림이다.