Ruby on Rails를 활용한 PWA(Progressive Web App) 구축 가이드

Emmanuel Hayford - Progressive Web Apps for Rails developers - Rails World 2024 - YouTube

3줄 요약

  • PWA는 오프라인 지원, 푸시 알림, 캐싱을 통해 사용자 경험을 향상시키며, 앱 스토어 검토 없이 배포 가능한 웹 애플리케이션입니다.
  • Rails 8은 PWA 구축을 위한 Manifest 파일, 서비스 워커, 보안 컨텍스트 설정을 기본적으로 지원합니다.
  • 서비스 워커와 Cache API를 활용하여 오프라인에서 정적 파일을 제공하고, Background Sync API와 IndexDB를 통해 오프라인 데이터 전송 기능을 구현할 수 있습니다.

PWA(Progressive Web App)는 웹의 접근성과 네이티브 앱의 기능을 결합한 형태로, 열악한 네트워크 환경에서도 안정적인 앱 가용성을 제공하고, 푸시 알림을 통한 사용자 재참여를 유도하며, 효율적인 캐싱 시스템을 통해 서버 부하를 줄일 수 있는 이점을 가집니다. 이는 앱 스토어의 번거로운 검토 절차와 전담 개발팀 운영 비용 없이도 네이티브 앱과 유사한 사용자 경험을 제공할 수 있어 Tinder, Pinterest, Starbucks, Lyft와 같은 글로벌 기업들이 이미 PWA를 적극적으로 활용하고 있습니다. 본 발표에서는 Ruby on Rails 8을 기반으로 PWA를 구축하는 구체적인 단계와 주요 기술 요소들을 심층적으로 다룹니다.

PWA의 핵심 구성 요소

PWA는 크게 세 가지 핵심 요소로 구성됩니다. 첫째, 웹 애플리케이션의 메타데이터를 정의하는 Web Application Manifest 파일(manifest.json)로, 웹 앱을 설치 가능하게 만들고 네이티브 앱과 같은 느낌을 제공합니다. 둘째, 웹 앱과 인터넷 사이의 중개자 역할을 하는 Service Worker입니다. 서비스 워커는 별도의 스레드에서 실행되며, 캐싱, 푸시 알림, 백그라운드 동기화와 같은 기능을 담당하여 오프라인 지원을 가능하게 합니다. 셋째, Secure Context로, 모든 PWA는 HTTPS 또는 localhost 환경에서 실행되어야 합니다.

Rails 8에서의 PWA 설정

Rails 8은 PWA 구축을 위한 기본 파일들을 제공하여 설정을 간소화합니다. app/views/pwa 폴더 내에 manifest.json.erb와 서비스 워커 파일이 존재하며, 개발자는 HTML <head> 태그 내의 매니페스트 파일 링크와 서비스 워커 및 매니페스트 파일을 제공하는 라우트를 주석 해제하는 것만으로 기본적인 PWA 설정을 완료할 수 있습니다. 이후, application.js 파일에서 navigator.serviceWorker.register 메서드를 사용하여 서비스 워커를 등록하면 웹 브라우저는 PWA를 인식하고 설치 가능한 앱으로 동작하게 됩니다.

오프라인 캐싱 전략

PWA의 강력한 기능 중 하나는 오프라인 환경에서의 동작입니다. 이는 Cache API를 통해 구현됩니다. Cache API는 개발자가 캐싱할 대상을 프로그래밍 방식으로 제어할 수 있게 하며, install 이벤트 리스너에서 caches.opencache.addAll 메서드를 사용하여 필요한 정적 자산(HTML, CSS, JS 등)을 캐시에 미리 저장할 수 있습니다. 또한, fetch 이벤트 리스너를 통해 네트워크 요청을 가로채고, 캐시에 저장된 응답이 있다면 이를 즉시 제공하고, 없다면 네트워크에서 가져온 후 캐시에 저장하여 다음 요청 시 활용하는 전략을 사용할 수 있습니다. 네트워크 연결이 완전히 끊어졌을 경우, 미리 정의된 오프라인 대체 페이지를 제공하여 사용자 경험을 유지합니다.

오프라인 데이터 동기화

PWA는 단순히 정적 파일 제공을 넘어, 사용자가 오프라인 상태에서 생성한 데이터를 네트워크 연결 복구 시 서버로 전송하는 Background Sync APIIndexDB를 활용한 데이터 저장 기능을 제공합니다. idb-keyval 라이브러리는 복잡한 IndexDB API를 추상화하여 키-값 형태로 데이터를 쉽게 저장하고 검색할 수 있도록 돕습니다. 사용자가 오프라인 상태에서 데이터를 제출하면, 해당 데이터는 IndexDB에 저장되고, syncManager.register를 통해 동기화 이벤트를 등록합니다. 네트워크 연결이 복구되면 서비스 워커의 sync 이벤트 리스너가 트리거되어 IndexDB에 저장된 데이터를 가져와 Rails 백엔드로 전송하고, 성공적으로 전송된 데이터는 IndexDB에서 삭제됩니다. Rails 백엔드에서는 표준적인 create 액션을 통해 데이터를 처리합니다.

푸시 알림 및 미래 전망

푸시 알림 기능은 서비스 워커 등록, 사용자 권한 요청, 푸시 구독 데이터 서버 전송 및 저장, 그리고 필요 시 푸시 메시지 전송과 같은 복잡한 단계를 거칩니다. 하지만 Rails 8.1에서는 Action Notifier 프레임워크가 도입될 예정으로, 이 복잡한 과정을 훨씬 간소화할 것으로 기대됩니다. 이는 Rails 개발자들이 PWA의 모든 기능을 더욱 쉽게 통합할 수 있도록 지원할 것입니다.

결론적으로, PWA는 사용자에게 네이티브 앱과 같은 풍부한 경험을 제공하면서도 웹의 장점을 유지하는 강력한 기술입니다. Ruby on Rails 8은 매니페스트 파일과 서비스 워커의 기본 지원을 통해 PWA 개발을 용이하게 하며, `Cache API`를 통한 오프라인 자산 관리와 `Background Sync API`, `IndexDB`를 활용한 오프라인 데이터 동기화는 PWA의 핵심 기능을 구현하는 데 필수적입니다. 향후 Rails 8.1에서 도입될 `Action Notifier`와 같은 추가적인 기능들은 PWA 개발을 더욱 가속화할 것입니다. 이러한 발전은 Rails 개발자들이 더욱 견고하고 사용자 친화적인 웹 애플리케이션을 구축할 수 있도록 기여할 것입니다.