# v2: Google Sheets API 연동을 위한 인증 설정 이번 포스트에서는 Freee에서 가져온 거래 내역을 저장할 Google Sheets에 접근하기 위한 인증 설정을 다룹니다. 우리는 서비스 계정을 사용하여 서버 애플리케이션이 사용자 개입 없이 Google Sheets API에 접근할 수 있도록 할 것입니다. ## 1단계: Google Cloud Platform (GCP) 프로젝트 설정 1. **GCP 콘솔 접속**: 웹 브라우저에서 [Google Cloud Console](https://console.cloud.google.com/)에 접속하여 로그인합니다. 2. **프로젝트 선택 또는 생성**: 상단의 프로젝트 선택 드롭다운에서 기존 프로젝트를 선택하거나, 새로운 프로젝트를 생성합니다. (예: `Freee-Sheets-Integration`) 3. **Google Sheets API 활성화**: * 좌측 메뉴에서 `API 및 서비스` > `라이브러리`로 이동합니다. * 검색창에 "Google Sheets API"를 입력하고 검색합니다. * 검색 결과에서 "Google Sheets API"를 선택하고 `사용 설정` 버튼을 클릭합니다. ## 2단계: 서비스 계정 생성 및 키 다운로드 서비스 계정은 애플리케이션이 Google API와 상호작용할 때 사용되는 특별한 유형의 Google 계정입니다. 1. **서비스 계정 페이지 접속**: 좌측 메뉴에서 `IAM 및 관리자` > `서비스 계정`으로 이동합니다. 2. **서비스 계정 생성**: 상단의 `서비스 계정 만들기` 버튼을 클릭합니다. * **서비스 계정 이름**: (예: `freee-sheets-service`)를 입력합니다. 서비스 계정 ID가 자동으로 생성됩니다. * `만들고 계속하기`를 클릭합니다. 3. **역할 부여 (선택 사항)**: 이 단계는 건너뛰어도 되지만, 필요하다면 적절한 역할을 부여할 수 있습니다. (예: `프로젝트` > `편집자` 또는 `서비스 계정 사용자`) 4. **키 생성 및 다운로드**: * `만들고 계속하기`를 클릭한 후, `완료`를 클릭합니다. * 생성된 서비스 계정 목록에서 방금 만든 서비스 계정을 클릭합니다. * `키` 탭으로 이동하여 `키 추가` > `새 키 만들기`를 클릭합니다. * 키 유형으로 `JSON`을 선택하고 `만들기`를 클릭합니다. **서비스 계정 키 파일 (JSON 형식)이 자동으로 다운로드됩니다.** 이 파일은 애플리케이션에서 Google Sheets API에 접근하는 데 사용되므로 **안전하게 보관**해야 합니다. 프로젝트 루트 디렉토리에 `credentials/` 디렉토리를 만들고 그 안에 저장하는 것을 권장합니다. (예: `credentials/freee-sheets-service-key.json`) ## 3단계: 서비스 계정에 Google Sheet 접근 권한 부여 다운로드한 JSON 키 파일에는 서비스 계정의 이메일 주소가 포함되어 있습니다. 이 이메일 주소에 Google Sheet에 대한 접근 권한을 부여해야 합니다. 1. **서비스 계정 이메일 확인**: 다운로드한 JSON 키 파일을 열어 `client_email` 필드의 값을 확인합니다. (예: `freee-sheets-service@your-project-id.iam.gserviceaccount.com`) 2. **Google Sheet 공유**: Freee 거래 내역을 저장할 Google Sheet를 열고, 우측 상단의 `공유` 버튼을 클릭합니다. 3. **권한 추가**: `사용자 및 그룹과 공유` 섹션에 서비스 계정의 이메일 주소를 입력하고, `편집자` 권한을 부여한 후 `보내기` 버튼을 클릭합니다. ## 4단계: 환경 변수 업데이트 프로젝트 `.env` 파일에 서비스 계정 키 파일의 경로를 추가합니다. ```ini # .env 파일 예시 GOOGLE_DOCUMENT_ID=12TdK5xep5OSyf8PEXnaVkG0qATIu7sHcLAGFPHFD3rw FREEE_CLIENT_ID="YOUR_FREEE_CLIENT_ID" FREEE_CLIENT_SECRET="YOUR_FREEE_CLIENT_SECRET" FREEE_ACCESS_TOKEN="YOUR_FREEE_ACCESS_TOKEN" GOOGLE_SERVICE_ACCOUNT_KEY_PATH="./credentials/freee-sheets-service-key.json" ``` ## 5단계: Google Sheets API 연동 테스트 코드 작성 이제 `googleapis` 라이브러리를 사용하여 서비스 계정으로 Google Sheets에 접근하는 코드를 작성하고 테스트할 차례입니다. `src/googleSheetClient.ts` 파일을 생성하고 다음 내용을 추가합니다. ```typescript import { google } from 'googleapis'; import * as path from 'path'; import * as dotenv from 'dotenv'; dotenv.config(); const GOOGLE_SHEET_ID = process.env.GOOGLE_DOCUMENT_ID; const GOOGLE_SERVICE_ACCOUNT_KEY_PATH = process.env.GOOGLE_SERVICE_ACCOUNT_KEY_PATH; if (!GOOGLE_SHEET_ID) { throw new Error('환경 변수 GOOGLE_DOCUMENT_ID가 설정되지 않았습니다.'); } if (!GOOGLE_SERVICE_ACCOUNT_KEY_PATH) { throw new Error('환경 변수 GOOGLE_SERVICE_ACCOUNT_KEY_PATH가 설정되지 않았습니다.'); } const auth = new google.auth.GoogleAuth({ keyFile: path.resolve(GOOGLE_SERVICE_ACCOUNT_KEY_PATH), scopes: ['https://www.googleapis.com/auth/spreadsheets'], }); export const getGoogleSheetClient = async () => { const authClient = await auth.getClient(); return google.sheets({ version: 'v4', auth: authClient }); }; export const testGoogleSheetConnection = async () => { try { const sheets = await getGoogleSheetClient(); const response = await sheets.spreadsheets.values.get({ spreadsheetId: GOOGLE_SHEET_ID, range: 'Sheet1!A1', // 예시로 Sheet1의 A1 셀을 읽습니다. }); console.log('Google Sheets 연결 성공! A1 셀 값:', response.data.values); return response.data.values; } catch (error) { console.error('Google Sheets 연결 실패:', error.message); throw error; } }; ``` 다음으로, `src/index.ts` 파일을 업데이트하여 `testGoogleSheetConnection` 함수를 실행합니다. ```typescript import { testGoogleSheetConnection } from './googleSheetClient'; const main = async () => { console.log('프로젝트 시작...'); await testGoogleSheetConnection(); console.log('프로젝트 종료.'); }; main().catch(error => { console.error('오류 발생:', error); process.exit(1); }); ``` 이제 모든 설정이 완료되었습니다. 프로젝트 루트 디렉토리에서 다음 명령어로 테스트 코드를 실행할 수 있습니다. ```bash npx ts-node src/index.ts ``` 이 명령어를 실행하면, 서비스 계정 키가 올바르게 설정되고 Google Sheet에 접근 권한이 있다면, 콘솔에 "Google Sheets 연결 성공!" 메시지와 A1 셀의 값이 출력될 것입니다. --- 다음 **v3** 포스트에서는 Google Sheets에서 특정 데이터를 효율적으로 읽어오는 방법에 대해 자세히 알아보겠습니다.