Next.js에 대해 들으면 가장 먼저 떠오르는 것은 정적 웹사이트나 React 기반 프런트엔드일 것입니다. 그러나 그것은 이야기의 일부일뿐입니다. Next.js는 또한 다른 백엔드 서비스와 마찬가지로 호스팅하고 확장할 수 있는 모든 기능을 갖춘 백엔드 API를 강화할 수 있습니다.
이전 기사에서는 Next.js API를 구축하고 Sevalla를 사용하여 배포하는 과정을 살펴보았습니다. 이 예에서는 PostgreSQL 데이터베이스에 데이터를 저장하고 요청을 직접 처리했습니다. 잘 작동했지만 트래픽이 증가함에 따라 모든 요청에서 데이터베이스에 도달하는 API가 느려질 수 있습니다.
여기서 캐싱이 필요합니다. Redis를 캐시 계층으로 추가하면 Next.js API를 훨씬 더 빠르고 효율적으로 만들 수 있습니다. 이 기사에서는 Redis 캐싱을 API에 추가하고 Sevalla와 함께 배포하며 측정 가능한 개선 사항을 보여주는 방법을 살펴보겠습니다.
지난 글에서는 API에 대해 자세히 설명했습니다. 따라서 이 저장소를 사용하여 이 프로젝트의 기반으로 시작할 수 있습니다.
목차
-
캐싱이 중요한 이유
-
Redis란 무엇인가요?
-
프로젝트 설정
-
Redis 프로비저닝
-
읽기 시 캐시 업데이트
-
쓰기 시 캐시 업데이트
-
Sevalla에 배포
-
Redis가 Next.js API와 잘 작동하는 이유
-
결론
캐싱이 중요한 이유
API가 데이터베이스에 도달할 때마다 시간과 리소스가 소모됩니다. 데이터베이스는 구조화된 데이터를 저장하고 쿼리하는 데는 탁월하지만 초당 수천 건의 읽기 요청을 처리해야 하는 대규모 속도에는 최적화되어 있지 않습니다.
캐싱은 자주 액세스하는 데이터를 메모리에 유지하여 이 문제를 해결합니다. 매번 데이터베이스에 요청하는 대신 API는 사용 가능한 경우 캐시에서 직접 데이터를 반환할 수 있습니다. Redis는 성능을 위해 설계된 인메모리 키-값 저장소이기 때문에 이에 적합합니다.
예를 들어 요청이 있을 때마다 데이터베이스에서 사용자 목록을 가져오는 경우 쿼리를 실행하고 결과를 반환하는 데 200ms가 걸릴 수 있습니다. Redis 캐싱을 사용하면 첫 번째 요청은 결과를 메모리에 저장하고 후속 요청은 10ms 이내에 동일한 데이터를 반환할 수 있습니다. 이는 엄청난 발전입니다.
Redis란 무엇인가요?
Redis는 초고속 데이터베이스처럼 작동하는 인 메모리 데이터 저장소입니다. 디스크에서 쓰고 읽는 대신 데이터를 메모리에 유지하므로 속도가 엄청나게 빠릅니다. 그렇기 때문에 장기 보관보다 속도가 더 중요한 캐시로 자주 사용됩니다.
매우 낮은 대기 시간으로 높은 처리량의 워크로드를 처리하도록 설계되었습니다. 즉, 마이크로초 내에 응답할 수 있습니다. 따라서 API 응답 캐싱, 세션 데이터 저장, 심지어 채팅 시스템 및 리더보드와 같은 실시간 애플리케이션 구동과 같은 사용 사례에 완벽하게 적합합니다.
기존 데이터베이스와 달리 Redis는 단순성과 속도에 중점을 둡니다. 데이터를 키-값 쌍으로 저장하므로 복잡한 쿼리를 작성하지 않고도 값을 빠르게 가져오거나 업데이트할 수 있습니다. 또한 목록, 세트, 해시와 같은 고급 데이터 유형을 지원하므로 일반 키-값 저장소보다 훨씬 더 유연합니다.
Redis를 Next.js에 구축한 것과 같은 API와 결합하면 기본 데이터베이스의 로드를 줄이고 클라이언트에 매우 빠른 응답을 제공하는 데 도움이 됩니다.
프로젝트 설정
저장소를 복제해 보겠습니다:
git clone git@github.com:manishmshiva/nextjs-api-pgsql.git next-api
이제 해당 디렉토리로 이동하여 npm install을 실행하여 패키지를 설치해 보겠습니다.
cd next-api
npm i
.env 파일을 생성하고 Sevalla의 데이터베이스 URL을 환경 변수에 추가하세요.
cat .env
.env 파일은 다음과 같아야 합니다:
PGSQL_URL=postgres://<username>:<password>-@asia-east1-001.proxy.kinsta.app:30503/<db_name>
이제 애플리케이션을 시작하고 몇 가지 API 요청을 하여 애플리케이션이 예상대로 작동하는지 확인해 보겠습니다.
앱 시작:
npm run dev
데이터베이스가 연결되어 있는지 확인해 보겠습니다. localhost:3000으로 이동 귀하의 브라우저에서. 다음 JSON을 반환해야 합니다:

새로운 사용자를 만들어 보겠습니다. Postman을 사용하여 DB에 새 항목을 생성하려면 다음 JSON을 사용하여 POST 요청을 보내세요.
{"id":"d9553bb7-2c72-4d92-876b-9c3b40a8c62c","name":"Larry","email":"larry@example.com","age":"25"}

localhost:3000/users로 이동하여 레코드가 생성되었는지 확인해 보겠습니다. 브라우저에서.

좋아요. 이제 Redis를 사용하여 이러한 API를 캐시해 보겠습니다.
Redis 프로비저닝
Sevalla의 대시보드로 이동하여 "Databases(데이터베이스)"를 클릭해 보겠습니다. 목록에서 "Redis"를 선택하고 나머지 옵션은 기본값으로 두세요.

데이터베이스가 생성되면 '외부 연결' 옵션을 켜고 공개적으로 액세스 가능한 URL을 복사하세요.

.env 파일에서는 다음과 같이 표시됩니다:
REDIS_URL=redis://default:<password>@<host>:<port>
이제 Node.js용 Redis 클라이언트를 설치하세요:
npm install ioredis
이제 Redis에 연결하여 이를 사용자 API의 캐시 계층으로 사용할 수 있습니다. 캐싱을 구현하는 방법을 살펴보겠습니다.
읽기 시 캐시 업데이트
업데이트된 users/route.ts는 다음과 같습니다. Redis를 사용하는 경우:
import { NextResponse } from "next/server";
import { Client } from "pg";
import Redis from "ioredis";
const redis = new Redis(process.env.REDIS_URL!);
async function readUsers() {
const client = new Client({
connectionString: process.env.PGSQL_URL,
});
await client.connect();
try {
const result = await client.query("SELECT id, name, email, age FROM users");
return result.rows;
} finally {
await client.end();
}
}
export async function GET() {
try {
// Check cache first
const cached = await redis.get("users");
if (cached) {
return NextResponse.json(JSON.parse(cached));
}
// Fallback to database if not cached
const users = await readUsers();
// Store result in cache with 60s TTL
await redis.set("users", JSON.stringify(users), "EX", 60);
return NextResponse.json(users);
} catch (err) {
return NextResponse.json({ error: "Failed to fetch users" }, { status: 500 });
}
}
이제 /users을 누르면 :
-
API는 먼저 Redis를 확인합니다.
-
데이터가 존재하면 즉시 반환합니다.
-
그렇지 않은 경우 PostgreSQL을 쿼리하고 결과를 Redis에 저장한 후 반환합니다.
이렇게 하면 반복되는 요청이 매우 빠르게 수행됩니다. 캐시 만료(EX 60)를 조정할 수 있습니다. ) 데이터가 얼마나 최신이어야 하는지에 따라 다릅니다.
Redis 캐싱 없이 /users 가져오기 10번은 10번의 데이터베이스 쿼리를 의미합니다. 데이터베이스 크기와 네트워크 대기 시간에 따라 각각 약 150~200ms가 걸릴 수 있습니다.
Redis를 사용하면 첫 번째 요청이 캐시를 채우기 때문에 여전히 ~200ms가 걸립니다. 그러나 그 이후의 모든 요청은 거의 즉각적이며 대개 10ms 미만입니다. 20배 개선입니다. .
API가 초당 수백 또는 수천 개의 요청에 직면할 때 이러한 속도 향상은 중요합니다. 캐싱은 대기 시간을 줄일 뿐만 아니라 데이터베이스의 로드도 줄여줍니다.
쓰기 시 캐시 업데이트
현재는 GET 요청만 캐시를 사용합니다. 하지만 새로운 사용자를 추가하면 어떻게 될까요? 캐시는 여전히 이전 데이터를 반환합니다.
해결책은 쓰기가 발생할 때마다 캐시를 업데이트하거나 지우는 것입니다. POST을 업데이트해 보겠습니다. 핸들러:
export async function POST(req: Request) {
try {
const body = await req.json();
const client = new Client({
connectionString: process.env.PGSQL_URL,
});
await client.connect();
const query = `
INSERT INTO users (id, name, email, age)
VALUES ($1, $2, $3, $4)
RETURNING *;
`;
const result = await client.query(query, [
body.id,
body.name,
body.email,
body.age,
]);
await client.end();
// Invalidate cache so next GET fetches fresh data
await redis.del("users");
return NextResponse.json(result.rows[0]);
} catch (err) {
return NextResponse.json({ error: "Failed to add user" }, { status: 500 });
}
}
이제 새 사용자가 생성될 때마다 users에 대한 캐시가 삭제됩니다. 다음 GET 요청은 데이터베이스에서 가져오고 캐시를 새로 고친 다음 캐시된 데이터를 계속 제공합니다.
Sevalla에 배포
코드를 GitHub에 푸시하거나 내 저장소를 포크하세요. 이제 Sevalla로 이동하여 새 앱을 만들어 보겠습니다.

드롭다운에서 저장소를 선택하고 "커밋 시 자동 배포"를 선택하세요. 이렇게 하면 코드를 푸시할 때마다 배포가 자동으로 수행됩니다. 리소스 섹션에서 '취미'를 선택하세요.

"만들고 배포"가 아닌 "만들기"를 클릭하세요. PostgreSQL URL과 Redis URL을 환경 변수로 추가하지 않았으므로 앱을 배포하려고 하면 앱이 충돌할 것입니다.
"환경 변수" 섹션으로 이동하여 "PGSQL_URL" 키와 값 필드에 URL을 추가하세요. “REDIS_URL” 키에 대해서도 동일한 작업을 수행하고 Redis URL을 추가하세요.

이제 '개요' 섹션으로 돌아가서 '지금 배포'를 클릭하세요.

배포가 완료되면 "앱 방문"을 클릭하여 API의 실시간 URL을 받으세요. Postman에서 localhost:3000을 새 URL로 바꾸고 API를 테스트할 수 있습니다.
Redis가 Next.js API와 잘 작동하는 이유
Redis는 가볍고 매우 빠르며 API 응답 캐싱에 적합합니다. Next.js의 맥락에서는 다음과 같은 이유로 자연스럽게 들어맞습니다:
-
API 경로는 Redis를 직접 쿼리할 수 있는 서버 측에서 실행됩니다.
-
캐싱 논리는 데이터베이스 호출에 간단하게 추가할 수 있습니다.
-
Redis는 캐싱 이상의 용도로 사용될 수 있습니다. 속도 제한, 세션 저장, 게시/구독 등도 일반적인 패턴입니다.
Sevalla에서 Next.js, PostgreSQL 및 Redis를 결합하면 빠르고 확장 가능하며 배포하기 쉬운 스택을 얻을 수 있습니다.
결론
캐싱은 단순한 최적화가 아니라 실제 API에 꼭 필요한 것입니다. Next.js는 쉽게 배포할 수 있는 강력한 백엔드 API를 구축하는 데 도움이 됩니다. Redis를 믹스에 추가하면 해당 API가 힘들이지 않고도 확장을 처리할 수 있습니다.
Sevalla는 관리형 PostgreSQL, Redis 및 앱 호스팅을 한곳에서 제공하여 이 모든 것을 하나로 묶습니다. 몇 가지 환경 변수와 GitHub 저장소를 사용하면 몇 분 만에 로컬 개발에서 프로덕션에 즉시 사용 가능한 캐시된 API로 이동할 수 있습니다.
이 기사가 즐거웠기를 바랍니다. 무료 AI 뉴스레터에 가입하세요 TuringTalks.ai AI에 대한 더 많은 실습 튜토리얼을 확인하세요. 다음 사이트에서도 저를 찾으실 수 있습니다. 링크드인 .
무료로 코딩을 배우세요. freeCodeCamp의 오픈 소스 커리큘럼은 40,000명 이상의 사람들이 개발자로 취업하는 데 도움을 주었습니다. 시작하세요