All Articles

[Think] 아키텍처에 대한 생각 - 2022 ver.

들어가며

아키텍처는 모호하다. 지금까지 여러 팀 / 팀원들과 아키텍처에 대해 무수히 많은 토론을 해봤지만, 단 한번도 깔끔하게 일치된 적이 없었다. 각자 개발에서 중요하게 생각하는 우선순위가 다르고 이에따라 아키텍처를 바라보는 관점 역시 다르기 때문이다.

또한 ‘코드에서 유일하게 변경되지 않는 것은 코드가 변경된다는 사실’ 이라는 말처럼 아키텍처 역시 계속해서 발전하고 변하기 때문에 어느 것이 정답이라고 결코 얘기하기 어렵다.

특정 아키텍처 만능론에 대하여

최근 안드로이드의 아키텍처에 대해 논하다보면 보통은 다음과 같이 귀결된다.

MV-Whatever + Clean architecture (optional)

그런데 왜? 라는 물음에 쉽게 답하기는 어려운 것 같다.

나또한 Clean Architecture 를 처음 접한 뒤, 얼마간은 특별한 이유 없이 모든 것을 클-아 관점에서 바라보고 문제를 풀려고 애써왔다. 핫한 개념을 다루는 것이 곧 실력의 척도라고 생각했던 것 같기도 하다.

그런데.. 코드에 대한 의사결정은 거의 대부분 예외없이 trade-off 요소가 존재한다. 이는 아키텍처도 예외가 아니다. 가령 다음과 같이 생각할 수 있다.

  • MV-Whatever : ViewModel 이든 Presenter 든 거대한 비즈니스 로직 덩어리가 되어 God - object 가 되는 것을 피하기 어렵다.
  • Clean architecture : 프로젝트 / 모듈 규모에 따라 Domain 레이어를 분리하는게 무의미한 경우도 존재한다. 또한 빡빡한 의존성 규칙을 모두 지키기 위해서는 (그것이 옳은가와 별개로) 코드 작성의 스트레스 레벨이 높다.

단순히 ‘다들 그렇게 사용하니까.’ 라는 이유만으로 기술적인 의사결정을 내릴 경우, 프로젝트가 성숙해짐에 따라 필연적으로 고통을 맞이했다.


아키텍처 담론에 대해 최근까지 정리된 나의 생각은 다음과 같다. (한편 생각은 언제든 바뀔 수 있고, 언제든 마음이 열려있다.)

  • 결국 풀고자하는 문제에 집중해야한다.

    • 문제의 정의
    • 문제의 우선순위
  • 프로덕트의 상황, 문제의 난이도와 시급도에 따라 우아하지 않은 방법으로 풀더라도 큰 상관은 없다.

    • 예) MVC 형태로 구현하더라도 빠르게 대응할 수 있다면 why not?
  • 아키텍처보다 더 중요한 것은 SOLID 같은 보다 core 한 원칙이다.

    • 관심사의 분리가 잘 진행되지 않은 아키텍처는 그저 코드를 옮겨놓은 형태에 불과하다.
    • core 한 원칙을 잘 지키면 아키텍처는 자연스레 구성된다.

Unidirectional Data Flow

다소 장황하게 얘기했지만, 사실 공식 docs에서 볼 수 있듯이 아키텍처에 대한 합의 자체는 어느정도 진행되었고 나 역시 대부분의 방향성에 동의한다.

이중 내가 가장 집중하고 있는 규칙은

Unidirectional Data Flow

바로, 단방향 데이터 흐름(aka. UDF)에 관한 것이다.

1

MVI 아키텍처의 형태로도 불리는 해당 규칙은 Compose 와 Flow 의 제공으로 인해 한결 구현이 쉬워졌다.

그리고 규칙의 가장 강력한 장점은

상태 변화의 추적 및 관리가 너무나도 쉬워진다는 점

이다.


특정 스펙에 대해 이슈가 발생한다면 원인은 아주 크게 보면 2가지 이다.

  1. 히스토리를 놓치는 것
  2. 상태 관리

그런데 UDF 를 잘 준수할 경우 상태관리에 대한 걱정이 더이상 없어지게 된다. 문제가 될 수 있는 상태를 바로 찾아 변경하는 지점만 바로 확인하면 되기 때문이다.

최근 3000 line 이 넘어가는 ViewModel 을 가진 화면을 compose 및 ui state flow 기반으로 리펙토링할 과제가 있었는데, UDF 를 준수하도록 진행한 결과 리포트 된 이슈가 거의 없고 오히려 기존에 존재하던 버그성 상태관리 이슈도 거의다 잡을 수 있게 되었다.

No silver bullet

매번 비슷하지만.. 경험이 쌓일 수록 결국 은총알은 없다는 것으로 결론으로 귀결된다.

특히나 점점더 특정한 방법론에 대한 무조건적인 채택의 의지는 약해지는 것을 느낀다.

high level / low level 을 불문하고 내가 해오는 모든 고민들이 이미 몇십년전에 진행되어 정답과 대안까지 나왔다는 것을 깨달으며 겸손이 주입된 점도 있겠다.

인상깊은 경험/충격을 겪지 않는 이상, 아키텍처에 대한 생각은 위 생각에서 변함이 없을 것 같다.

다시 새로운 시각으로 바라볼 수 있는 날이 오면, 내가 좀 더 성장했다는 지표로 받아들여도 될까?