클린 아키텍처 원 그림과 사용자 관점의 불일치
최근 흥미로운 대화를 나눴습니다.
"iOS 개발할 때 클린 아키텍처의 원과 사용자 관점이 잘 안 맞는 것 같지 않나요?"
소프트웨어 개발자라면 한 번쯤은 접해봤을 클린 아키텍처의 유명한 원형 다이어그램에 대한 이야기입니다.
이 다이어그램에서는 네트워크 계층이 가장 바깥쪽에 위치하고, Presenter, Use Case, Domain 등이 안쪽에 배치되어 있습니다.
하지만 실제 사용자 시나리오를 보면, 화면이 먼저 나타난 후 사용자 이벤트에 따라 네트워킹이 발생하는 것이 일반적입니다.
즉, 사용자 관점에서는 네트워크보다 Presenter나 UseCase를 먼저 경험하게 되는 것이죠.
물론 이 다이어그램이 잘못되었다고 할 순 없습니다.
이렇게 널리 알려진 데에는 분명한 이유가 있을 테니까요.
그렇다면 이러한 차이는 어디서 발생하는 걸까요?
제가 생각하기에 이 다이어그램은 의존성의 구분과 방향성을 표현하는데 초점이 맞춰져 있습니다.
앱의 실제 동작 흐름을 표현하기 위한 것이 아니었기에, 이러한 관점 차이가 발생한 것 같습니다.
버터플라이 아키텍처
이런 맥락에서 네이버 부스트캠프 iOS 담당이었던 JK님의 버터플라이 아키텍처가 떠올랐습니다.
이는 클린 아키텍처를 iOS 환경에 맞게 재해석한 아키텍처입니다.
버터플라이 아키텍처는 사용자 입력에서 시작해 적절한 처리를 거쳐 출력으로 이어지는 흐름을 iOS에 최적화하여 구조화했습니다.
개인적으로는 원래의 클린 아키텍처보다 버터플라이 아키텍처가 사용자 흐름을 더 직관적으로 표현한다고 생각합니다.
두 아키텍처 모두 관심사 분리를 통한 프로젝트 구조화라는 동일한 목표를 가지고 있습니다.
다만 각각이 중점을 두는 관점의 차이가 이러한 시각적 표현의 차이로 이어졌다고 봅니다.
전체적인 시야로 보자
이러한 대화 이후 저는 반성했습니다.
사실 저는 클린 아키텍처의 원형 다이어그램에 특별한 위화감을 느끼지 않았습니다.
이를 문제라고 생각하진 않습니다. 의존성을 학습하는 데 어려움이 없었으니까요.
하지만 iOS 개발자로서 플랫폼과 사용자의 관점에서 더 깊이 고민했다면 더 풍부한 인사이트를 얻을 수 있었을 것이란 아쉬움이 들었습니다.
평소 저는 코드의 일관성을 매우 중요하게 여깁니다.
동일한 목적을 가진 코드는 유사한 스타일을 가져야 한다고 생각합니다.
예를 들어, 반복문 사용에 있어 고차함수와 일반 반복문 사이의 명확한 기준이 없다면, 코드베이스는 점차 이해하기 어려워질 것입니다. (참고로 저는 고차함수의 의도에 부합할 때는 고차함수를, 단순 반복이 필요할 때는 일반 반복문을 선택합니다.)
이번 반성은 제가 평소 중요시하는 가치와 맥을 같이 합니다.
아키텍처를 통한 프로젝트 구조화의 핵심은 결국 프로젝트 레벨에서의 명확한 의도 전달이라고 생각합니다.
각 레이어의 역할이 명확히 구분되어 있어서, Presentation 레이어에서는 UI 관련 코드를, Data 레이어에서는 네트워크 관련 코드를 찾을 수 있다는 직관을 제공하는 것이죠.
지금까지 저는 코드 line 레벨의 시야에 갇혀 있었고, 이번 기회를 통해 더 큰 그림을 놓치고 있었다는 것을 깨달았습니다.
발전하자
단순히 '시야를 넓히자'는 결론으로 끝난다면 이번 글은 평범한 반성문에 그칠 것입니다.
그래서 이러한 깨달음을 어떻게 실제적인 성장으로 연결할 수 있을지 고민해보았습니다.
제가 내린 결론은 기술적 고민들을 더 넓은 맥락에서 바라보고, 그 차이점을 탐구해보는 것입니다.
앞서 언급했듯이 코드의 일관성을 중요시하는 제 관점에서, 이러한 일관성이 아키텍처 수준으로 확장된다면, 다른 기술적 고민들도 더 넓은 시각에서 새로운 개념으로 발전할 수 있지 않을까요?
Swift Macro가 좋은 예시가 될 수 있겠네요.
기존에는 보일러플레이트 코드를 단순히 코드 레벨의 문제로만 바라보았습니다.
하지만 Swift Macro는 코드 "패턴" 차원에서 발생하는 보일러플레이트를 효과적으로 줄여주는 솔루션을 제공합니다.
이는 단순한 코드 수준을 넘어서는 더 넓은 범위의 해결책인 것입니다.
이러한 깨달음을 통해 현재의 기술적 고민들을 코드 레벨을 넘어서 더 넓은 관점에서 바라보고, 새로운 개념과 연결지어 생각해보고자 합니다.
아직은 구체적인 예시를 더 찾아내지 못했지만, 성장을 위한 새로운 방향을 발견했다는 것만으로도 의미있는 발견이었습니다.
앞으로 이 길을 잘 갈고 닦고 포장해서 의미있는 성장으로 이어가도록 하겠습니다.
감사합니다.
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.