나름대로 깔끔하게 코드를 작성한다 노력하지만 앱 구현에 급급해져서 생각의 흐름대로 코드를 작성하다보면 수정 및 보완 시에 스파게티 코드로 나조차도 어디서부터 어떤 부분인지 복잡해져서 헤매이기도한다.
좀 더 깔끔하고 구조화 된 프로젝트, 언제 봐도 금방 찾고 이해할 수 있는 코드, 견고하고 안정적인 유지보수하기 좋은 코드에 대한 물음표로 '클린 아키텍처'개념에 관심을 가지게 되었다.
Clean Architecture는 소프트웨어의 구조와 설계 원칙을 정리한 이론으로 Robert C. Martin이 정의했다. 기존의 계층형 아키텍처가 가지던 의존성에서 벗어나도록 하는 계층을 분리하여 관심사를 분리하는 것이다.
위 그림의 화살표와 같이 외부에서 내부로 의존하는 규칙을 가진다.
내부에서는 외부에 대한 정보를 알 수 없고, 외부의 어떤 것도 내부에 영향을 주지 않아야 한다.
위 클린 아키텍처를 바탕으로 네 개의 계층을 재구성하여 현재 가장 대중적으로 모바일 앱에서의 클린 아키텍처를 세 개의 계층으로 설명하고 있다.
유저 입장에서 보는 프로그램의 겉면 View,UI이다.
ViewModel(Presenter)은 유저의 클릭이나 어떠한 이벤트 등의 동작을 Usecase를 활용해 처리하며 View를 업데이트하고 데이터를 표현한다.
ViewModel이 View와 관련된 작업만 할 수 있도록 한다.
필요한 Model과 해당 앱 안에서 일어날 수 있는 모든 동작과 기능들을 정의하는 UseCase, Repository를 활용해 비즈니스 로직을 담당한다.
DB, Rest Api 등 실질적 데이터를 제공하는 DataSource에 접근해 구체적인 기능을 구현하는 Repository(Implements)를 포함한다.
Presentation, Domain, Data 레이어로 나누어 간단한 노트앱에 클린 아키텍처를 적용했다.
관심사의 구분으로 특정 계층의 수정이 다른 계층에 영향을 거의 주지 않는 다는 점이 클린아키텍처의 가장 큰 장점이며 그만큼 의존성 규칙을 지켜내며 계층의 구분과 분리가 가장 중요하다.
초반에는 익숙치않아 폴더를 열고 닫고 이리저리 코드를 옮기며 헤매었지만 익숙해진다면 여러 기능 추가 및 수정시에도 빠르고 편리하게 적용하면서 외부 변경에 대해 유연하게 대처할 수 있을 것이다.
개인적으로 코드 테스트에서 굉장한 이점을 느꼈다.
테스트 코드를 종속성에서 자유롭게하여 원하는 부분만을 테스트하고, 여러 버그들과 인간의 실수를 최소화하면서 미래에 닥칠 여러 문제점들에게서 프로젝트를 안정적으로 만들어갈 수 있다.
간단한 앱에서는 상당히 많은 클래스를 구분지어 만들어주어야하기에 오히려 더욱 복잡해 보이기도한다. 이럴 경우 UseCase를 생략하거나 필요없는 단순한 요소들을 축소 및 통합하는 것이 좋을 것이다.
앞으로 스스로 경계와 계층을 정의하는 것에 많은 연습이 필요할 것 같다.