회사에서 4명에서 2명씩 각각 iOS, aOS를 담당해서 1인 프로젝트를 진행하는 모바일 스터디를 진행중이다.
공통적으로 백엔드는 Supabse를 이용해서 구현하고 Prisma로 DB를 관리하기로 했다.
그래서 지금부터는 Supabase의 Edge Function을 구현한 것에 대해서 중점적으로 다루어보고자 한다.
<공식 문서 발췌>
Edge Functions are server-side TypeScript functions, distributed globally at the edge—close to your users. They can be used for listening to webhooks or integrating your Supabase project with third-parties like Stripe. Edge Functions are developed using Deno, which offers a few benefits to you as a developer:It is open source.
It is portable. Supabase Edge Functions run locally, and on any other Deno-compatible platform (including self-hosted infrastructure).
It is TypeScript first and supports WASM.
Edge Functions are globally distributed for low-latency.
Edge Function은 Supabase에서 제공하는 Serverless Function이다. 다시 말해, 우리가 흔히 알고 있는 AWS의 Lambda와 비슷한 존재라고 할 수 있다.
Serverless란?
서버가 없다는 뜻이 아니라, 개발자가 서버를 직접 관리하지 않고도 애플리케이션이나 서비스를 구축하고 실행할 수 있다는 뜻이다.
서버 관리의 추상화 / 자동 확장 및 리소스 할당:
개발자는 코드만 짜,, 돈 내면 우리(클라우드)가 다 해줄게,,
Serverless를 사용하면, 우리는 더 이상 EC2, ECS, Kubernetics..
이런 것들에 대해서 고민할 필요가 없다! 개발자는 코드만 짜면 클라우드에서 알아서 해준다.
심지어는 확장성도 관리해준다. 필요한 경우, 서버 리소스가 자동으로 할당되고 트래픽 증가하면 확장도 된다.. 진짜 돈이면 다 됨
이벤트 기반 실행:
아빠 안 잔다.... 깨우면 일어남!
서버리스 환경에서는 코드가 특정 이벤트에 의해서만 실행된다.
예를 들어, HTTP 요청, 데이터베이스 변경, 메시지 큐 이벤트 등.. 다양한 형태의 이벤트로 트리거 되면 서버가 실행된다. 요청이 없는 경우에는 비활성 상태로 존재한다.
사용한 만큼만 비용 지불:
거둔대로만 뿌린다 !
보통은 서버는 계속 가동중이어야 하고 그로 인한 고정 비용이 발생한다.
하 지 만 서버리스 컴퓨팅은 이용한 만큼만 내면 된다!
내 서비스가 잘 나가면 돈이 더 나가겠지만,, 못 나가는 서비스라면,, 조금만 내면 된다.
덧.
얼마 전에 AWS 비용 관련 세션을 듣고 왔는데, 거기서 람다 비용은 실행 시간 + 성능(메모리) 을 기반으로 측정된다고 했다.
그래서 성능을 잘 세팅하는데 좋은데, 파워 튜닝 서비스이라는 오픈소스가 있어서 거기서 최적 사양을 추천해준다고 함! 그리고 프로세서는 Graviton을 쓰는게 훨씬 싸다고 했다._
간단하게만 특징에 대해서 알아보았다. (나중에 더 자세하게 다루어보겠다!)
좋아보이지만 이에 대해서도 장단점이 존재한다. 대표적인 문제점으로는 콜드 스타트를 들 수 있다. 실제로 Supabase로 개발해보니까 서버가 내려가고, 처음 요청 보낼 때는 체감이 될 정도로 느려졌다.
Supabase Edge Function은 Node.js가 아닌 Deno 런타임에서 실행된다.
Deno는 Bun과 함께 Node.js의 대체제로 떠오르는 런타임이다.
공식 홈페이지를 보니까 꽤 많은 곳에서 Deno를 사용중이다 😯
아직 깊게 사용해본 것은 아니지만, 현재 가장 크게 다르다고 느낀 점은 아무래도 package 관리 방식이다.
기존의 node.js 같은 경우에는
Deno의 경우에는
이 부분을 이해하지 못하고 있어서 처음에 세팅할 때, 조금 헤맸다 ㅎㅎ..
자세한 내용은 여기를 참고하면 Deno에 대한 이해도를 올릴 수 있을 것 같다.
글로벌 엣지 네트워크란, 전 세계 여러 지리적 위치에 분산된 서버 네트워크이다. 사용자에게 지리적으로 가장 가까운 서버에서 데이터를 제공 및 처리해줌으로서 빠르게 응답해줄 수 있게 도와주는 기술이다.
엣지 네트워크를 이루는 엣지 서버를 활용한 사례가 CDN인 것이다!
CDN의 작동 원리를 알고 있었지만, 그 기반에 Global Edge Network라는 개념이 있다는 것은 이번에 서버리스 함수 공부하면서 처음 알았다...
서버리스 컴퓨팅 환경에서도 해당 네트워크가 많이 사용된다고 한다.
대표적인 Edge function이나 Lambda 모두 Global Edge Network 기반으로 제공된다.
이 외에도 비디오 스트리밍 서비스들도 빠르게 데이터를 제공해줘야 하기 때문에, 해당 네트워크를 사용한다고 한다.
우선 Deno에 대한 환경 설정이 필요하다. (이 외의 설치법은 여기 참고)
맥 사용자
brew install deno
윈도우 사용자
irm https://deno.land/install.ps1 | iex
공식 문서에 보면, extension이랑 Deno Cli를 설치하라고 되어있다.
supabase init
하면, 알아서 vscode 설정은 해준다.
supabase functions new (function명)
(function명)
자리에 자신이 만들고 싶은 함수의 이름을 작성해주면 된다.
그러면 이렇게 아래와 같은 형태의 폴더 구조가 형성된다.
└── supabase
├── functions
│ └── hello-world
│ │ └── index.ts ## Your function code
└── config.toml
이제 index.ts 파일에 function을 작성해주기만 하면 된다!
다양한 함수를 만들 수 있겠지만,
예시로 나는 naver api에 접근해서 책 정보를 불러오는 api를 만들었다.
function getQueryParams(url: string, query: string) {
const urlObj = new URL(url);
const queryParams = urlObj.searchParams;
const queryParam = queryParams.get(query);
return { query: queryParam ?? "" };
}
async function fetchNaverBookApi({ query }: { query: string }) {
const response = await fetch(
`https://openapi.naver.com/v1/search/book.json?query=${query}`,
{
headers: {
"X-Naver-Client-Id": Deno.env.get("NAVER_CLIENT_ID"),
"X-Naver-Client-Secret": Deno.env.get("NAVER_CLIENT_SECRET"),
},
},
);
return response.json();
}
Deno.serve(async (req) => {
const { method } = req;
if (method === "GET") {
return await handleGetRequest(req);
}
return new Response("Method not allowed", { status: 405 });
});
async function handleGetRequest(req: Request) {
try {
const { query } = getQueryParams(req.url, "query");
const response = await fetchNaverBookApi({ query });
return new Response(JSON.stringify({ response }), {
headers: { "Content-Type": "application/json" },
status: 200,
});
} catch (err) {
return new Response(String(err), { status: 500 });
}
}
env 파일은 Deno.env.get(
키 값
)의 형태로 불러오면 된다.그리고 배포 후에 정상적으로 작동하게 하기 위해서는
Project Settings > Edge Functions 들어가서 secret key들 추가해주면 된다!
배포가 정말 정말 쉽다..
함수 다 적었으면, 터미널에 아래와 같이 입력하고 실행하면 끝.
npx supabase functions deploy 함수이름 --project-ref (프로젝트ref)
프로젝트 ref는 Project Settings > General 에 있다.
Reference ID 복사 붙여넣기 해주면 된다!
그리고 대시보드에 들어가보면 다음과 같이 배포가 완료 된 것을 볼 수 있다!
+) 추가 정보
대부분의 개발자의 컴퓨터에는 Docker가 설치 되어있겠지만,,
배포할 때, 함수 빌드 및 패키징을 위해서 Docker가 필요하니까 혹시 에러가 난다면 내 컴퓨터에 Docker가 설치 되어있는지 확인해보자 !
이제 안에 들어가면 api url도 나오니까 거기에 요청을 쏴보면, 정상적으로 잘 작동하는 것을 볼 수 있다.
Metrics, Log 모두 아주 보기 간편하게 제공해준다.. 수수수수파베이스 짱,,
나는 우선적으로 포스트맨으로 테스트를 해봤는데, 응답이 아주 잘 넘어오는 것을 확인할 수 있다 👍🏻