앱스크립트 콘솔을 Go로 옮기기: 인터페이스와 상태 설계

English version

TECH INSIGHT / EXPLAINED

Apps Script 웹 콘솔을 Go로 옮기는 일은 인터페이스 계약과 운영을 옮기는 작업입니다. 브라우저 요청·응답을 먼저 보존한 뒤 장기 실행 작업을 그 뒤로 이동합니다. 아래 내용은 특정 운영 이력 주장이 아닌 구체적인 이식 설계 예시입니다.

동료 세 명이 Apps Script에서 Go로의 이식 계약 주제를 그림으로 설명하는 모습
이해를 돕기 위한 AI 생성 설명 일러스트. 실제 운영 화면이나 실적 자료가 아닙니다.

실제 프로젝트의 로컬 실행 화면

기존 프로젝트의 화면 또는 함수를 로컬에서 실행해 촬영했습니다. 개인정보 없는 샘플 입력을 사용했으며, 실행한 범위는 각 이미지 아래에 설명했습니다.

OnStockBot 원본 GAS 콘솔 HTML을 로컬 브라우저에서 실행한 화면. getParameters만 샘플 값으로 대체했고 봇은 OFF 상태다. 실제 GAS 배포·증권사 조회·주문 실행 결과가 아니다.
OnStockBot 원본 GAS 콘솔 HTML을 로컬 브라우저에서 실행한 화면. getParameters만 샘플 값으로 대체했고 봇은 OFF 상태다. 실제 GAS 배포·증권사 조회·주문 실행 결과가 아니다.
원본 GAS 콘솔의 getParameters 실패 콜백에 로컬 테스트 오류를 전달한 결과. 화면 하단에 설정 로드 오류가 기록되고 봇은 OFF 상태다. 이식할 때 보존해야 할 실패 표시 경로를 확인한 것으로 실제 서버 장애나 주문 실패 기록은 아니다.
원본 GAS 콘솔의 getParameters 실패 콜백에 로컬 테스트 오류를 전달한 결과. 화면 하단에 설정 로드 오류가 기록되고 봇은 OFF 상태다. 이식할 때 보존해야 할 실패 표시 경로를 확인한 것으로 실제 서버 장애나 주문 실패 기록은 아니다.

실제 제약 때문에 옮긴다

Apps Script에는 실행·서비스 할당량이 있으므로 모든 트리거가 같은 6분 규칙이라고 가정하지 말고 계정과 트리거 종류를 확인합니다. 동시성 제어용 LockService, 값 보존용 PropertiesService, 로컬 개발용 clasp도 제공합니다. 직접 소유한 장기 실행 프로세스와 I/O 제어가 필요하면 Go가 유용하지만 호스팅·패치·인증 책임도 생깁니다.

요청과 응답의 계약을 기록한다

의미가 같을 때 액션 이름을 유지합니다. 상태 코드, 필드 타입, null/오류, 날짜, 권한 규칙도 맞춰야 합니다. google.script.run을 쓰는 브라우저에는 전송 계층 어댑터가 필요하므로 액션 이름만 같다고 프런트엔드가 그대로 동작하지는 않습니다. 예시 계약은 다음과 같습니다.

POST /api {"action":"startBot","request_id":"start-17"}
200 {"ok":true,"data":{"state":"running","generation":8}}
POST /api {"action":"startBot","request_id":"start-17"}
200 {"ok":true,"data":{"state":"running","generation":8}}

시작·정지를 멱등하게 만든다

수명주기 잠금 안에서 STOPPED를 확인하고 STARTING과 세대 번호를 정한 뒤 context/cancel과 작업자 하나를 만듭니다. 반복 시작은 기존 상태를 반환합니다. 정지는 해당 세대를 취소하고 done을 기다리며, 일치하는 세대만 STOPPED로 바꿀 수 있습니다. 취소는 협조적입니다. 상태 확인 없이 시작하면 두 루프가 생기고 하나뿐인 cancel 함수가 덮어써질 수 있습니다.

조회부터 비교하고 쓰기를 전환한다

민감한 정보를 제거한 요청 표본을 양쪽에서 재생해 정규화한 응답을 비교합니다. 조회를 먼저 옮긴 뒤 중복 방지 키가 있는 쓰기 하나를 전환하세요. 롤백 중 구·신 스케줄러가 동시에 행동하지 않도록 합니다. 상태는 선택한 저장소에 보존하고 재시작 후 외부 효과를 대사합니다. 메모리 상태는 편하지만 충돌하면 사라집니다. 대상 OS/아키텍처로 빌드하고 cgo 등의 의존성도 확인하세요.

공식 문서와 이어 읽기

내용·예제 검토: 2026-09-29

댓글