필요성
사용자가 설문을 작성하고 그 설문에 참여했을 때의 결과를 받아보는 서비스에서
서비스 자체에서 제공하는 공식적인 설문 데이터의 업로드가 필요했다.
직접 설문을 생성해 넣어도 되겠지만 업로드할 설문이 한 두개가 아니었고 구글 시트로 작성되어있는 리스트를 한 번에 DB 에 업로드하는 방법이 더 효율적이라 판단했다.
구글 시트의 csv 파일을 활용해도 되겠지만 데이터의 구조와 관계를유지하는게 번거롭다고 생각하여 구글 API 로 데이터를 직접 가져온 다음 데이터 구조에 알맞게 가공해서 업데이트 시키는 방식을 선택했다.
Google API 세팅
사용 라이브러리
npm i googleapis
1. Google Cloud 프로젝트 생성
처음 접속하면 서비스 동의 과정부터 필요하다
이후 콘솔 메뉴에서
IAM and admin -> IAM
생성된 프로젝트가 없어서 확인할 수 있는게 없다
2. CREATE PROJECT
test 프로젝트를 생성했다.
이제 내가 구글 클라우드에서 사용할 프로젝트를 생성한 것이고
이 프로젝트에 내가 사용하고 싶은 구글 API 를 추가해주어야 한다.
3. Google Sheets API
먼저 대시보드로 이동해서 내가 생성한 프로젝트를 다시 확인한다.
API overview 로 이동한다.
Library 탭으로 이동한다.
스프레드시트의 데이터를 활용할거니까 spreadsheet 를 검색해서 나온 Google Sheets API 를 Enable 시킨다!
해당 API 를 사용가능하도록 설정해주고 난 뒤 다음 화면에서
4. 인증 정보
Credentials -> + CREATE CREDENTIALS -> Service Account
를 눌러 서비스 계정을 생성하자!
우리가 스프레드 시트 이용할 때 공유 기능으로 원하는 사용자만 이 시트에 접근할 수 있도록 하는데
마찬가지로 이 API 사용자 계정을 내가 사용할 시트의 공유 계정에 추가하여 사용할 수 있도록 하는 거다.
사용자 계정 이름 작성
역할 부여
나는 데이터를 가져오기만 할거라 간단하게 Viewer 를 선택했다.
생성된 계정의 이메일을 복사해서 내가 사용할 시트의 공유 목록에 추가하자
시트에 접근하기 위한 API 계정을 생성했으니 이제 코드에서 이 API 를 활용하기 위한 인증 정보를 받아야 한다.
다시 생성한 사용자 계정을 클릭하고
KEYS -> ADD KEY -> Create new key
를 통해 json 파일 형태의 key 를 받는다.
P12 형식: 이진 형식의 파일로, PKCS #12 표준을 따릅니다. 개인 키와 인증서를 하나의 파일에 안전하게 저장할 수 있습니다. 이 파일은 비밀번호로 보호할 수 있으며, 보안성이 높습니다.
JSON 형식: 텍스트 기반의 파일로, 사람이 읽을 수 있는 형식입니다. 개인 키와 서비스 계정 정보가 JSON 객체로 저장되어 있습니다.
JSON 파일은 그 자체로 쉽게 읽고 사용할 수 있으며, API 클라이언트 라이브러리에서 바로 지원합니다. 특별한 처리 없이도 간편하게 인증에 사용할 수 있습니다. => 코드에서 간편하게 사용 가능!
생성된 key 는 내 컴퓨터에 다운로드 되고 다음과 같은 정보들이 들어있다.
이 파일을 내가 적용할 프로젝트에 가져와서 활용한다.
나는 추가로 내가 사용할 스프레드 시트의 id 도 이 파일에 넣어서 사용했다.
{
"type": "service_account",
"project_id": "what",
"private_key_id": "what",
"private_key": "what"
"client_id": "what",
"auth_uri": "what",
"token_uri": "what",
"auth_provider_x509_cert_url": "what",
"client_x509_cert_url": "what",
"universe_domain": "googleapis.com"
}
구현
./google-sheets-fetch.ts
import { google } from 'googleapis';
import { client_email, private_key, spreadsheet_id } from './google-survey-sheet.json';
const prisma = new PrismaClient();
const sheets = google.sheets({
version: 'v4',
auth: new google.auth.GoogleAuth({
credentials: {
client_email: client_email,
private_key: private_key.replace(/\\n/g, '\n'),
},
scopes: ['https://www.googleapis.com/auth/spreadsheets'],
}),
});
key.json 파일에서 인증 정보를 가져와 설정한다.
시트에서 가져온 데이터는 배열 형태로 다음과 같이 가져왔다.
async function getData(range: string): Promise<any[]> {
const response = await sheets.spreadsheets.values.get({
spreadsheetId: spreadsheet_id,
range,
});
return response.data.values || [];
}
// range: '시트제목!A2:F6',
이제 스크립트를 실행하여 시트 데이터를 내가 원하는 형태로 가공해서 사용한다.