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

- 작성자: [매실](https://community.clauders.ai/member/imported-member-rsROj8JjWs)
- 공간: [에이전트 / 노코드 자동화](https://community.clauders.ai/automation)
- 게시: 2026-01-26
- 연재: [내 업무에 맞춘 자동화](https://community.clauders.ai/series/custom-workflow-automation) 4/4편
- 태그: #맞춤형자동화
- 주소: https://community.clauders.ai/automation/post/google-apps-script%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%ED%86%B5%EC%9E%A5-%EC%9E%85%EC%B6%9C%EA%B8%88-%EC%A1%B0%ED%9A%8C-%EC%9E%90%EB%8F%99%ED%99%94-62d9b7bd-63c5-8354-ad34-4e0c061cbff7

---

### **배경**

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

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

**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 기본 제공

**확장성**

낮음

높음 (서버리스)

### **시스템 구조**

```
┌─────────────────────────────────────────────────────────┐
│            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가 사용자 권한으로 실행
  → 각 사용자의 드라이브에만 접근 가능
  → 데이터 자동 격리 (사용자 신뢰 획득)
```

### **주요 기능**

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 → 자신의 구글 드라이브 (각자 독립적 운영)

### **중복데이터 필터링**

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

**해결방안**:

```
// 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;
}
```

### **결과**

1. 비용 0

- 개인 프로젝트로 운영 가능한 모델
- 수백 명 규모까지 비용 증가 없음

1. 보안

- 데이터 격리 + 로컬 암호화 + 권한 기반 접근
- 금융 데이터 안전하게 처리

1. 쉬운 확장성 확보

### **배운점**

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

- Google Apps Script → 인증 문제, 서버 등 개발 인프라 문제, 보안 문제에서 해방
- 비용 제약 → 서버리스 선택
- 서버리스 → 데이터 격리 설계
- 데이터 격리 → 보안성 향상

**2. MVP로부터 시작한다**

- 모든 기능이 필요한 것은 아니다
- 핵심 기능만으로 가치 전달 가능
- 사용자 피드백으로 확장 기회가 보장된다

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

- Google Apps Script: 실질적으로 무제한(20만?) 호출
- 극단적 트래픽 전에는 최적의 선택

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

✓ 적합한 대상:

- 개인
- 스타트업 CEO
- 학습 프로젝트
- 지인 10-50명 규모 커뮤니티 (예: 모임 통장)

✗ 부적합한 대상:

- 수많은 사용자 서비스
- 실시간 대규모 거래
- SLA가 필수적인 서비스
- 고도의 커스터마이징 필요

### **향후계획**

Flutter 활용 모바일 앱 UI 개발
