배달의민족 Flutter 도입과 아키텍처 설계 교훈

배달의민족은 주문접수 채널에서 Flutter를 도입하여 멀티 플랫폼 대응력을 높이고, Clean Architecture를 통해 효율적인 코드 관리를 실현했습니다. 이 글에서는 Flutter 도입과 아키텍처 설계의 과정에서 얻은 교훈을 바탕으로, 변화하는 비즈니스 요구에 맞추기 위한 혁신적인 접근을 소개합니다. 또한, 이러한 경험이 다른 기업이나 개발자에게도 유용한 전략이 될 수 있도록 공유하고자 합니다. Flutter 도입으로 인한 혁신적인 변화 배달의민족은 Flutter 도입을 통해 플랫폼 전환과 유지보수 측면에서 큰 혁신을 이루었습니다. 기존의 Windows, Android, iOS 플랫폼에 추가하여 macOS와 다양한 Android 디바이스로까지 확장할 필요성을 느꼈습니다. Flutter의 도움으로 단일 코드베이스에 의해 멀티 플랫폼을 동시에 지원할 수 있게 되었고, 이를 통해 개발자 수를 줄이고 생산성을 향상시킬 수 있었습니다. 개발자들은 각 플랫폼에 대해 반복적으로 구현할 필요가 없어졌고, 버그 수정이나 기능 변경 시에도 이전에 비해 적은 시간에 모든 플랫폼에 적용할 수 있게 되었습니다. Flutter의 도입은 크로스 플랫폼 반응형 UI 구현을 가능하게 하여, 사용자 경험의 일관성을 높였습니다. 이제 파트너들은 다양한 OS 환경에서 동일한 경험을 하게 되므로, 학습 비용도 줄어들고, 혼란이 줄어드는 장점을 경험하고 있습니다. 이러한 변화는 단순히 기술적인 접근방식이 아닌, 사업의 방향성을 전환하는 계기로 작용했습니다. 파트너사들이 원하는 효율적인 주문 관리 시스템을 제공하기 위해, 기존의 네이티브 아키텍처에서 벗어나 새로운 기술 스택으로 과감히 옮겨갔습니다. Firebase와 같은 클라우드 서비스를 활용하여 실시간 데이터 업데이트와 동기화가 가능하게 되었고, Flutter의 강점을 극대화하여 사용자 친화적인 UI/UX도 구현됐습니다. 이로 인해 즉각적인 피드백을 수렴할 수 있는 구조가 마련됐습니다. 결국 Flutter의 도입은 배달의...

장시간 비동기 작업 RDB 기반 태스크 큐로 해결

전자계약서 시스템의 대용량 엑셀 파일 생성 작업에서 발생한 Kafka 기반의 문제를 해결하기 위해 RDB 기반의 태스크 큐 아키텍처로 변경한 경험을 공유합니다. 이 글에서는 새로운 아키텍처의 구현 과정을 상세히 설명하며, 장시간 비동기 작업의 안정성과 효율성을 향상시키는 방법을 제시합니다. 최종적으로, 이 전환이 조직에 미친 긍정적인 영향을 파악할 수 있을 것입니다.

장시간 비동기 작업 처리의 어려움

장시간 비동기 작업을 처리하는 과정에서는 여러 가지 도전 과제가 존재합니다. 기존의 Kafka 기반 시스템은 대량의 데이터를 처리하는 데 있어 비효율적이었고, 이로 인해 동일 메시지가 중복 처리되는 문제가 발생하였습니다. 특히, 엑셀 파일 생성과 같은 작업은 외부 API 호출로 인해 시간이 소요되기 때문에, 해당 프로세스가 타임아웃에 걸리는 상황이 빈번하게 발생했습니다. 이런 문제점을 해결하기 위해 RDB 기반의 태스크 큐 아키텍처로 전환하는 것이 논의되었습니다. 새로운 아키텍처에서는 요청한 작업을 RDB에 영구적으로 기록함으로써, 상태 관리의 단순화를 이루었습니다. 이제 작업이 진행되는 동안의 상태를 지속적으로 추적할 수 있으며, 비정상적인 종료 시에도 작업 복구가 가능해졌습니다. 이를 통해 각종 장애 상황에서도 데이터 유실이 방지되며, 사용자에게 보다 안정적인 서비스를 제공하게 된 것입니다. 더불어, 이 아키텍처는 작업의 재시도 메커니즘을 자동으로 처리하게 설계되었습니다. 도중에 발생하는 외부 API 오류나 네트워크 문제로 인한 중단이 있더라도 최대 3회까지 작업을 자동으로 재시도합니다. 이를 통해 사용자는 더욱 신뢰할 수 있는 서비스를 경험하게 됩니다. 장기간 소요되는 비동기 작업의 처리에서 이러한 혁신적인 변화는 고객 만족도를 높이는 데 기여할 수 있습니다.

RDB 기반 태스크 큐 아키텍처의 장점

RDB 기반의 태스크 큐 아키텍처 변경은 여러 장점을 가져왔습니다. 첫째, 시스템의 복잡성이 크게 감소했습니다. Kafka와 같은 메시지 스트리밍 시스템을 사용할 경우 디버깅 과정이 복잡해질 수 있습니다. 그러나 RDB를 활용한 단순한 데이터 소스에서는 상태 관리를 용이하게 할 수 있어 개발자들이 더욱 편리하게 시스템을 유지보수할 수 있게 되었습니다. 둘째, 복잡한 메시징 시스템과 달리, RDB는 모든 작업 정보를 한 곳에 모아 관리하므로, 문제 발생 시 정확한 원인 파악이 가능합니다. 이러한 안정성 향상은 시스템 운영에 있어 큰 이점으로 작용했습니다. 특히, Worker가 갑작스럽게 종료되더라도 Heartbeat 메커니즘을 통해 2분 이상 업데이트가 이루어지지 않은 작업을 자동으로 복구할 수 있도록 설계되어, 서비스 중단을 예방하는 데 효과적입니다. 셋째, 기존 시스템에서는 새로운 메시지 패턴에 맞춰 Consumer Group을 조정하는 과정에서 많은 리소스가 소요되었습니다. RDB 기반 아키텍처로의 전환 이후, Worker 수의 수평적 확장이 용이해졌고, 필요시 작업량을 조정할 수 있는 유연성이 생겼습니다. 이로 인해, 시스템의 효율성이 획기적으로 증대하였으며, 일관된 성능을 유지할 수 있게 되었습니다.

안정성을 고려한 소프트웨어 아키텍처 설계

소프트웨어 아키텍처 설계 시 안정성을 진지하게 고려해야 합니다. 전환 프로젝트에서 각 요소는 신뢰성을 보장하는 방향으로 디자인되었습니다. 예를 들어, Worker가 작업을 수행하는 동안 주기적으로 Heartbeat를 갱신하여 상태를 알리고, 만약 서버가 비정상 종료하더라도 작업이 중단되지 않도록 설계되었습니다. 또한, RDB에 영구적으로 저장된 작업 단위는 처리가 필요한 우선순위를 기반으로 적절히 선정되어 동시 다발적인 작업 수행이 가능합니다. 이와 동시에 Redis를 활용한 분산 락을 통해 동일한 작업이 중복해서 처리되는 것을 방지하였습니다. 이러한 메커니즘을 통해 시스템의 일관성과 안정성을 크게 향상시키는 데 기여할 수 있었습니다. 마무리하면, 장시간 비동기 작업 처리에서 RDB 기반 태스크 큐 아키텍처 전환은 시스템의 신뢰성을 크게 높이는 결과를 가져왔습니다. 데이터 유실 문제를 원천적으로 차단하고, 장애 복구 메커니즘을 통해 서비스의 안정성을 극대화하였습니다. 향후에도 이러한 설계를 바탕으로 서비스를 지속적으로 개선해 나가고, 사용자 경험을 한층 향상시키기 위한 노력을 이어갈 것입니다.

이번 변경을 통해 장시간 비동기 작업 관리의 방향성을 재조명할 수 있었습니다. 시스템 아키텍처 선택은 단순히 기술적 요소만 고려할 것이 아니라, 해당 시스템에서 처리하는 작업의 특성과 요구사항을 균형 있게 반영해야 한다는 점을 깨달았습니다. 앞으로도 이 경험을 바탕으로 더 나은 해결책을 모색해 나가고자 합니다.

이 블로그의 인기 게시물

우아한형제들의 실시간 알림 혁신: SSE(Server-Sent Events)로 이룬 효율성과 안정성

우아한 디버깅 툴 개선으로 QA 업무 효율화

물어보새의 진화와 지식 공유 확장