이 글은 LINE Engineering Blog에 발행했던 글을 LY Tech Blog로 재발행하였습니다.
서비스 소개
'데마에칸(出前館)'은 2000년부터 서비스를 시작한 일본 최대 규모 음식 배달 서비스로 2020년 당시, 아직 LINE이었던 LY Corporation에서 인수했습니다. 현재 일본의 배달 서비스 시장은 한국보다 작은데요. 그만큼 성장 여력이 많다고도 할 수 있습니다.
ABC Studio는 2021년 봄부터 데마에칸의 전체적인 리뉴얼을 진행하고 있습니다. 그중에서 'Recode'라는 이름으로, 서비스 스펙은 동일하지만 코드 베이스와 아키텍처를 100% 교체하는 작업을 진행했는데요. 이 글에서는 여러 가지 리뉴얼 방식 중 기존 코드를 새로운 코드 베이스로 교체하는 기술로 결정한 이유와 그 실행 과정을 소개하겠습니다. 아참, 프로젝트 이름을 Recode로 정했더니 Record로 잘못 쓰는 사람들이 많았습니다. 비슷한 프로젝트를 진행하실 예정이라면 다른 이름을 사용하시길 바랍니다. :)
오래된 꿈
엔지니어라면 누구나 꿈꾸는 일이 있습니다. 마법의 빗자루로 하루아침에 레거시를 청소하고, 핑거 스냅 한 번으로 모든 사용자가 최신 버전을 사용하도록 만드는 일입니다(현실에서는 그렇게 강제했다간 사용자의 절반이 사라질 수 있습니다). 왜 한 번에 갈아엎는 작업은 스펙이 아무리 명료해도 어려울까요? 비즈니스는 하루도 쉬지 않고 전진해야 하는 상황에서, 회사가 다른 시급한 사항만큼이나 기술력 향상의 가치를 알아줘야 하고, 쉽지 않을 갈아엎는 작업에 대한 프로덕트 팀 내부의 합의도 필요하고, 합의한 뒤에는 그 프로덕트 팀의 고충을 이해해 줄 경영진과 사업 팀, 마케팅 팀, QA 팀, CS 팀 등 다른 구성원들의 공감대가 필요하기 때문입니다.
앞서 열거한 주변 팀들의 희망 사항을 나열해 보면 아래와 같습니다.
- 경영진: GMV(gross merchandise volume) 목표치를 달성해 시장에서 이기고 주주들에게 긍정적으로 응답하고 싶다.
- 사업 팀: 새로운 초대형 파트너와의 계약이 임박했다. 새로운 결제 방식을 추가해 공급할 때까지 얼마나 걸리는지 알려 달라. 늦으면 그들이 경쟁사와 독점 계약할 위험이 있다(아... 글만 썼는데도 스트레스가...).
- 마케팅 팀: 연휴에 반값 할인 행사를 하고 싶다. 쿠폰을 대량 발급하고 메신저 광고를 진행할 것이니 접속량이 피크에 달할 것으로 예상된다.
- QA 팀: 새로 작성한 코드는 버그가 많을테니 아주 오랫동안 시간을 넉넉하게 잡고 QA를 해야 할 것이다. 3개월은 어떨까?
- CS 팀: 당분간 버그가 많이 나올 텐데 콜센터에서 제대로 대응하지 못할 위험이 있다.
모두가 공감할 수 있는 가치는 무엇이었을까요? 그리고 각각을 어떻게 설득할 수 있을까요? 개발자라면 누구나 레거시를 청소하고 싶을 것 같지만 과연 그럴까요? 대화해 보면 레거시 청산으로 얻을 좋은 개발 경험보다는 당장 어떻게든 비즈니스 요구 사항을 구현해 회사의 매출과 경제적 성장에 기여하는 것을 더 중요하게 생각하는 경우도 많았습니다. 그것이 좀 더 가시적인 성과이며, 이는 평가와 보상으로까지 이어지기 때문입니다. 따라서 회사 차원에서 이번 노력의 가치와 공헌을 잘 이해하고 있다고 설득해서 프로덕트 팀 내부의 합의를 이끌어 내는 것도 필요합니다. 간혹 사안을 숫자로만 이해하려고 드는 동료에게는 스토리 포인트 대비 개발 시간과 릴리스 사이클을 KPI에 직결시켜서 레거시로는 도저히 목표를 달성할 수 없다고 이야기하는 방법도 있습니다.
Recode가 필요하다고 설득하기
프로덕트 팀 외부에 Recode 프로젝트가 왜 필요한지 설득하는 일이 어려운 가장 큰 이유는 사업적으로 아무런 공헌이 없는 것처럼 보이기 때문입니다. 이때 이들을 설득할 수 있는 대표적인 방법 세 가지를 소개하겠습니다.
첫 번째는 현재 앱에서 발견된 잠재적인 보안 리스크를 강조하는 것입니다. 보안 문제는 서비스를 한순간에 의미 없게 만들 수 있을 만큼 중요한 문제이므로 분명한 보안 이슈가 있으면 크게 강조합시다.
두 번째는 Recode 다음 단계를 보여주는 것입니다. Recode 자체로는 겉으로 보이는 차이가 없기 때문에 효과를 체감할 수 없습니다. ABC Studio는 Recode 후에 진행할 수 있는 한 달 간격의 UI 리프레시를 비롯해 향후 두 번의 릴리스가 가져올 변화를 시연을 통해 보여줬습니다. 또한 Recode 덕분에 적용할 수 있게 될 UX와 신기능 등을 소개했습니다. 반년 뒤를 생각했을 때, 조금씩 앱을 수정해 나간 반년 뒤의 결과보다는 3개월 정도 기존 앱으로 버티면서 Recode한 뒤 그 결과로 나머지 3개월 동안 급격한 변화와 여러 요구 사항을 빠르게 수용한 결과가 더 좋을 것이라는 믿음을 심어 주세요.
세 번째는 역시 돈의 논리로 이야기하는 것입니다. LY Corporation은 보안을 1순위에 두고 가장 중요하게 생각하지만 그렇지 않은 회사도 많습니다. 오직 사업 관점의 KPI만 중요하게 생각하는 회사라면, Recode의 경제 효과를 간단한 수식으로 표현해 설득하는 방법이 잘 통할 수 있습니다. 이때 현재 서비스의 여러 가지 지표를 수집해 표로 정리하면 좋은데요. 버그와 크래시 발생 빈도, 사용자 피드백 자료, 서비스 품질의 네거티브 지표(로딩 시간 등), 신기능을 추가할 때 소요되는 시간 등을 정리합니다. 여기에 릴리스를 이전보다 자주 할 수 있게 되면서 얻을 수 있는 이득을 포함해 표로 정리하고 계산하면 Recode의 필요성을 효과적으로 전달할 수 있습니다. 또한 가장 민감한 방법으로 경쟁사와 비교하는 방법도 있겠습니다.
데마에칸은 일본의 상장사입니다. 또한 영업력이 강한 서비스인만큼 매출을 1순위로 생각하고 있었지만, 서비스의 품질이 좋지 않다는 공감대는 형성돼 있었습니다. 이에 프로덕트의 쇄신을 넘어 혁신이 필요하고 이를 위한 시간이 필요하다는 점은 인정하고 있었습니다. 다만 그렇다고 무작정 오래 기다리게 할 수는 없는 노릇이라서 딱 3개월만 버텨달라고 설득했습니다. 3개월은 개발 측면에서는 빠듯한 기간이었지만, 비즈니스 측면에서는 한 분기에 해당하는 기간입니다.
Recode의 특징은 기존 앱의 UI부터 동작까지 모두 동일하게 유지하면서 코드와 아키텍처를 바꾼다는 것입니다. 새로 작성하는 김에 새로운 스펙과 디자인을 적용할 수도 있지만 그렇게 하지 않은 이유로는 아래 네 가지가 있습니다.
- CS 팀을 비롯한 운영 조직을 안심시킬 수 있습니다. 버전 숫자만 달라질 뿐 기존 앱과 동일하다는 말은 운영 현장에서 발생할 수 있는 혼란을 줄입니다. 또한 다음에 신규 기능을 넣기 전까지 운영에서의 버퍼 역할을 합니다.
- QA 팀의 작업을 단순화할 수 있습니다. 새로운 스펙과 새로운 버그로 혼란을 주는 것이 아니라, 새로운 버그 유형에 대해서만 확인하도록 만들 수 있습니다. 이는 프로덕트 팀에서 핫픽스(hotfix)할 때 QA 팀에서 코드 품질에만 신경 쓸 수 있도록 만듭니다.
- 프로덕트 팀이 전체 워 크플로를 안정적으로 익힐 수 있습니다. 주위 팀들과의 공개 버전 릴리스 경험을 거치면서 커뮤니케이션 방법과 릴리스 절차를 습득할 수 있습니다.
- 개발 팀이 자신의 코드에 확신을 가질 수 있습니다. 전체 구조를 제대로 이해하지 못한 상태에서 새로운 요구 사항을 반영해 작은 단위의 릴리스만 진행하면, 이로 인해 야기될 수 있는 버그가 발생했을 때 당황하곤 합니다. 특히 오래된 아키텍처는 더욱 쉽게 무너질 수 있습니다.
어디서부터 시작할까?
서비스의 전체 아키텍처 중 어느 한 부분을 잘라내서 완전히 재구성하는 일에는 여러 가지 접근법이 있습니다. 가장 핵심적인 부분부터 새롭게 구성하기도 하고, 반대로 종단부터 진행하기도 합니다. 이에 대한 판단은 현재 서비스가 처한 시급도와 영향도, 안정성, 그리고 사업 관점에서의 요구 사항에 따라 다르겠습니다. 데마에칸의 경우를 일부 소개하면 아래와 같습니다.
컴포넌트 | 회원 서비스 | 주문 서비스 | 배달 서비스 | 사내 관리 | 프런트 앱 | 배달 앱 | 가맹점 앱 | ... |
---|---|---|---|---|---|---|---|---|
요구 사항 시급도 | 낮음 | 높음 | 낮음 | 중간 | 높음 | 중간 | 낮음 | |
보안 위험 | 중간 | 낮음 | 낮음 | 낮음 | 낮음 | 높음 | 높음 | |
팀 체계 | 부족 | 적당 | 부족 | 적당 | 충분 | 부족 | 부족 | |
아키텍처 | 부족 | 적당 | 부족 | 부족 | 적당 | 부족 | 부족 | |
... |