서버리스(Serverless) 아키텍처는 서버 인프라를 프로비저닝하거나 관리하지 않고도 어플리케이션을 배포할 수 있도록 해주는 아키텍처입니다. 이번에는 Next.js에서 서버리스 아키텍처를 이용하여 API 라우팅을 구현하는 방법에 대해 알아보겠습니다.
Next.js에서 서버리스 함수(Serverless Function)를 이용하여 API 라우팅을 구현할 수 있습니다. 서버리스 함수는 필요한 경우에만 호출되며, 배포, 확장 및 유지 관리가 쉽습니다. AWS Lambda, Google Cloud Functions 및 Microsoft Azure Functions와 같은 클라우드 프로바이더에서 서버리스 함수를 지원합니다.
Next.js에서 서버리스 함수를 사용하기 위해서는 next-serverless 패키지가 필요합니다. 이 패키지를 사용하면 API 라우팅을 위한 서버리스 함수를 생성할 수 있습니다.
예를 들어, 다음과 같은 구조로 폴더를 생성합니다
- pages/
- api/
- hello.js
그리고 hello.js 파일 내부에 다음과 같은 코드를 작성합니다.
export default (req, res) => {
res.status(200).json({ message: 'Hello, World!' });
};
이제 next build 명령어를 실행하여 어플리케이션을 빌드합니다. 그 다음, next export 명령어를 사용하여 정적 파일로 어플리케이션을 빌드합니다.
빌드된 어플리케이션을 호스팅하고 있는 곳에서 hello.json API 엔드포인트에 접속하면 "Hello, World!" 메시지를 확인할 수 있습니다.
서버리스 함수를 이용하여 API 라우팅을 구현하는 것은 다양한 이점이 있습니다. 서버리스 함수를 이용하면 확장성과 유지 관리성이 높아지며, 비용도 절감할 수 있습니다.
1) 유연성과 확장성
서버리스 아키텍처는 필요한 경우에만 함수를 실행하므로, 서버를 유지 관리할 필요가 없습니다. 따라서 서비스를 더 유연하게 확장할 수 있습니다.
2) 높은 가용성
서버리스 아키텍처는 매우 높은 가용성을 제공합니다. 함수는 여러 지역에서 실행되며, 클라우드 프로바이더에서 자동으로 백업 및 복구를 수행합니다.
3) 빠른 개발 속도
서버리스 아키텍처는 서버 인프라를 관리하지 않으므로 개발 속도가 빨라집니다. 함수는 개별적으로 작성되며, 코드를 빠르게 테스트하고 배포할 수 있습니다.
4) 저렴한 비용
서버리스 아키텍처는 사용한 만큼만 비용이 청구됩니다. 따라서 서버 인프라를 관리하는 전통적인 방법보다 훨씬 저렴합니다.
5) 높은 보안성
서버리스 아키텍처는 클라우드 프로바이더에서 자동으로 보안 업데이트를 제공하므로, 보안성이 높아집니다. 또한 함수는 서버에서 분리되어 있으므로, 서버 위협에 대한 영향이 줄어듭니다.
6) 높은 성능
서버리스 아키텍처는 함수를 여러 지역에서 실행하므로, 더 빠른 성능을 제공할 수 있습니다. 또한 함수는 필요한 경우에만 실행되므로, 자원이 효율적으로 사용됩니다.
이러한 장점들은 서버리스 아키텍처를 사용할 때 많은 이점을 제공합니다
서버리스(Serverless) 아키텍처는 많은 이점을 제공하지만, 몇 가지 단점도 있습니다.
1) Cold Start 문제
서버리스 함수는 필요한 경우에만 실행되지만, 처음 실행될 때는 초기화에 시간이 걸립니다. 이를 "Cold Start"라고 합니다. Cold Start는 함수의 응답 시간을 늘릴 수 있으며, 일부 서비스에서는 성능 문제를 유발할 수 있습니다.
2) 제한된 실행 시간
서버리스 함수는 실행 시간이 제한되어 있습니다. 대부분의 클라우드 프로바이더에서는 15분 미만의 실행 시간만 허용합니다. 따라서 서버리스 함수에서 오랜 시간이 소요되는 작업을 수행할 수 없습니다.
3) 제한된 로컬 스토리지
서버리스 아키텍처에서는 로컬 스토리지를 사용할 수 있지만, 제한적입니다. 일부 클라우드 프로바이더에서는 로컬 스토리지의 크기와 수명이 제한됩니다.
4) 비용
서버리스 아키텍처는 사용한 만큼만 비용이 청구됩니다. 하지만 함수가 자주 호출되거나 긴 실행 시간을 가질 경우 비용이 높아질 수 있습니다.
5) 제한된 지원
서버리스 아키텍처는 비교적 새로운 기술입니다. 따라서 일부 클라우드 프로바이더에서는 아직 지원되지 않는 기능이 있을 수 있습니다.
next js 에서 API route란 클라이언트 측 JavaScript가 아닌 서버에서 실행되는 함수입니다. Next.js에서 API 라우팅은 "pages/api" 폴더 내에 작성됩니다. 이 폴더 내의 파일들은 자동으로 서버에서 실행 가능한 API 엔드포인트가 됩니다.
API 라우트에서는 req와 res 객체를 사용하여 HTTP 요청을 처리하고 응답할 수 있습니다. req 객체는 요청에 대한 정보가 포함되어 있으며, res 객체는 응답을 설정하는 데 사용됩니다.
API 라우트에서 데이터베이스와 상호작용하려면, 데이터베이스 연결을 설정하고 해당 모듈을 API 라우트에서 가져와 사용할 수 있습니다.
예를 들어 MongoDB를 사용한다면, 다음과 같은 방식으로 API 라우트에서 MongoDB를 사용할 수 있습니다.
import { connectToDatabase } from '../../utils/mongodb';
export default async function handler(req, res) {
const { db } = await connectToDatabase();
const data = await db.collection('collection_name').find({}).toArray();
res.json(data);
}
마지막으로, API 라우트에서는 보안과 인증을 적용할 수 있습니다. 예를 들어, API 라우트에서 로그인이 필요한 경우 next-auth 패키지를 사용하여 인증을 구현할 수 있습니다.
이렇게 API 라우트를 사용하면 Next.js 어플리케이션에서 외부 데이터를 가져오거나 데이터베이스와 상호작용할 수 있습니다.
next.js 공식문서의 api 라우트 부분을 참고 하여 작성했습니다.
더 궁금한 부분에 대해서는 원문을 참고하세요!