프트웨어 전문지 마이크로소프트웨어의 최신호는 우리가 매일 접하는 웹 페이지, 모바일 등 프론트엔드(Front-End)를 주제로 담았습니다. 자바스크립트, 정적 타입, 리액트, 뷰, 앵귤러, 일렉트론, ESNext 등 마소 393호의 주요 기사들을 IT조선 독자에게도 소개합니다. [편집자주]

모바일 애플리케이션이 일상에 빼놓을 수 없는 존재로 되기까지 많은 개발자의 고민과 노력이 있었다. 특히, 애플리케이션 아키텍처는 중요한 주제였다. 커플 앱 비트윈(Between)을 사용하는 전 세계 2500만 커플을 위해 VCNC 개발자들도 아키텍처에 대해 깊이 고민했다. 코드를 효율적으로 작성해 유지보수를 편하게 하고, 테스트 가능한 코드를 작성해 버그를 최소화했다. 이 글을 통해 더 좋은 iOS 애플리케이션 아키텍처에 대한 비트윈 팀의 고민과 노력을 공유해본다.

MVC 패턴. / 마이크로소프트웨어 393호 발췌
MVC 패턴. / 마이크로소프트웨어 393호 발췌
하지만 뷰와 모델이 위 그림과 같이 연결돼 있으면 재사용성이 떨어진다. 이 때문에 코코아(Cocoa) MVC 패턴은 재사용 할 수 있도록 뷰와 모델을 분리한다.

코코아 MVC 패턴. / 마이크로소프트웨어 393호 발췌
코코아 MVC 패턴. / 마이크로소프트웨어 393호 발췌
코코아 MVC 패턴에서는 뷰와 모델을 분리하기 때문에 둘 사이에서 데이터를 전달할 중개인이 필요하다. 사용자가 뷰를 통해 값을 입력하거나 선택하면 컨트롤러에 값이 전달되고, 컨트롤러는 입력 값을 해석해 무엇을 해야 하는지 모델에게 전달하거나 뷰 상태를 바꾼다. (예를 들면 버튼을 비활성화 상태로 만드는 것) 반대로 모델 내에 데이터가 변했을 때도 컨트롤러를 통해 뷰를 변화시킨다.

MVC는 UI 연결 부분과 데이터 요청, 설정 등이 컨트롤러에 모여 있어 제품을 빠르게 만들기 좋다. 하지만 컨트롤러 안에서 거의 모든 기능을 처리하는 것은 컨트롤러를 비대해지게 만드는 원인이기도 하다. 제품이 커질수록 코드 파악이 어렵다. 실제 비트윈에는 3,000줄에 가까운 컨트롤러도 존재했다. 그래서 개발자 커뮤니티에서는 MVC를 Massive View Controller(거대한 뷰 컨트롤러)라 비꼬기도 한다. 또한 뷰와 컨트롤러가 밀접하게 연결돼 단위 테스트(Unit Test)를 작성하기가 어렵다는 문제도 있다. 테스트를 위한 뷰 껍데기를 만들거나 뷰의 수명을 관리해주기가 매우 까다롭기 때문이다.

MVC 패턴의 문제점을 해결하기 위해 다른 아키텍처를 조사했다. 가장 큰 목표는 컨트롤러의 역할을 줄이고, 클린 아키텍처(Clean Architecture)를 적용하는 것이었다.

클린 아키텍처. / 마이크로소프트웨어 393호 발췌
클린 아키텍처. / 마이크로소프트웨어 393호 발췌
클린 아키텍처는 각 레이어를 역할별로 구분하고 바깥 레이어는 안쪽 레이어의 인터페이스로만 동작하게 만들어 의존성을 줄인 뒤 관리하기 쉬운 아키텍처를 만드는 접근법이다. VIPER(바이퍼)는 클린 아키텍처 개념을 잘 적용한 패턴이다. 뷰(View), 인터랙터(Interactor), 프리젠터(Presenter), 엔티티(Entity), 라우터(Router) 등 다섯 가지 역할을 나누고 각 레이어 간의 의존성을 줄여 테스트를 가능하게 만든다.

김용성, 김남현 필자의 iOS 아키텍처에 대한 자세한 내용은 ‘마이크로소프트웨어 393호(https://www.imaso.co.kr/archives/3408)’에서 확인할 수 있다.