
이번 프로젝트에서 서비스를 배포하는 업무를 맡았다.
평소 큰 생각없이 Vercel을 이용한 프론트엔드 배포를 수행해 왔는데
NestJS를 Vercel로 배포하는 경험을 했다.
작은 이슈들이 있었고 이를 해결하는 과정에서 명확하게 알지 못했던 Serverless에 대해 이해하고 넘어가는 시간을 가졌다.

Serverless라는 단어를 보았을 때 말 그대로 "서버가 없다?" 라고 쉽게 생각할 수 있다.
하지만 "서버가 없다"라는 너무나도 직관적인 생각에는 많은 물음표가 생기기 마련이다.
서버가 존재하지 않는다면 내가 만든 서비스가 제대로 동작하는 것이 기적이기 때문이다. 물론 Serverless는 서버가 없다는 의미가 아니다.
그렇다면 Serverless란 무엇인가?
귀납식으로 서술해보자면 Serverless란 서버가 없다는 뜻이 아닌, 개발자가 직접 관리해야하는 서버가 없다는 의미가 쉽게 이해하기에 도움이 된다.
이를 설명하기 위해 3가지 예시를 들어볼 수 있다.
IaaS는 컴퓨터의 클라우드 기능들을 서비스로 제공하는 것을 말한다. 이미 만들어져 있는 각종 기능들을 이용하여 서비스 인프라를 쉽게 구축할 수 있다.
AWS의 클라우드 서비스 등이 대표적인 예가 될 수 있겠다.
IaaS는 직접 컴퓨터용 서버를 구축하지 않아도 되는 장점이 있지만 서버 트래픽, 이슈 등 개발자 측면에서 관리해야하는 부분이 많다. 또한 IaaS를 통한 배포는 코드가 24시간 돌아가며 서비스를 이용하는 사용자의 유무와는 상관없이 비용을 지불해야한다.
FaaS는 배포하는 코드들을 '함수'로 분리하여 분산된 클라우드에 등록한다. 코드 전체를 등록하는 IaaS와는 큰 차이를 보인다.
FaaS의 '함수'로 분리하여 등록하는 방식은 사용자의 서비스 사용에서도 차이점이 있다.
서비스 사용자는 필요한 특정 함수를 요청하고 만약 함수에 대한 사용자 요청이 많다면 해당 함수의 수를 늘려서 실행하여 트래픽을 관리한다. 반대로 특정 함수에 대한 요청이 없다면 해당 함수는 실행하지 않는다. 이를 "잠들어 있는 함수수가 요청이 들어오면 깨운다."라고 표현하기도 한다. 이러한 매커니즘으로 함수의 실행 빈도에 따라 비용을 지불한다.
BaaS는 백엔드 개발자가 담당하는 부분(데이터베이스, 인증 등)을 서비스로 제공하는 것이다. 직접 사용한 경험이 있는 BaaS에는 Firebase가 있다.
정리해보자면 IaaS는 요청이 많아지면 컴퓨팅 파워를 개발자가 늘리는 등 직접적인 서버 관리의 영역이 존재한다.
FaaS는 분리된 함수를 이용하여 동작하며 요청빈도에 따라 함수를 추가 실행하거나 실행하지 않도록 관리하기 때문에 개발자가 인프라를 신경쓰지 않아도 무관하다.
BaaS는 FaaS를 서비스하는 대부분의 업체에서 지원하기 때문에 FaaS와 비슷한 성격을 갖는다.
| Name | Serverless |
|---|---|
| IaaS | ❌ |
| FaaS | ⭕️ |
| BaaS | ⭕️ |
Vercel도 결국 AWS 처럼 웹사이트를 호스팅해주는 서비스이기 때문에 IaaS 를 제공하는 플랫폼에 속하지만, Next.js 의 API routes 기능과 Server-side Rendering 으로 페이지를 생성할 때는 독립적인 Serverless Function(FaaS)으로 만들어져 동작한다.