마케터도 10분 만에 이해한 클린 아키텍쳐

알라미 개발자가 클린 아키텍쳐를 지향하는 이유

Bonny
DelightRoom

--

최근 딜라이트룸에서 제작한 광고 중 좋은 성과를 내고 있는 광고가 있습니다.

바로 알라미 앱의 벨소리 기능을 활용한 광고입니다. 광고 덕분에 벨소리 기능을 개발하면서 배운 클린 아키텍쳐의 중요성에 대해 다시 생각이나, 타운홀 미팅 시간에 이를 나누는 시간을 가졌습니다.

알라미는 유저들의 다양한 니즈를 충족할 수 있도록 알람 소리를 여러 방법으로 커스텀할 수 있는 기능들을 제공하고 있습니다. 알라미의 벨소리 기능에는 아래처럼 다양한 종류의 벨소리가 있습니다.

- 서버로부터 벨소리를 다운받아 사용하는 알라미 벨소리

- 여러 인플루언서 분들과 협업하여 만들어진 인플루언서 벨소리

- 직접 유저가 녹음하여 사용하는 녹음 벨소리

- 기기에 저장된 음원을 불러올 수 있는 기기 벨소리
알라미의 벨소리 기능

저는 최근 안드로이드 알라미 앱에 인플루언서 벨소리 기능을 추가하였고, 이 과정에서 클린 아키텍쳐를 이해하고 적용할 수 있었습니다. 이 때의 배움을 예시를 통해 공유해보고자 합니다.

예시로 이해하는 클린 아키텍쳐

클린 아키텍쳐를 쉽게 이해하기 위해 알라미 앱에 있는 벨소리 기능을 공장에 비유하면 아래와 같이 생각해 볼 수 있습니다. 공장에서 제작 레시피에 따라 제품을 생산해 창고에 보관 후 포장하여 고객에게 전달할 수 있습니다.

각 구성요소는 실제 알라미의 벨소리 기능과 매칭하면 아래와 같습니다. 알라미는 서버에서 벨소리 파일을 다운받아 로컬 DB에 저장하고 UI를 통해 유저에게 보여줍니다.

(유즈케이스란? - 사용자가 특정 기능을 사용할 수 있도록 시스템(서비스)이 동작하는 방식)

만약 당신이 공장의 관리자라면?

여기서 만약 당신이 이 공장의 관리자이며, 제품 제작 레시피를 작성해야 한다면 아래 2가지 방식 중 어떤 레시피가 더 효율적일까요?

두 방식의 차이점은 굵은 글씨에 있습니다. B 방식이 더 세세하게 지시하고 있다는 차이점을 알 수 있습니다.

고르셨나요?

클린 아키텍쳐에 의하면, 정답은 A 입니다.

왜 A가 더 좋을까요?

그 이유는 공장, 창고, 포장지는 언제든지 변경될 가능성이 있기 때문입니다. 경기 인근 창고에서 서울의 창고를 이용하게 되거나, 포장지를 종이 봉투에서 박스로 리뉴얼하게 될 수 있습니다.

그런데, 실제 공장이 아닌 기능 개발에서도 이 구성요소 마다의 변경 가능성은 똑같이 적용됩니다. 마치 알라미에서 최근 인플루언서 벨소리 기능을 추가하며 서버 위치, 벨소리 저장 위치 등이 바뀌었듯이요.

즉, A 방식의 레시피로는 공장과 창고, 포장지가 변하더라도 변화에 대응할 수 있습니다. A 방식 레시피는 알라미 벨소리, 인플루언서 벨소리 공장에서도 벨소리를 생산할 수 있지만, B 레시피는 오직 알라미 벨소리 공장에서만 벨소리를 생산할 수 있습니다.

여기서 중요한 것은 유즈케이스와 벨소리 기능이라는 제품 자체는 다른 구성요소에 비해 자주 변하지 않는 다는 것입니다. 알라미가 벨소리라는 기능을 제공한다는 것은 시간이 지나도 자주 바뀌지 않을 것입니다.

클린 아키텍쳐로 돌아오기

위에서 살펴본 구성요소를 자주 변경되는 것과 자주 변경되지 않는 것으로 나누면 아래와 같습니다.

클린 아키텍쳐의 핵심은 자주 변경되는 것과 변경되지 않는 것의 경계를 나눠 분리시키자는 것입니다. 이는 변화에 유연한 구조를 만드는 방법입니다.

여기까지 이야기를 통해서 어느 정도 자주 변경되는 것을 잘 분리시켜야겠다는 것에는 공감이 될 것 같습니다. 잘 분리시키기 위해 클린 아키텍쳐를 개발에 적용시키면 좋겠네요!

그런데 처음 클린 아키텍쳐를 적용하려 할 때, 고민이 생길 수 있습니다. 바로 어떤 부분이 변경되는 부분인지, 변경되지 않는 부분일지 예측하기 어렵다는 것입니다. 알라미에 처음 벨소리 기능이 생길 때 부터, 어떤 것이 변경되고 어떤 것이 변경되지 않는 것인지 예측할 수 있었을까요? 이 고민이 생길 때 우리는 이미 유명한 클린 아키텍쳐 다이어그램을 참고하면 좋습니다.

도표를 간단히만 이해하고 넘어가자면, 원의 바깥 쪽 구성요소로 갈수록 자주 변경되는 구성요소이며, 원의 중앙에 가까워질수록 자주 변경되지 않는 구성요소 입니다.

이해를 위해서 공장 예시의 구성요소를 도표와 매치해보면 아래와 같습니다.

인플루언서 벨소리를 개발할 당시 변경되었던 것과 변경되지 않았던 것이 도표의 내용과 같은 것을 알 수 있습니다. 개발자는 이 구성요소들의 경계를 팀의 상황, 비즈니스 요구사항 등 다양한 조건에 따라 잘 구분하여 DI 등의 방법을 활용해 느슨하게 연결하여 합니다.

벨소리 기능 개발 경험이 특별했던 이유

알라미 안드로이드 프로젝트에서 기존의 벨소리 기능은 개발된 지 시간이 많이 지나있었고, 클린 아키텍쳐를 지향하지 않는 구조였습니다. 그 당시 저도 클린 아키에 대한 확신이 없는 상태라 처음에는 다른 방향으로 코드 구조 개선을 했었습니다. 인플루언서 벨소리 개발시 위 제품 레시피 B의 예시에 있던 굵은 글씨를 분리해내기 위해 많은 시간이 필요했습니다. 그래서 인플루언서 벨소리는 기존 기능에서 서버 주소와, 음원 파일 저장 위치 등만 변경됨에도 불구하고 한 달 가량의 개발 시간이 소요되었습니다.

그에 반해 클린 아키텍쳐 기반으로 개발되었던 iOS는 단 몇 시간안에 인플루언서 벨소리를 추가할 수 있었습니다. 때문에 저는 다른 기능 개발보다 특히 벨소리 기능 개발에서 클린 아키텍쳐의 중요성에 대해 많이 깨달았습니다. 벨소리 개발은 어려웠지만 그만큼 많이 배워 감사한 경험으로 남았습니다. 알라미 안드로이드 팀은 현재 기능들을 클린 아키텍처를 기반으로 하여 개선하고 있습니다. 이를 통해 더 빠르게 변화하는 비즈니스 요구사항에 대응할 수 있는 구조를 구축하여 더 많은 가치를 제공하고자 합니다.

⏰ 딜라이트룸에서 알라미와 함께 아침을 바꿀 분들을 모십니다 🙌

딜라이트룸의 다양한 채널들을 팔로우하고 빠르게 소식을 받아보세요!

--

--