GitHub

[deno & postgres] deno deploy에서 supabase 연결하기

hojun lee · 09/04/2023
커버이미지

🐶 VSCODE도 안 켜고, 가장 쉽게 API를 만드는 방법

사실 생소하다.

보는 바와 같이 최신 기술이다. 하나하나 간략히 보자 (나도 잘 모름)

🦕Deno? Node?

🦁라이언 달 say

🦁라이언 달 say :nodejs를 만들고 10가지 후회함... 새로운 걸 만들어야겠어.

Deno (/ˈdiːnoʊ/, pronounced dee-no) is a JavaScript, TypeScript, and WebAssembly runtime with secure defaults and a great developer experience.

It's built on V8, Rust, and Tokio.

The easiest, most secure JavaScript runtime. 제일 쉽고 좋은 자바스크립트 런타임

nodejs의 단점을 보았고 이를 보완하기 위해 deno를 만들었다. no de -> de<->no 과거의 자신과 싸우는 존재라니...

간략한 특징 일단 NPM을 없앴다. 안깔고 그냥 불러온다!

Avoid installing dependencies dive right into the code and skip the setup

// from 뒤를 보면 사이트에서 직접 땡겨오는 것을 볼 수 있다.
import { serve } from "https://deno.land/std@0.155.0/http/server.ts";
import * as postgres from "https://deno.land/x/postgres@v0.14.0/mod.ts";

그리고 보안에 집중했다.

Secure by default Take total control over your workflow

🦕Deno Deploy

Serverless JavaScript hosting with zero config, worldwide.

서버리스 호스팅서비스에 대해 들어본 적이 있나? 아마도 vercel이나 netlify를 이용해 프론트단에서 배포해본 적이 있을 수도 있다.

나의 프론트엔드 코드가 아름답게 배포된 것을 볼 수 있다. 너무 감사한 일이었다.

멋지게도 Deno Deploy는 백엔드 로직을 배포할 수 있다. (원한다면 JSX도 배포 할 수 있다.) 역시나 hobby user에겐 free 이다.

supabase and postgres

Supabase is an open source Firebase alternative. Start your project with a Postgres database, Authentication, instant APIs, Edge Functions, Realtime subscriptions, and Storage.

파이어베이스 대안의 오픈소스! 데이터베이스 // 인증 // API관리 / 엣지 펑션 // 리얼타임 // 저장소

나중에 자세히 다룰 백엔드 로직과 DB이기 때문에 간략히 설명하겠다.

PostgreSQL 은 웹 애플리케이션에서 인기있는 데이터베이스이다. 유연하고 사용이 쉽다. 35년이 넘는 강력한 역사를 자랑한다. 컴퓨터의 사양이 좋아지면서 다시 각광받기 시작한 엄청난 Database!

해당 백엔드 서버를 배포하기 위해선 연결에 사용할 새로운 Postgres가 필요하다. Postgres 인스턴스를 관리하고 무료로 제공해주는 supabase를 이용하겠다.

deno deploy connecting to Postgres (with supabase)

deno에서 제공하는 TUTORIAL을 함께 따라가 보겠다.

deno 가 제공하는 방식은 직접 연결방식에 가깝다. 튜토리얼에도 설명했다시피 연결자체에 집중하기 때문에 보안을 고려하진 않았다.

다음과 같은 로직으로 접근할 것인데, deno에서 connecting pooling을 이용하여 DB와 연결한다. DB를 연결하는 작업은 상당한 비용이 든다. 기존 연결을 재사용하는 기술이 connection pooling 기술이다.

With a connection pool, connections are already opened and available for use. When a client makes a request, they use a connection from the pool. When the transaction or session is completed the underlying connection is simply returned to the pool and is once again free to be used by another user or application.

supabase는 기본적으로 이 기술을 가지고 있어서 우리가 직접 처리해주지 않아도 유연하게 커넥팅 풀링을 관리 해준다. 그게 PgBouncer이다.

PgBounce를 활용한 DB 연결은 10,000개까지도 버틸 수 있다고 한다. 일종의 완충 작용이랄까? 아리수 같은 것이랄까...

이제 진짜 연결해보자.

postgres 세팅하기

  1. 새로운 프로젝트를 만든다.
  2. 꼭 비밀번호를 잘 기억해두자.(connecting pooling에 써야함)
  3. 해당 프로젝트에 들어가 설정 - Database - 최하단 connecting poolingconnection string을 복사 해둔다.

내 것을 봐도 괜찮다. [YOUR-PASSWORD]를 지우고 너꺼를 넣으면 된다. pw는 db의 패스워드겠지?

deno deploy 세팅하기

  1. deno 새로운 프로젝트를 만든다.
  2. environment variables 작성하기
    • 해당 프로젝트 - Setting tab - Environment Variables - + Add Variable
    • Key : DATABASE_URL
    • VALUE : connection string (위 참고)

연결을 확인해보자 deno play ground 에서 코드 입력

import { serve } from "https://deno.land/std@0.140.0/http/server.ts";
import * as postgres from "https://deno.land/x/postgres@v0.14.0/mod.ts";

// Get the connection string from the environment variable "DATABASE_URL"
// Deno ENV에서 해당 KEY값의 Value를 가져오는 방법
const databaseUrl = Deno.env.get("DATABASE_URL")!;

// Create a database pool with three connections that are lazily established
const pool = new postgres.Pool(databaseUrl, 3, true);

serve(async (req) => {

이렇게 우리가 계속 활용할 pool을 만들었다. DB접속의 통로로 활용할 것이다.

const pool = new postgres.Pool(databaseUrl, 3, true);

// Connect to the database
const connection = await pool.connect();
try {
  // Create the table
  await connection.queryObject`
    CREATE TABLE IF NOT EXISTS todos (
      id SERIAL PRIMARY KEY,
      title TEXT NOT NULL
    )
  `;
} finally {
  // Release the connection back into the pool
  connection.release();
}

serve(async (req) => {

connection 변수를 선언하여 접속을 관리한다. 처음에 테이블을 확인하는데 todos가 없으면 id title 컬럼을 생성해준다. 그리고 배포한다.

이렇게 우리는 todos 테이블을 가지게 되었다. GET / POST endpoing HTTP handlers를 원한다면 tutorial-postgres playground 25 line 밑을 참고하길 바란다.

내가 만든 API로 todo GET 과 POST를 해본 엄청난 순간.

하지만 우리의 서비스는 JWT기반으로 DB를 인증하는 방식으로 사용하게 될 예정이다.

결론

편한 것만 찾게되면 분명 예상치 못한 오류가 찾아올 수 있다. 하지만 적절히 잘만 사용한다면 개발실력과 속도에서 동반 성장을 하게 될 것이다. 이번에 사용해본 deno와 백엔드 로직(supabase + postgreSQL)은 나같은 백엔드 초짜에겐 엄청난 기술이었다. 조금 더 공부해 효율적으로 사용해봐야겠다. 재미있다.


참고자료