# v3: Google Sheets에서 거래 내역 데이터 읽기 이번 포스트에서는 Google Sheets에서 실제 거래 내역 데이터를 읽어오는 방법에 대해 알아보겠습니다. 우리는 먼저 가져올 데이터의 구조를 TypeScript 인터페이스로 정의하고, `googleapis`를 사용하여 특정 범위의 데이터를 효율적으로 읽어오며, 이를 정의된 인터페이스에 맞게 파싱하는 과정을 다룰 것입니다. 사용자 요구사항에 따라, 우리는 Freee에서 가져온 "매일의 거래 내역"을 Google Sheets에 저장하고, 이 데이터를 읽어올 것입니다. ## 1단계: 거래 내역 데이터 모델 정의 Google Sheets에 저장될 거래 내역의 구조를 예상하여 TypeScript 인터페이스를 정의합니다. 이는 데이터의 일관성을 유지하고 코드의 가독성을 높이는 데 중요합니다. `src/interfaces.ts` 파일을 생성하고 다음 내용을 추가합니다. ```typescript export interface Transaction { date: string; // 거래 날짜 (예: YYYY-MM-DD) description: string; // 거래 내용 amount: number; // 금액 category?: string; // 카테고리 (Vertex AI가 분류할 예정이므로 초기에는 선택 사항) } ``` ## 2단계: Google Sheets API를 사용하여 데이터 읽기 함수 추가 `src/googleSheetClient.ts` 파일에 Google Sheets에서 특정 범위의 데이터를 읽어와 `Transaction` 인터페이스 배열로 반환하는 함수를 추가합니다. `src/googleSheetClient.ts` 파일의 기존 내용에 다음 함수를 추가하거나 수정합니다. ```typescript // ... 기존 import 및 설정 ... import { Transaction } from './interfaces'; // 새로 추가 // ... getGoogleSheetClient 및 testGoogleSheetConnection 함수 ... export const readTransactionData = async (sheetName: string = 'Sheet1'): Promise => { try { const sheets = await getGoogleSheetClient(); const range = `${sheetName}!A:D`; // 예: A열: 날짜, B열: 설명, C열: 금액, D열: 카테고리 const response = await sheets.spreadsheets.values.get({ spreadsheetId: GOOGLE_SHEET_ID, range: range, }); const rows = response.data.values; if (!rows || rows.length === 0) { console.log('읽어올 데이터가 없습니다.'); return []; } // 첫 번째 행은 헤더로 간주하고 건너뛸 수 있습니다. // 여기서는 간단하게 모든 행을 데이터로 처리합니다. const transactions: Transaction[] = rows.map((row: string[]) => ({ date: row[0] || '', description: row[1] || '', amount: parseFloat(row[2]) || 0, // 금액은 숫자로 파싱 category: row[3] || '', })); console.log(`Google Sheets에서 ${transactions.length}개의 거래 내역을 읽어왔습니다.`); return transactions; } catch (error: any) { console.error('Google Sheets에서 데이터를 읽어오는 데 실패했습니다:', error.message); throw error; } }; ``` **주의**: 위 코드에서 `range: '${sheetName}!A:D'`는 Google Sheet의 'Sheet1'이라는 시트에서 A열부터 D열까지의 데이터를 읽는 것을 가정합니다. 실제 Google Sheet의 구조에 따라 범위를 조정해야 합니다. 또한, `parseFloat(row[2])`는 금액이 숫자로 정확히 파싱될 수 있도록 Google Sheet에서 해당 열의 형식을 `숫자` 또는 `통화`로 설정하는 것이 좋습니다. ## 3단계: `index.ts`에서 데이터 읽기 테스트 `src/index.ts` 파일을 수정하여 `readTransactionData` 함수를 호출하고, 읽어온 거래 내역을 콘솔에 출력하여 데이터를 성공적으로 가져왔는지 확인합니다. ```typescript import { testGoogleSheetConnection, readTransactionData } from './googleSheetClient'; const main = async () => { console.log('프로젝트 시작...'); // 기존 연결 테스트 (선택 사항, 개발 중에는 유용) await testGoogleSheetConnection(); // 거래 내역 데이터 읽기 try { const transactions = await readTransactionData('Sheet1'); // 시트 이름 지정 console.log('읽어온 거래 내역:', transactions); } catch (error) { console.error('거래 내역 읽기 중 오류 발생:', error); } console.log('프로젝트 종료.'); }; main().catch(error => { console.error('오류 발생:', error); process.exit(1); }); ``` ## 결론 이제 Google Sheets에 대한 기본적인 연결 설정과 함께, 특정 시트에서 거래 내역 데이터를 읽어와 TypeScript 인터페이스에 맞게 파싱하는 기능까지 구현했습니다. 다음 **v4** 포스트에서는 Freee API에 접근하기 위한 인증 설정 및 기본적인 데이터 가져오기 방법에 대해 다룰 예정입니다. Google Sheet에 샘플 데이터를 추가하여 `npx ts-node src/index.ts` 명령어로 테스트해보시기 바랍니다.