Google Apps Script를 활용한 통장 입출금 조회 자동화

1. 개요

배경

평소에 입출금 거래내역, 잔액 등 각 은행 별 계좌별 데이터를 조회하는 일은 번거울 뿐만 아니라 실시간으로 이용하기도 어려웠다. 그래서 이런 일을 자동화하는 앱을 직접 개발해보기로 했다.

하지만 금융정보 조회 앱들은 인프라 비용이 만만치 않고, 보안 요구사항이 복잡하면서도 엄청 까다롭다. 특히 개인이 사이드 프로젝트로 진행하기에는 서버 구축, 데이터베이스 관리, 보안 인증서 등 많은 비용과 어려움이 뒤따른다.

Google Apps Script의 서버리스 아키텍처Google Sheets의 무료 스토리지를 활용하면, 그리고 다음과 같은 제한된 조건에서만 이용한다면, 복잡성과 난이성을 줄이고 이 문제들을 근본적으로 해결할 수 있다.

  1. 내가 개설한 여러 은행, 여러 계좌의 정보를 "조회"하는 기능만 이용한다.

  2. 앱으로 만들어서 공유하거나 배포하지는 않고 "나(지인 포함)"만 사용한다.

  3. 실시간/현장성을 위해서 PC는 물론, 내 핸드폰에서도 이용할 수 있어야 한다.

  4. API, 토큰 사용 이외의 일체의 비용은 지불하지 않는다.

  5. 여러 은행 계좌 거래내역 통합

프로젝트 정의

프로젝트명: gas_pjt (Google Apps Script Project)
목표: 각 사용자가 자신의 은행 거래내역을 실시간으로 조회하고,
      자동으로 개인 구글 드라이브에 저장하는 모바일 앱 개발

핵심 가치

요소

전통 방식

gas_pjt

인프라 비용

월5-15만원 이상

0원

개발 시간

8-12주

1주 이내

데이터 관리

중앙 DB 필요

사용자 구글드라이브

보안

자체 구현 필요

Google 기본 제공

확장성

낮음

높음 (서버리스)

2. 기술 아키텍처

시스템 구조

┌─────────────────────────────────────────────────────────┐
│            Google Apps Script                           │
│  - 액션 라우팅 (Code.gs)                               │
│  - CODEF API 연동 (CODEF.gs)                           │
│  - 구글 시트 관리 (SheetManager.gs)                    │
│  - 유틸리티 함수 (Utils.gs)                            │
└────┬─────────────────────────────────────────────────┬──┘
     │                                                  │
     │ REST API                                   Google API
     │                                                  │
┌────▼──────────────────┐                    ┌────────▼──────┐
│   CODEF API           │                    │ Google Sheets │
│ (은행 거래내역)       │                    │ (사용자별)    │
│                       │                    │               │
│ - 실명계좌 인증       │                    │ - 데이터 조회   │
│ - 거래내역 조회       │                    │ - 데이터 격리 │
└───────────────────────┘                    └───────────────┘

데이터 흐름

거래내역 조회

웹페이지 → Apps Script → CODEF API → 은행 시스템
             ↓
         응답 수신
             ↓
웹페이지 ← Apps Script ← 구글 시트 저장 ← 데이터 처리

데이터 저장

  • 조회된 거래내역을 JSON으로 파싱

  • 중복 필터링 로직 실행

  • 사용자의 개인 구글 시트에 자동 저장

보안 메커니즘

문제: 금융정보 보호

로그인 정보를 서버에 저장하면?
- 해킹 위험
- 규제 준수 어려움
- 사용자의 신뢰 획득 어려움

해결책: 로컬 암호화 저장

은행/계좌 정보는 사용자의 로컬 디바이스에만 저장
→ 서버에 민감한 정보 저장 안 함

Apps Script 권한 설정

배포 설정:
- 실행 주체: "나로 실행"
  → Apps Script가 사용자 권한으로 실행
  → 각 사용자의 드라이브에만 접근 가능
  → 데이터 자동 격리 (사용자 신뢰 획득)

3. 개발 계획

주요 기능

  1. Google Sign-In: 사용자 인증

  2. 은행 계좌 등록: 은행명, 계좌번호, 로그인 정보

  3. 거래내역 조회: 실시간 조회 및 기간 필터링

  4. 구글 시트 연동: "구글 시트에서 보기" 버튼

  5. 다중 계좌 지원: 여러 은행 계좌 관리

Google Apps Script 선택 이유

선택

대안

이유

Apps Script

AWS Lambda, Firebase

무료, Google 통합, 배포 간단

Google Sheets

MongoDB, PostgreSQL

무료, 사용자별 데이터 격리 용이

보안문제 해결방안

Q: 왜 사용자 계정 정보를 서버에 보내지 않나?

A: 사용자 외에는 내 데이터를 활용할 수 없게 한다 (개발자 조차)

- Apps Script는 사용자 권한으로만 실행
- 중앙(통합) 데이터베이스 없음
- 각 사용자의 드라이브에만 접근

배포 (지인 대상)

전통 모델 (복잡): 개발자 → 자체 서버 운영 → 사용자 데이터 관리 (보안 책임, 비용)

gas_pjt 모델 (단순): 개발자 → Apps Script (배포 완료) ↓ 사용자1 → 자신의 구글 드라이브 사용자2 → 자신의 구글 드라이브 사용자3 → 자신의 구글 드라이브 (각자 독립적 운영)

4. 주요 함수 개발

Code.gs - 메인 엔드포인트

주요 기능:
- HTTP 요청 라우팅
- 액션별 핸들러 분기
- 에러 처리 및 로깅
- JSON 응답 포맷팅

구현된 액션:
- fetchTransactions: 은행 거래내역 조회
- loadTransactions: 저장된 내역 불러오기
- getSheetUrl: 사용자 시트 URL 반환

CODEF.gs - 은행 API 연동

핵심 기능:
- CODEF API 토큰 발급
- 인증 토큰 캐싱 (효율성)
- 계좌 거래내역 조회
- API 에러 처리

보안 설정:
- 스크립트 속성으로 클라이언트 ID/Secret 관리
- 토큰을 메모리에만 저장 (로그 기록 안 함)
- API 응답 검증

API 호출 구조:

1. 토큰 요청 → CODEF 서버
2. 액세스 토큰 획득 → 캐시
3. 계좌 거래내역 요청 → Bearer 토큰 사용
4. JSON 응답 파싱 → 앱에 반환

SheetManager.gs - 데이터 저장

핵심 기능:
- 사용자별 구글 시트 생성
- 거래내역 자동 저장
- 중복 데이터 필터링
- 시트 URL 생성

설계 원칙:
- 각 사용자 = 별도 시트 (데이터 격리)
- 자동 생성 및 관리 (사용자 개입 없음)
- 구글 네이티브 기능 활용 (내보내기, 공유 등)

Utils.gs - 유틸리티

기능:
- 로깅 함수
- JSON 응답 생성
- 타임스탬프 처리
- 에러 메시지 포맷팅
한국어로 된 코드 편집기의 스크린샷

5. 핵심 구현기술

중복데이터 필터링

  • 사용자가 같은 날짜 같은 데이터를 여러 번 조회되는 가능성을 차단하여 사용자의 오해를 방지

해결방안:

// SheetManager.gs에서 중복 감지
function filterDuplicateTransactions(newTransactions, existingData) {
  const transactionIds = new Set();

  // 기존 데이터의 ID 수집
  existingData.forEach(row => {
    transactionIds.add(row[0]); // 거래 고유ID
  });

  // 새 거래 중 중복 제거
  return newTransactions.filter(tx => {
    return !transactionIds.has(tx.transactionId);
  });
}

구글 시트 자동 생성

  • 사용자가 매번 시트를 수동으로 만들어야 한다면, 귀찮아서 결국은 이용하지 않게 됨. 여러 은행의 서로 다른 데이터를 일관된 데이터 포맷으로 가져와서 조회

해결방안:

// SheetManager.gs에서 자동 생성
function createOrGetSheet() {
  const userEmail = Session.getActiveUser().getEmail();
  const fileName = `입출금현황_${userEmail}_${new Date().getTime()}`;

  // 기존 시트가 있는지 확인
  const folders = DriveApp.getFoldersByName('입출금현황');
  if (folders.hasNext()) {
    const folder = folders.next();
    return folder; // 기존 폴더 사용
  }

  // 없으면 새로 생성
  const spreadsheet = SpreadsheetApp.create(fileName);
  const sheet = spreadsheet.getActiveSheet();

  // 헤더 추가
  sheet.appendRow(['거래일자', '적요', '입금액', '출금액', '잔액']);

  return spreadsheet;
}

6. 배포 및 운영

Step 1: Apps Script 프로젝트 생성 https://script.google.com → 새 프로젝트

Step 2: 스크립트(코드) 작성 Code.gs, CODEF.gs, SheetManager.gs, Utils.gs

Step 3: 스크립트 속성 설정 CODEF_CLIENT_ID, CODEF_CLIENT_SECRET

Step 4: Web 배포 배포 → 새 배포 → 웹 앱 실행 주체: 나 / 액세스 권한: 누구나

Step 5: 웹페이지 URL https://script.google.com/macros/s/....../exec

구글 분석
Google 중국어 스프레드시트의 스크린샷

7. 결과 및 향후 계획

결과

  1. 비용 0

  • 개인 프로젝트로 운영 가능한 모델

  • 수백 명 규모까지 비용 증가 없음

  1. 보안

  • 데이터 격리 + 로컬 암호화 + 권한 기반 접근

  • 금융 데이터 안전하게 처리

  1. 쉬운 확장성 확보

배운점

1. 복잡하고 어려운 개발문제는 사용범위를 제한하면 회피할 수도 있다

  • Google Apps Script → 인증 문제, 서버 등 개발 인프라 문제, 보안 문제에서 해방

  • 비용 제약 → 서버리스 선택

  • 서버리스 → 데이터 격리 설계

  • 데이터 격리 → 보안성 향상

2. MVP로부터 시작한다

  • 모든 기능이 필요한 것은 아니다

  • 핵심 기능만으로 가치 전달 가능

  • 사용자 피드백으로 확장 기회가 보장된다

3. 무료 도구의 한계를 이해하자

  • Google Apps Script: 실질적으로 무제한(20만?) 호출

  • 극단적 트래픽 전에는 최적의 선택

누가 이 모델을 사용할 수 있나?

✓ 적합한 대상:

  • 개인

  • 스타트업 CEO

  • 학습 프로젝트

  • 지인 10-50명 규모 커뮤니티 (예: 모임 통장)

✗ 부적합한 대상:

  • 수많은 사용자 서비스

  • 실시간 대규모 거래

  • SLA가 필수적인 서비스

  • 고도의 커스터마이징 필요

향후계획

Flutter 활용 모바일 앱 UI 개발

1
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요