웹사이트를 구글 플레이 스토어 앱으로 출시하기까지
OzKoStage는 Next.js로 만든 웹앱입니다. 어느 날 보니 공연 날짜가 한참 지난 작품이 메인 페이지에 여전히 "공연 예정"이라고 떠 있었습니다. 관리자가 DB의 상태값을 일일이 손으로 바꾸는 구조였는데, 누군가 깜빡하면 이런 일이 생깁니다. 이걸 고치면서 동시에 "이 서비스, 앱으로도 내보내면 어떨까"라는 생각을 했습니다.
날짜가 거짓말을 하지 않는다
첫 번째 문제부터 해결했습니다. 공연 상태를 사람이 손으로 입력하는 대신, 공연 시작일과 종료일을 기준으로 매번 자동 계산하도록 바꿨습니다. 종료일이 오늘보다 이전이면 '종료', 시작일이 오늘이거나 이전이면 '공연 중', 그 외에는 '예정'으로 처리합니다. 이 로직을 공연 상태가 표시되는 모든 페이지에 적용했습니다. 이제 관리자가 신경 쓰지 않아도 날짜가 알아서 정리합니다.
구글이 우리 페이지를 안 읽어준다
Google Search Console을 열어보니 경고가 한 무더기였습니다. "중복 페이지", "발견됨 - 색인되지 않음", "리디렉션 포함 페이지"... 원인을 하나씩 추적해보니 canonical 태그가 어디에도 없었고, 로그인·회원가입 같은 페이지까지 검색엔진이 긁어가고 있었습니다. 사이트맵의 URL이 localhost를 가리키고 있기도 했습니다. 하나씩 고쳤습니다.
웹을 다시 만들지 않고 앱으로 확장하기
PWA는 이미 구성되어 있었습니다. 그런데 "홈 화면에 추가" 안내를 끝까지 따라할 사용자가 얼마나 될까요? 그래서 TWA(Trusted Web Activity) 방식으로 포장해서 구글 플레이 스토어에 올려보기로 했습니다. 네이티브 코드를 한 줄도 쓰지 않고 웹사이트를 안드로이드 앱으로 패키징하는 방식입니다.
PWABuilder로 패키징하기
PWABuilder 사이트에 OzKoStage URL을 넣으면 manifest를 분석해서 점수를 보여줍니다. 부족한 항목(manifest의 id 필드 등)을 채워주고 나니 점수가 올라갔습니다. 이후 "Package For Stores"에서 Android를 선택하고 패키지 ID와 앱 이름을 입력하면, .aab 파일, 서명 키, assetlinks.json이 들어있는 zip 파일을 받을 수 있습니다.
여기서 받은 assetlinks.json을 웹사이트의 /.well-known/assetlinks.json 경로에 올려야 합니다. 이 파일이 "이 앱과 이 웹사이트는 같은 주인이다"를 증명합니다. 이 파일이 없으면 앱이 브라우저처럼 주소창을 달고 실행됩니다.
플레이 콘솔에서 만난 함정
가장 헷갈렸던 부분은 서명 키 지문이 두 개라는 점이었습니다. PWABuilder가 준 assetlinks.json에는 "업로드 키" 지문이 들어있지만, Google Play 앱 서명을 켜면 실제 배포 앱에는 구글이 재서명한 지문이 사용됩니다. 즉, Play Console에서 직접 확인한 "앱 서명 키" 지문으로 assetlinks.json을 교체해야 합니다. .aab 파일을 최소 한 번 업로드해야 이 지문이 생성된다는 점도 알아두세요.
검토는 생각보다 오래 걸린다
내부 테스트 트랙은 즉시 배포되는 줄 알았는데, 최초 1회는 구글 기본 검토를 거칩니다. 몇 시간 기다리니 검토가 끝나고 테스터 링크가 정상 작동했습니다. 정식 출시를 위한 프로덕션 트랙으로 이동할 때는 14일 이상의 내부 테스트 기간이 필요합니다.
얻은 것
이번 작업을 정리하면 세 가지였습니다. 사람이 깜빡하는 부분을 코드가 대신 계산하게 만들기, 검색엔진이 사이트를 제대로 읽도록 기본기를 챙기기, 그리고 웹을 다시 만들지 않고 앱으로 확장하기. 특별히 새로운 기술은 없었습니다. 작은 디테일 하나하나가 사용자 경험과 검색 노출, 앱스토어 등록을 결정한다는 걸 다시 확인한 작업이었습니다.
