분류 Nodejs

Google 스프레드 시트를 데이터베이스로 사용하는 방법 (책임감 있게)

컨텐츠 정보

  • 조회 17 (작성일 )

본문

데이터베이스 기술 및 기타 도구가 먼 길을 걸어 왔지만 겸손한 스프레드 시트의 다양성과 직관성을 능가하기는 여전히 어렵습니다. 

COVID-19 환자 데이터 저장과 같은 민감하고 중요한 응용 프로그램에 사용하는 것은 좋지 않지만 모든 사람이 스프레드 시트를 사용하는 방법을 알고 있다는 사실은 개발자가 아닌 사람이 검사해야 하는 소규모 교차 기능 프로젝트에 적합하다는 것을 의미합니다. 또는 데이터를 편집합니다.


https://dev.to/hacubu/how-to-use-google-sheets-as-a-database-responsibly-3ohk


이 가이드에서는 HTTP를 통해 액세스 할 수 있는 API 인터페이스를 갖춘 데이터베이스로 Google 스프레드 시트를 사용하는 방법을 보여줍니다. 

자동 완성 기능이 내장 된 Node.js API 개발 플랫폼이자 편집기 인 Autocode를 사용하여 간단한 앱을 배포하고 Google의 인증 프로세스를 처리합니다. 

또한 확장성을 포함하여 Google 스프레드 시트의 한계와 더 복잡한 대안을 살펴 보는 것이 합당한 부분에 대해서도 살펴 보겠습니다.


1-spreadsheet-template.png 


# Returns all people in the database whose names start 
# with "bil", case-insensitive
$ curl --request GET --url \
  'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'


[
  {
    "Name": "Bilbo Baggins",
    "Job": "Burglar",
    "Fictional": "TRUE",
    "Born On": "9/21/1937",
    "Updated At": ""
  },
  {
    "Name": "Bill Nye",
    "Job": "Scientist",
    "Fictional": "FALSE",
    "Born On": "11/27/1955",
    "Updated At": ""
  },
  {
    "Name": "billie eilish",
    "Job": "Artist",
    "Fictional": "FALSE",
    "Born On": "12/18/2001",
    "Updated At": ""
  }
]


시작하는 데 Google 계정과 무료 Autocode 계정 외에는 다른 것이 필요하지 않습니다. 가자!


TL;DR (30s) 


먼저 여기를 클릭 한 다음 오른쪽 상단의 템플릿 사용을 눌러 Google 스프레드 시트 템플릿의 사본을 복제해야 합니다. 이렇게 하면 개인 Google 계정에 샘플 스프레드 시트가 추가됩니다.


이 작업을 마치면 여기를 클릭하여 Autocode에서 시작 앱을 엽니다. 원하는 경우 소스 코드를 둘러 본 다음 녹색 버튼을 눌러 자동 코드 계정에 앱을 설치합니다. Google 스프레드 시트를 연결하라는 메시지가 표시되면 흐름의 지침에 따라 Google 계정을 연결 한 다음 방금 복제 한 스프레드 시트를 선택합니다.


그 후에는 앱을 사용할 수 있습니다! URL을 통해 몇 개의 엔드 포인트에 액세스하고 반환 되는 항목 / 새 스프레드 시트 데이터베이스에 어떤 일이 발생하는지 확인합니다. 아래의 Endpoints 섹션에서 호출 예를 확인할 수 있습니다.


한계 


그 tl; dr은 쉬웠죠? 그렇다면 모든 것이 Google 스프레드 시트에 구축되지 않은 이유는 무엇입니까?


설정하는 데 30 초가 걸리고 모든 사람이 상호 작용할 수 있는 백엔드는 매우 매력적이지만 몇 가지 명백한 제한 사항이 있습니다. 위에서 설명한 데이터베이스로서의 스프레드 시트는 자연스럽게 여러 테이블 또는 행 간의 관계를 지원하지 않습니다. 또한 주어진 열, 트랜잭션, 내장 백업 또는 암호화에 대해 유형을 적용하는 개념이 없으므로 민감한 / 중요한 데이터 (예 : COVID-19 환자 데이터)는 다른 곳에 저장하는 것이 가장 좋습니다.


확장 성 측면에서 Google 스프레드 시트에는 5,000,000 개의 셀 (빈 셀 포함)의 엄격한 제한이 있습니다. 하지만 이렇게 많은 값이 포함 된 스프레드 시트를 만들어 이를 확인하려고 할 때 해당 임계 값 이전에 성능에 심각한 문제가 발생했습니다.


google-sheets-unresponsive.png 


많은 수의 셀을 붙여 넣는 것과 같은 대량 작업이 느려지고 약 1m 셀에서 실패하기 시작했습니다. 탐색은 일반적으로 느렸습니다.


API 호출에 대한 나의 실험은 비슷한 결과를 얻었습니다. 쿼리 속도는 셀 수에 따라 선형적으로 확장되는 것 같습니다.


google-sheets-api-benchmarks.png 

쿼리는 500,000 셀 표시 부근에서 비실용적으로 느려졌지만 100,000 셀 쿼리의 경우 여전히 2 초 미만이었습니다. 따라서 수십만 개의 셀보다 큰 데이터 세트가 예상되는 경우 확장 가능한 옵션을 선택하는 것이 현명 할 것입니다.


작동 원리 


복제 된 Google Sheet를 앱에 연결하고 계정에 설치하면 Autocode가 앱의 토큰을 사용하여 앱과 Google 계정 간의 인증을 자동으로 처리합니다 (const lib = require ( 'lib') ({token : process. env.STDLIB_SECRET_TOKEN}) 행).


실제 쿼리의 경우 각 엔드 포인트에는 googlesheets.query API에서 메서드를 호출하는 Node.js 코드가 포함되어 있습니다. 이러한 API는 API 호출이 데이터베이스의 일부로 고려해야 하는 스프레드 시트의 일부에 해당하는 A1 표기법으로 형식이 지정된 범위라는 매개 변수를 사용합니다.


let queryResult = await lib.googlesheets.query['@0.3.0'].select({
  range: `A:E`,
  bounds: 'FULL_RANGE',
  where: [{
    'Name__istartswith': query
  }]
});


범위 값 A : E는 기본적으로 "스프레드 시트에서 A부터 E까지의 모든 행을 내 데이터베이스로 사용"의 약어입니다. 쿼리는 해당 범위에 있는 각 열의 첫 번째 행을 해당 열에 있는 값의 필드 이름으로 해석합니다. 복제 한 템플릿이 주어지면 위 쿼리는 쿼리와 일치하는 값이 있는 행에 대해 A 열 (이름이 지정된 이름)의 모든 값을 확인합니다.


이러한 API 호출은 KeyQL 쿼리 언어를 사용합니다. 심층 분석에 관심이 있는 경우 더 많은 예제를 확인할 수 있습니다.


Calling Endpoints 


앞서 언급 했듯이 이러한 엔드 포인트는 HTTP를 통해 액세스 할 수 있으므로 fetch, cURL 또는 원하는 다른 HTTP 클라이언트를 통해 호출 할 수 있습니다. 웹 브라우저를 직접 사용할 수 있습니다.


2-browser-access.png또한 엔드 포인트가 Google Sheets API를 호출하는 데 사용하는 것과 동일한 lib-node Node 패키지를 사용할 수도 있습니다.


3-lib-access.png 



엔드 포인트는 GET 또는 POST 요청에 응답합니다. 매개 변수는 GET 요청에 대한 쿼리 문자열과 POST 요청에 대한 요청 본문에서 구문 분석됩니다. 각 엔드 포인트에는 명확성을 위해 기본 매개 변수가 설정되어 있습니다. 아래에서 각 엔드 포인트에 대한 예를 찾을 수 있습니다. 


Endpoints 


functions/select/job/contains.js


이 끝점은 포함 KeyQL 쿼리의 예입니다. 연결된 Google 시트에서 작업 필드에 매개 변수 쿼리와 일치하는 하위 문자열 (대소 문자 구분)이 포함 된 행을 찾습니다. 샘플 시트에서 다음을 반환합니다.


$ curl --request GET --url \
  'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/job/contains/?query=ist'


[
  {
    "Job": "Mistborn",
    "Born On": "2006-07-17",
    "Fictional": "TRUE",
    "Name": "Vin Venture",
    "Updated At": ""
  },
  {
    "Job": "Scientist",
    "Born On": "1955-11-27",
    "Name": "Bill Nye",
    "Fictional": "FALSE",
    "Updated At": ""
  },
  {
    "Job": "Artist",
    "Born On": "2001-12-18",
    "Name": "billie eilish",
    "Fictional": "FALSE",
    "Updated At": ""
  }
]


functions/select/born_on/date_gt.js


이 끝점은 date_gt KeyQL 쿼리의 예입니다. 연결된 Google 시트에서 Born On 필드가 2000/01/01 형식의 쿼리 매개 변수 뒤에 있는 행을 찾습니다. 샘플 시트에서 다음을 반환합니다.


$ curl --request GET --url \
  'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/born_on/date_gt/?query=2000/01/01'


[
  {
    "Job": "Mistborn",
    "Born On": "2006/07/17",
    "Fictional": "TRUE",
    "Name": "Vin Venture",
    "Updated At": ""
  },
  {
    "Job": "Artist",
    "Born On": "2001/12/18",
    "Name": "billie eilish",
    "Fictional": "FALSE",
    "Updated At": ""
  }
]


functions/select/name/istartswith.js


이 끝점은 istartswith KeyQL 쿼리의 예입니다. 연결된 Google 스프레드 시트에서 이름 필드가 쿼리 매개 변수 (대소 문자 구분 안함)로 시작하는 행을 찾습니다. 샘플 시트에서 다음을 반환합니다.


$ curl --request GET --url \
  'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/select/name/istartswith/?query=bil'


[
  {
    "Job": "Scientist",
    "Born On": "1955-11-27",
    "Name": "Bill Nye",
    "Fictional": "FALSE",
    "Updated At": ""
  },
  {
    "Job": "Artist",
    "Born On": "2001-12-18",
    "Name": "billie eilish",
    "Fictional": "FALSE",
    "Updated At": ""
  },
  {
    "Job": "Burglar",
    "Born On": "1937-09-21",
    "Fictional": "TRUE",
    "Name": "Bilbo Baggins",
    "Updated At": ""
  }
]


functions/insert.js


이 끝점은 삽입 쿼리의 예입니다. 입력 매개 변수를 googlesheets.query.insert의 fieldsets 매개 변수로 전달합니다. API. 예를 들어 Bill Gates를 스프레드 시트에 추가하려면 다음과 같이 요청할 수 있습니다 (모든 매개 변수는 소문자 임).


$ curl --request POST \
  --header "Content-Type: application/json" \
  --data '{"name":"Bill Gates","job":"CEO","fictional":false,"bornOn":"10/28/1955"}' \
  --url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/insert/'



참고 : Autocode API는 하나의 HTTP 메서드에 대해 독점적으로 응답하지 않으며 대신 기능에 대한 혼동을 피하기 위해 설명적인 이름 지정에 의존합니다.


functions/update.js


이 끝점은 업데이트 쿼리의 예입니다. 이름 매개 변수와 정확히 일치하는 사람의 업데이트 날짜 필드를 설정하고 입력 매개 변수를 기반으로 다른 필드를 업데이트합니다. googlesheets.query.update API를 사용합니다.


예를 들어, Bilbo Baggins의 Job 필드를 스프레드 시트에서 Ring Bearer로 업데이트하려면 다음 요청을 수행 할 수 있습니다 (모든 매개 변수는 소문자 임).


$ curl --request POST \
  --header "Content-Type: application/json" \
  --data '{"name":"Bilbo Baggins","job":"Ring Bearer"}' \
  --url 'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/update/'


참고 : 이는 둘 이상의 행이 쿼리 조건과 일치하는 경우 여러 행에 영향을 미칠 수 있습니다.


functions/delete.js


이 끝점은 삭제 쿼리의 예입니다. 행을 제거합니다. 이름 매개 변수와 정확히 일치하는 사람들 googlesheets.query.delete API를 사용합니다. 예를 들어 스프레드 시트에서 Bilbo Baggins를 제거하려면 다음과 같이 요청할 수 있습니다.


$ curl --request GET --url \
  'https://YOUR_USERNAME.api.stdlib.com/gsheets-database-example/delete/?name=Bilbo%20Baggins'


참고 : 이는 둘 이상의 행이 쿼리 조건과 일치하는 경우 여러 행에 영향을 미칠 수 있습니다.