Haeminway haeminway
English
기술 노트로
2 분 분량

HtmlService 앱은 껍데기 먼저: 비동기 로드와 모바일 뒤로가기

템플릿에서 긴 데이터 로드를 하면 첫 화면이 늦는다. 껍데기를 먼저 그리고 google.script.run으로 비동기 로드하되, 모든 호출에 실패 핸들러를 붙여라.

HtmlService 템플릿에서 데이터를 통째로 불러오지 마라. 스크립틀릿(<?= ?>)에서 오래 걸리는 로드를 하면 사용자는 빈 화면을 보며 기다린다. 껍데기를 먼저 그리고, 데이터는 google.script.run으로 비동기로 가져온다.

왜 중요한가

모바일에서 첫 화면이 2~3초 늦으면 사용자는 “안 켜진다”고 느낀다. 또 google.script.run은 실패할 수 있는데, 핸들러를 안 붙이면 실패가 조용히 삼켜져 화면이 멈춘 것처럼 보인다.

모든 호출에 실패 핸들러: Promise 래퍼로

function gasRun(fn, ...args) {
  return new Promise((resolve, reject) => {
    google.script.run
      .withSuccessHandler(resolve)
      .withFailureHandler(reject)   // 강제: 실패를 삼키지 마라
      [fn](...args);
  });
}

// 사용
try {
  const data = await gasRun("getItems", filter);
  render(data);
} catch (err) {
  showError(err); // dead overlay 금지, 재시도 경로 제공
}

raw google.script.run 직접 호출은 리뷰에서 막고, 위 래퍼만 쓰게 한다.

모바일 뒤로가기

멀티 화면 앱은 폰의 뒤로가기 버튼을 지원해야 한다. google.script.history로 상태를 push/replace 하면, 화면 전환이 브라우저 히스토리에 들어가 뒤로가기가 자연스럽게 동작한다.

잊지 말 것

  • <base target="_top">: iframe 안에서 링크가 부모를 바꾸게.
  • <meta viewport> + doGet().addMetaTag('viewport', ...) 둘 다: 한쪽만으론 모바일 폭이 깨진다.
  • 자바스크립트는 문서 하단에서 로드해 첫 렌더를 막지 않는다.

핵심 한 줄: 껍데기 먼저 → 비동기 로드(실패 핸들러 필수) → history로 뒤로가기.

자주 묻는 질문

HtmlService 템플릿에서 데이터를 직접 로드하면 왜 문제가 생기나요?
스크립틀릿에서 오래 걸리는 로드를 하면 사용자가 빈 화면을 보며 기다립니다. 특히 모바일에서 2~3초 지연이 생기면 앱이 안 켜진다고 느낍니다.
google.script.run 호출에 실패 핸들러가 없으면 어떻게 되나요?
실패가 조용히 삼켜져 화면이 멈춘 것처럼 보입니다. 모든 호출에 withFailureHandler를 반드시 붙여야 하고, 오류 발생 시 재시도 경로를 사용자에게 제공해야 합니다.
HtmlService 멀티 화면 앱에서 모바일 뒤로가기를 지원하려면?
google.script.history로 화면 전환 상태를 push 또는 replace하면 변환이 브라우저 히스토리에 기록되어 뒤로가기 버튼이 자연스럽게 동작합니다.