Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

Upstash Redis 캐싱으로 Prisma ORM 성능 향상

이전 블로그 게시물에서는 캐싱의 이점, 일반적인 캐싱 기술, 다양한 코드 샘플에서 Upstash Redis를 사용하여 SQL 데이터를 캐싱하는 방법을 살펴봤습니다.

Upstash Redis를 사용하여 SQL 쿼리를 캐싱하는 것의 세부 사항과 이점을 살펴보았으므로 이제 더 나아가서 몇 가지 작업을 확인할 수 있습니다. 이를 위해 일반적으로 사용되는 ORM인 Prisma부터 시작하여 Upstash Redis를 사용한 캐싱이 데이터베이스 쿼리에 대해 어떻게 작동하는지 알아볼 수 있습니다.

이 블로그 게시물에서는 Upstash Redis를 Prisma와 통합하여 캐시 배제 기술을 사용하여 쿼리를 캐시하고, 데이터베이스 부하를 줄이고, 애플리케이션 성능을 향상시키는 방법을 살펴보겠습니다.

프리즈마란 무엇인가요?

Prisma를 설정하기 전에 몇 가지 용어와 Prisma의 기능을 확인해 보겠습니다.

첫째, Prisma는 애플리케이션과 데이터베이스 간의 인터페이스를 제공하는 ORM(Object Relational Mapper) 도구입니다.

ORM은 개발자가 원시 SQL 쿼리를 작성하는 대신 높은 수준의 개체 지향 코드를 사용하여 데이터베이스와 상호 작용할 수 있도록 하는 프로그래밍 기술입니다. 간단히 말해서 관계형 데이터베이스와 객체지향 프로그래밍 언어를 연결하는 브리지를 제공합니다.

ORM은 데이터베이스 테이블을 프로그래밍 언어 클래스 또는 모델에 매핑합니다. 테이블의 각 행은 클래스의 인스턴스에 해당합니다. 이는 기본적으로 객체 지향 언어로 작성된 애플리케이션에서 수행하는 데이터 모델링입니다. ORM은 이를 위해 SQL 쿼리를 작성하는 대신 메서드를 제공합니다. 프로그래머는 객체나 클래스에 대한 메서드를 호출하여 CRUD 작업을 수행할 수 있습니다.

예를 들어 users를 쿼리하면 원시 SQL의 테이블은 다음과 같습니다:

SELECT * FROM users WHERE id = 1;

ORM을 사용하면 동일한 쿼리가 다음과 같을 수 있습니다.

const user = await user.findUnique({ where: { id: 1 } });

따라서 ORM은 데이터베이스와 상호 작용하고 실행된 프로그램에 가져온 데이터를 코드에서 사용할 수 있도록 만드는 데 필요한 작업을 수행하여 개발자에게 큰 편의를 제공합니다.

Prisma는 소프트웨어 애플리케이션에서 가장 일반적이고 사용하기 쉬운 ORM 중 하나입니다.

Prisma가 좋은 ORM 선택인 이유를 보여주는 몇 가지 지표는 다음과 같습니다.

  • 유형이 안전한 쿼리 :Prisma는 데이터베이스 스키마를 기반으로 TypeScript 클라이언트를 자동 생성하므로 런타임이 아닌 개발 중에 오류를 포착할 수 있습니다.

  • 단순화된 데이터 모델링 :schema.prisma 사용 파일에서 Prisma가 필요한 SQL 또는 API 호출로 변환하는 선언적 구문을 사용하여 데이터베이스 구조를 정의할 수 있습니다. Prisma를 통해 테이블을 생성하기 위해 이 파일에 모델을 작성하는 방법에 대한 예를 살펴보겠습니다.

  • 다중 데이터베이스 지원 :Prisma는 PostgreSQL, MySQL, SQLite, MongoDB 등과 같은 널리 사용되는 데이터베이스와 작동합니다. Prisma 문서에서 데이터베이스를 찾을 수 있습니다.

  • 이전 관리 :Prisma는 데이터베이스 스키마를 코드베이스와 동기화 상태로 유지하기 위해 사용하기 쉬운 마이그레이션 시스템을 제공합니다.

Prisma는 또한 CLI와 Studio(웹 기반 데이터베이스 GUI)를 제공하여 데이터베이스 관리를 더욱 쉽게 해줍니다.

프리즈마 설정

이제 어떻게 설치되고 애플리케이션에서 어떻게 작동하는지 살펴보겠습니다.

이 블로그 게시물의 주요 초점은 Prisma 쿼리를 캐싱하는 것이기 때문에 로컬에서 매우 간단한 SQLite 데이터베이스를 사용하여 Prisma 작업을 시연하기 위해 몇 가지 Prisma 작업을 수행할 수 있습니다.

sqlite3를 설치해야 합니다 먼저 앱이 SQLite 데이터베이스에 연결하고 상호 작용할 수 있는지 확인합니다. 앞서 언급했듯이 SQLite 설정은 Prisma가 데이터베이스와 어떻게 작동하는지 보여주기 위한 것입니다. 다른 선호 사항이 있는 경우 Prisma 문서에서 데이터베이스 유형과 Prisma의 통합을 찾을 수 있습니다.

터미널의 프로젝트 디렉터리로 이동하여 여기에 SQLite를 설치하세요.

npm install sqlite3

이제 Prisma ORM을 활용하기 위해 Prisma CLI를 설치해야 합니다.

npm install prisma --save-dev

그런 다음 Prisma를 초기화하십시오. 이 초기화는 prisma을 생성합니다. schema.prisma가 있는 디렉토리 파일. schema.prisma 파일은 데이터베이스 구조(모델, 필드 등)를 정의하는 곳입니다.

npx prisma init

이제 Prisma 스키마를 정의하겠습니다. prisma/schema.prisma를 열어보자 파일을 편집기에 넣으세요.

이 파일은 세 개의 블록으로 구성됩니다. 첫 번째 블록은 Node.js 애플리케이션에 사용되는 클라이언트를 생성하도록 Prisma를 구성하는 생성기입니다. 두 번째는 데이터 소스 블록입니다. 이 블록에서는 Prisma를 연결하는 데 필요한 데이터베이스 정보를 제공합니다. 마지막 블록에는 데이터 유형 및 제약 조건을 포함하여 데이터베이스의 테이블과 해당 필드를 정의할 수 있는 데이터베이스 모델이 포함되어 있습니다.

아래 예시를 살펴보겠습니다.

generator client {
 provider = "prisma-client-js"
}
datasource db {
 provider = "sqlite"
 url = env("DATABASE_URL")
}
model user {
 id Int @id @default(autoincrement())
 name String
 email String @unique
 age Int?
}

보시다시피, 유형을 표시하여 데이터베이스 URL을 제공합니다. 그런데 프로젝트에서 DATABASE_URL 환경 변수를 설정하는 것을 잊지 마세요. 다른 데이터베이스 유형을 연결하려면 Prisma 문서를 확인하세요. 샘플 사례에서는 file:./dev.db으로 설정할 수 있습니다. .

그 외에도 user을 정의합니다. 유형과 제약 조건으로 열을 정의하여 테이블을 만듭니다. 필요에 따라 다양한 데이터베이스 유형을 사용하여 보다 정교한 모델을 만들 수 있습니다. 하지만 이 데모에서는 기본 설정으로 진행할 수 있습니다.

필요한 테이블을 생성하여 스키마를 데이터베이스와 동기화하려면 마이그레이션 명령을 실행해야 합니다. –name 플래그는 이 마이그레이션에 이름을 부여하므로 스키마 변경 사항을 더 쉽게 추적할 수 있습니다.

npx prisma migrate dev --name init

Prisma ORM을 갖춘 SQLite 데이터베이스가 이제 준비되었습니다.

Upstash Redis 설정

가장 빨리 완료할 수 있는 섹션입니다. 우리는 이 단계를 수천 번 수행했습니다. 그러나 이 블로그 게시물이 처음부터 완전한 가이드가 되도록 여기에서도 빠르게 단계를 수행하겠습니다. 누구든지 이러한 단계를 수행했다면 필요한 단계로 바로 이동할 수 있습니다.

Upstash 콘솔을 통해 Redis 데이터베이스를 생성하겠습니다.

“데이터베이스 생성” 버튼을 클릭하여 Redis 데이터베이스를 생성하고 팝업되는 모달의 단계를 완료해 보겠습니다.

데이터베이스 지역을 선택할 때 Upstash Redis 데이터베이스의 읽기 전용 복제본을 선택하는 것을 잊지 마세요. 이전 블로그 게시물에서 글로벌 Redis의 이점을 확인할 수 있습니다.

Upstash Redis 캐싱으로 Prisma ORM 성능 향상

Redis 데이터베이스가 준비되었습니다. Upstash Redis 설정에서 유일하게 남은 것은 애플리케이션에서 Redis 클라이언트를 초기화하는 것입니다. 이를 위해서는 먼저 Upstash Redis SDK를 설치해야 합니다.

npm install @upstash/redis

그런 다음 Upstash 콘솔의 Redis 엔드포인트와 비밀번호를 입력해야 합니다. 그런 다음 Upstash Redis에 연결할 코드에서 Redis 클라이언트를 구성하세요.

Upstash Redis로 Prisma 쿼리 캐싱

이 블로그의 앞부분에서 언급했듯이 캐시 배제 전략을 사용하겠습니다. 이를 위해 먼저 주어진 쿼리에서 요청한 데이터가 존재하는지 캐시를 확인합니다. 존재하는 경우 Upstash Redis에서 가져와서 반환합니다. 그렇지 않으면 위 섹션에서 생성된 Prisma 클라이언트를 사용하여 SQL 데이터베이스를 쿼리하고 SQL 데이터베이스에서 검색된 데이터로 캐시를 채웁니다.

import { Redis } from '@upstash/redis';
import { PrismaClient } from "@prisma/client";
 
const prisma = new PrismaClient();
 
const redis = new Redis({
 url: '<UPSTASH-REDIS-ENDPOINT>',
 token: '<UPSTASH-REDIS-TOKEN>',
})
 
async function getUser(userId: string) {
 const cacheKey = `user:${userId}`;
 
 // Check cache
 const cachedUser = await redis.get(cacheKey);
 if (cachedUser) {
 console.log("Cache hit");
 return JSON.parse(cachedUser);
 }
 
 // Query database
 console.log("Cache miss");
 const user = await prisma.user.findUnique({
 where: { id: userId },
 });
 // Store in cache
 if (user) {
 await redis.set(cacheKey, JSON.stringify(user), { ex: 3600 }); // Cache for 1 hour
 }
 return user;
}

이 예에서 볼 수 있듯이 prisma.<tableName>.findUnique() 쿼리 조건을 정의하는 매개변수가 포함된 메서드를 사용하면 개발자가 SQL 데이터베이스를 코드 형식으로 쿼리할 수 있습니다.

예를 들어 findMany()를 사용하여 사용자 테이블의 모든 사용자를 검색할 수 있습니다. 다음과 같은 기능을 수행합니다:

const user = await prisma.user.findMany();

결론

이 블로그 게시물에서는 Prisma 쿼리를 캐싱하기 위해 Prisma를 Upstash Redis와 통합하는 방법을 살펴보았습니다.

Prisma와 Upstash Redis는 모두 매우 간단하고 사용하기 쉽습니다. 개발자 친화적인 아키텍처 외에도 매우 영향력이 큽니다. Prisma는 코딩 형식으로 데이터베이스를 관리할 수 있는 매핑 기능 덕분에 엄청난 개발 시간을 절약할 수 있습니다. Upstash Redis로 Prisma 쿼리를 캐싱하면 데이터 검색 지연 시간을 크게 줄이고 애플리케이션의 기본 SQL 데이터베이스에 대한 부하를 줄일 수도 있습니다.

이 블로그가 여러분 모두에게 도움이 되기를 바랍니다!