하이브리드 모바일 앱 개발은 웹의 신속한 배포와 광범위한 접근성, 그리고 네이티브 앱의 고성능 및 플랫폼 기능 활용이라는 이점을 동시에 추구합니다. 그러나 웹 뷰와 네이티브 앱 간의 단절은 개발 과정에서 중대한 난관으로 작용해왔습니다. 37signals의 모바일 팀 리더인 Jayes는 이러한 문제점을 해결하기 위해 개발된 Strata 프레임워크를 소개합니다. Strata는 웹과 네이티브 코드 사이의 견고한 가교 역할을 수행하며, 하이브리드 앱의 성능과 사용자 경험을 향상시키는 데 기여하는 핵심적인 솔루션입니다.
기존 하이브리드 앱 개발 방식은 웹 뷰와 네이티브 앱 간의 근본적인 단절로 인해 여러 한계를 내포했습니다. 첫째, 웹 뷰 DOM을 직접 조작하기 위해 앱별 JavaScript를 네이티브 앱 내에 패키징하는 방식은 웹 앱의 작은 변경에도 쉽게 깨지는 매우 취약한 구조를 초래했습니다. 이는 버그 수정 시 새로운 앱 업데이트를 배포하고 앱 스토어의 긴 검수 시간을 기다려야 하는 고통스러운 과정을 의미했습니다. 둘째, 네이티브 앱은 웹 뷰 내에서 발생하는 상태 변화(예: 폼의 유효성 검사 상태, 사용자 입력)를 자동으로 인지하기 어려웠습니다. 웹 뷰 앱에 대한 도메인 지식을 네이티브 앱에 주입하지 않는 한, 웹 뷰 내의 실시간 상황을 파악하기가 매우 어려웠습니다. 셋째, 37signals와 같이 웹 팀과 모바일 팀이 독립적으로 작업하는 환경에서는 웹 디자이너 및 프로그래머가 웹 앱 변경이 네이티브 앱에 미칠 부정적인 영향을 사전에 예측하기 어렵다는 문제가 있었습니다. 이러한 문제점들은 하이브리드 앱의 유지보수 비용을 증가시키고, 사용자 경험의 일관성을 저해하는 주요 원인이었습니다.
이러한 난관들을 해결하기 위해 Strata는 다음과 같은 핵심 원칙들을 기반으로 설계된 컴포넌트 기반 프레임워크를 제공합니다. 첫째, 네이티브 앱은 웹 뷰 내의 DOM 마크업에 대해 어떠한 지식도 가지지 않아야 합니다. 즉, 웹 뷰의 실제 DOM 구조와는 완전히 분리된 추상화된 수준에서 통신이 이루어집니다. 둘째, 네이티브 앱은 앱별 JavaScript를 패키징하지 않습니다. 이는 웹 앱의 변경이 네이티브 앱에 직접적인 영향을 미치지 않도록 하여 개발 및 배포의 독립성을 보장합니다. 셋째, 웹과 네이티브 앱 간의 통신은 표준 JSON 포맷을 통해 이루어집니다. 이를 통해 구조화되고 예측 가능한 데이터 교환이 가능해집니다. 넷째, 웹 앱은 웹 뷰 내의 상태 변화를 네이티브 앱에 능동적으로 전달할 수 있어야 하며, 네이티브 앱 또한 이에 대한 응답을 웹 앱으로 보낼 수 있어야 합니다. 마지막으로, Strata는 점진적 개선(progressive enhancement) 개념을 적극적으로 활용합니다. 이는 새로운 네이티브 기능이 추가되었을 때, 구형 클라이언트 앱에서도 웹 기반의 기본 기능이 여전히 작동하도록 보장하며, 업데이트된 앱에서는 네이티브 기능이 활성화되는 유연한 전환을 가능하게 합니다.
Strata는 웹 코드와 네이티브 앱 코드 사이의 강력한 다리 역할을 수행하며, 특히 웹 앱이 네이티브 컨트롤의 표시 시점과 위치를 결정할 수 있도록 합니다. 즉, 네이티브 앱이 아닌 웹 앱이 네이티브 UI를 ‘구동(driven by the web)’하는 독특한 방식을 채택합니다. Strata는 Rails의 Stimulus JavaScript 프레임워크를 직접 활용하여 웹 컴포넌트에 강력한 기능을 부여합니다. 예를 들어, Hey 앱의 프로필 편집 화면에서 웹 뷰 하단에 위치한 ‘Save’ 버튼을 네이티브 앱 바의 우측 상단으로 이동시키는 시나리오를 통해 Strata의 작동 방식을 명확히 보여줍니다. 웹 컴포넌트는 BridgeComponent
를 확장하여 고유한 이름을 가지고, 네이티브 앱에 ‘connect’ 이벤트를 포함한 JSON 메시지를 전송합니다. 이 메시지에는 버튼의 제목과 같은 데이터가 포함되며, 네이티브 앱에서 이 메시지를 수신하여 해당 제목으로 네이티브 툴바 버튼을 생성합니다. 사용자가 네이티브 버튼을 탭 하면, 네이티브 컴포넌트는 원래의 ‘connect’ 메시지에 대한 응답으로 웹 컴포넌트에 콜백을 통해 메시지를 다시 전달합니다. 이 응답을 받은 웹 컴포넌트는 마치 사용자가 웹 뷰 버튼을 직접 클릭한 것처럼 해당 폼의 submit 이벤트를 트리거하여 폼을 제출합니다. 이러한 과정은 웹 폼의 기존 유효성 검사나 서버 전송 로직을 전혀 변경하지 않고도 완벽하게 네이티브 사용자 경험을 제공합니다. 더불어, Strata는 네이티브 앱이 특정 컴포넌트를 지원하는지 여부에 따라 웹 앱의 동작을 변경할 수 있도록 하여, 네이티브 기능이 지원되는 환경에서는 웹 뷰의 해당 버튼을 자동으로 숨기는 등 매끄러운 사용자 경험 전환을 가능하게 합니다.
이러한 기본 원리를 바탕으로 Strata는 Hey 앱에서 다양한 복잡한 네이티브 UI 및 기능을 웹에서 구동하는 데 활용됩니다. 예를 들어, Hey 앱의 ‘메뉴’ 컴포넌트는 웹에서 메뉴 항목의 제목과 인덱스를 포함한 JSON 데이터를 네이티브 앱으로 전송하면, 네이티브 앱은 이를 기반으로 플랫폼 고유의 메뉴(예: iOS의 Alert Sheet)를 표시하고, 사용자 선택 시 해당 인덱스를 웹으로 다시 전달하여 웹 앱의 관련 로직을 트리거합니다. 이는 웹 팀이 네이티브 UI의 세부 구현에 대한 지식 없이도 풍부한 네이티브 상호작용을 정의할 수 있게 합니다. 이 외에도 Hey 앱에서는 플로팅 액션 바, 텍스트 하이라이트 기능, 플래시 메시지, 내비게이션 버튼, 오버플로우 메뉴, 동적인 페이지 제목을 관리하는 페이지 컴포넌트, 이메일 인쇄 기능, Tricks 텍스트 에디터의 툴바 등 수많은 네이티브 UI 및 기능을 Strata를 통해 웹 기반으로 제어하고 있습니다. 특히 페이지 컴포넌트는 스크롤에 따라 웹 뷰의 제목이 네이티브 앱 바로 이동하는 동적인 애니메이션을 구현하는 등, Strata가 복잡하고 세련된 UI/UX 구현에 얼마나 유용하게 활용될 수 있는지를 명확히 보여줍니다. 이는 웹 개발의 유연성과 네이티브 앱의 성능 및 플랫폼 컨벤션을 결합하는 Strata의 핵심 강점을 증명합니다.
Strata는 웹과 네이티브 앱 간의 격차를 해소하고, 하이브리드 모바일 앱 개발에 있어 새로운 패러다임을 제시하는 강력한 프레임워크입니다. 이를 통해 개발자는 웹의 유연성과 신속한 배포 이점을 유지하면서도, 네이티브 플랫폼의 고유한 사용자 경험과 성능을 최대한 활용할 수 있습니다. Strata의 컴포넌트 기반 접근 방식과 명확한 통신 규약은 웹 및 모바일 개발 팀이 독립적으로 작업하면서도 긴밀하게 통합된 고품질의 하이브리드 앱을 구축할 수 있도록 지원합니다. 결과적으로 Strata는 하이브리드 앱의 복잡성을 줄이고, 점진적 개선을 통해 사용자에게 더욱 풍부하고 일관된 경험을 제공하는 데 핵심적인 역할을 합니다.