Prisma 및 PostgreSQL로 REST API를 구축하는 방법
저자는 Write for DOnations 프로그램을 선택했습니다.
소개
Prisma는 Node.js 및 TypeScript용 오픈 소스 ORM입니다. 세 가지 주요 도구로 구성됩니다.
- Prisma 클라이언트: 자동 생성 및 유형 안전 쿼리 빌더
- Prisma Migrate: 강력한 데이터 모델링 및 마이그레이션 시스템
- Prisma Studio: 데이터베이스의 데이터를 보고 편집하는 GUI입니다.
이러한 도구는 데이터베이스 워크플로에서 응용 프로그램 개발자의 생산성을 높이는 것을 목표로 합니다. Prisma의 가장 큰 이점 중 하나는 제공하는 추상화 수준입니다. 복잡한 SQL 쿼리 또는 스키마 마이그레이션을 파악하는 대신 응용 프로그램 개발자는 Prisma를 사용할 때 보다 직관적인 방식으로 데이터를 추론할 수 있습니다.
이 튜토리얼에서는 Express에서 작은 블로깅 애플리케이션을 위한 REST API를 빌드합니다. 자습서가 끝나면 다양한 HTTP 요청에 응답하고 데이터베이스에서 데이터를 읽고 쓸 수 있는 웹 서버가 컴퓨터에서 로컬로 실행됩니다.
전제 조건
이 자습서에서는 다음을 가정합니다.
- Node.js를 설치하고 로컬 개발 환경을 만드는 방법은 이를 설정하기 위한 OS 가이드입니다.
- Linux 배포판용 Docker 설치 및 사용 방법.
TypeScript 및 REST API에 대한 기본 지식이 있으면 도움이 되지만 이 자습서에서는 필수 사항이 아닙니다.
1단계 — TypeScript 프로젝트 만들기
이 단계에서는 npm
을 사용하여 일반 TypeScript 프로젝트를 설정합니다. 이 프로젝트는 이 튜토리얼에서 구축할 REST API의 기초가 될 것입니다.
먼저 프로젝트의 새 디렉터리를 만듭니다.
- mkdir my-blog
다음으로 디렉토리로 이동하여 빈 npm
프로젝트를 초기화합니다. 여기서 -y
옵션은 명령의 대화형 프롬프트를 건너뛴다는 의미입니다. 프롬프트를 실행하려면 명령에서 -y
를 제거하십시오.
- cd my-blog
- npm init -y
이러한 프롬프트에 대한 자세한 내용은 npm 및 package.json과 함께 Node.js 모듈을 사용하는 방법의 1단계를 따를 수 있습니다.
기본 응답이 있는 다음과 유사한 출력을 받게 됩니다.
OutputWrote to /.../my-blog/package.json:
{
"name": "my-blog",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
이 명령은 npm
프로젝트의 구성 파일로 사용하는 최소한의 package.json
파일을 생성합니다. 이제 프로젝트에서 TypeScript를 구성할 준비가 되었습니다.
일반 TypeScript 설정을 위해 다음 명령을 실행합니다.
- npm install typescript ts-node @types/node --save-dev
이렇게 하면 프로젝트에 개발 종속성으로 세 가지 패키지가 설치됩니다.
typescript
: TypeScript 툴체인.ts-node
: JavaScript로 사전 컴파일하지 않고 TypeScript 애플리케이션을 실행하는 패키지입니다.@types/node
: Node.js에 대한 TypeScript 유형 정의입니다.
마지막으로 해야 할 일은 tsconfig.json
파일을 추가하여 빌드하려는 애플리케이션에 대해 TypeScript가 올바르게 구성되었는지 확인하는 것입니다.
먼저 다음 명령을 실행하여 파일을 생성합니다.
- nano tsconfig.json
파일에 다음 JSON 코드를 추가합니다.
{
"compilerOptions": {
"sourceMap": true,
"outDir": "dist",
"strict": true,
"lib": ["esnext"],
"esModuleInterop": true
}
}
파일을 저장하고 종료합니다.
이 설정은 TypeScript 프로젝트에 대한 표준 및 최소 구성입니다. 구성 파일의 개별 속성에 대해 알아보려면 TypeScript 설명서를 검토할 수 있습니다.
npm
을 사용하여 일반 TypeScript 프로젝트를 설정했습니다. 다음으로 Docker로 PostgreSQL 데이터베이스를 설정하고 여기에 Prisma를 연결합니다.
2단계 - PostgreSQL로 Prisma 설정
이 단계에서는 Prisma 스키마 파일을 설치하고 Docker로 PostgreSQL을 설정하고 Prisma를 연결합니다. Prisma 스키마는 Prisma 설정을 위한 기본 구성 파일이며 데이터베이스 스키마를 포함합니다.
다음 명령으로 Prisma CLI를 설치하여 시작하십시오.
- npm install prisma --save-dev
모범 사례로 Prisma CLI를 프로젝트에 로컬로(전역 설치가 아닌) 설치하는 것이 좋습니다. 이 방법은 컴퓨터에 둘 이상의 Prisma 프로젝트가 있는 경우 버전 충돌을 방지하는 데 도움이 됩니다.
다음으로 Docker를 사용하여 PostgreSQL 데이터베이스를 설정합니다. 다음 명령을 사용하여 새 Docker Compose 파일을 만듭니다.
- nano docker-compose.yml
이제 새로 만든 파일에 다음 코드를 추가합니다.
version: '3.8'
services:
postgres:
image: postgres:10.3
restart: always
environment:
- POSTGRES_USER=sammy
- POSTGRES_PASSWORD=your_password
volumes:
- postgres:/var/lib/postgresql/data
ports:
- '5432:5432'
volumes:
postgres:
이 Docker Compose 파일은 Docker 컨테이너의 포트 5432
를 통해 액세스할 수 있는 PostgreSQL 데이터베이스를 구성합니다. 데이터베이스 자격 증명은 현재 sammy
(사용자) 및 your_password
(암호)로 설정되어 있습니다. 이 자격 증명을 원하는 사용자 및 암호로 자유롭게 조정하십시오. 파일을 저장하고 종료합니다.
이 설정이 완료되면 다음 명령을 사용하여 PostgreSQL 데이터베이스 서버를 시작합니다.
- docker-compose up -d
이 명령의 출력은 다음과 유사합니다.
OutputPulling postgres (postgres:10.3)...
10.3: Pulling from library/postgres
f2aa67a397c4: Pull complete
6de83ca23e55: Pull complete
. . .
Status: Downloaded newer image for postgres:10.3
Creating my-blog_postgres_1 ... done
다음 명령을 사용하여 데이터베이스 서버가 실행 중인지 확인할 수 있습니다.
- docker ps
이 명령은 다음과 유사한 내용을 출력합니다.
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8547f8e007ba postgres:10.3 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:5432->5432/tcp my-blog_postgres_1
데이터베이스 서버가 실행 중이면 이제 Prisma 설정을 만들 수 있습니다. Prisma CLI에서 다음 명령을 실행합니다.
- npx prisma init
이 명령은 다음 출력을 인쇄합니다.
Output✔ Your Prisma schema was created at prisma/schema.prisma.
You can now open it in your favorite editor.
가장 좋은 방법은 Prisma CLI의 모든 호출 앞에 npx
를 붙여 로컬 설치가 사용되고 있는지 확인하는 것입니다.
명령을 실행하면 Prisma CLI가 프로젝트에 prisma
라는 새 폴더를 생성합니다. 그 안에는 Prisma 프로젝트(데이터 모델 포함)의 기본 구성 파일인 schema.prisma
파일이 있습니다. 이 명령은 또한 데이터베이스 연결 URL을 정의할 루트 폴더에 .env
dotenv 파일을 추가합니다.
Prisma가 데이터베이스 위치를 알 수 있도록 .env
파일을 열고 DATABASE_URL
환경 변수를 조정합니다.
먼저 .env
파일을 엽니다.
- nano .env
이제 다음과 같이 환경 변수를 업데이트할 수 있습니다.
DATABASE_URL="postgresql://sammy:your_password@localhost:5432/my-blog?schema=public"
데이터베이스 자격 증명을 Docker Compose 파일에 지정한 자격 증명으로 변경해야 합니다. 연결 URL의 형식에 대해 자세히 알아보려면 Prisma 문서를 방문하십시오.
완료되면 파일을 저장하고 종료합니다.
이 단계에서는 Docker로 PostgreSQL 데이터베이스를 설정하고, Prisma CLI를 설치하고, 환경 변수를 통해 Prisma를 데이터베이스에 연결했습니다. 다음 섹션에서는 데이터 모델을 정의하고 데이터베이스 테이블을 생성합니다.
3단계 - 데이터 모델 정의 및 데이터베이스 테이블 생성
이 단계에서는 데이터 모델에 해당하는 테이블을 생성하기 위한 SQL 문을 생성하고 보낼 Prisma Migrate를 정의합니다. 블로깅 애플리케이션을 구축하고 있으므로 애플리케이션의 주요 항목은 사용자 및 게시물입니다.
Prisma는 자체 데이터 모델링 언어를 사용하여 애플리케이션 데이터의 형태를 정의합니다.
먼저 다음 명령을 사용하여 schema.prisma
파일을 엽니다.
- nano prisma/schema.prisma
이제 다음 모델 정의를 추가하십시오. 파일 하단의 generator client
블록 바로 뒤에 모델을 배치할 수 있습니다.
. . .
model User {
id Int @default(autoincrement()) @id
email String @unique
name String?
posts Post[]
}
model Post {
id Int @default(autoincrement()) @id
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
모델의 속성을 나타내는 두 개의 필드를 정의하고 있습니다. 모델은 데이터베이스 테이블에 매핑됩니다. 필드는 개별 열을 나타냅니다.
User
및 Post의
. 즉, 한 명의 사용자가 여러 게시물과 연결될 수 있습니다.posts
및 author
관계 필드에 의해 지정된 두 모델 간에 일대다 관계가 있습니다.
파일을 저장하고 종료합니다.
이러한 모델이 준비되면 이제 Prisma Migrate를 사용하여 데이터베이스에 해당 테이블을 생성할 수 있습니다. 터미널에서 다음 명령을 실행합니다.
- npx prisma migrate dev --name init
이 명령은 파일 시스템에 새 SQL 마이그레이션을 생성하고 데이터베이스로 보냅니다. 명령에 제공된 --name init
옵션은 마이그레이션의 이름을 지정하고 파일 시스템에 생성된 마이그레이션 폴더의 이름을 지정하는 데 사용됩니다.
이 명령의 출력은 다음과 유사합니다.
OutputEnvironment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "my-blog", schema "public" at "localhost:5432"
PostgreSQL database my-blog created at localhost:5432
The following migration(s) have been created and applied from new schema changes:
migrations/
└─ 20201209084626_init/
└─ migration.sql
Running generate... (Use --skip-generate to skip the generators)
✔ Generated Prisma Client (2.13.0) to ./node_modules/@prisma/client in 75ms
prisma/migrations/20201209084626_init/migration.sql
디렉토리의 SQL 마이그레이션 파일에는 데이터베이스에 대해 실행된 다음 명령문이 있습니다(파일 이름의 강조 표시된 부분은 다를 수 있음). 설정에서):
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL,
"email" TEXT NOT NULL,
"name" TEXT,
PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "Post" (
"id" SERIAL,
"title" TEXT NOT NULL,
"content" TEXT,
"published" BOOLEAN NOT NULL DEFAULT false,
"authorId" INTEGER,
PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "User.email_unique" ON "User"("email");
-- AddForeignKey
ALTER TABLE "Post" ADD FOREIGN KEY("authorId")REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
prisma migrate dev
명령에 --create-only
옵션을 추가하면 생성된 SQL 마이그레이션 파일을 사용자 정의할 수도 있습니다. 예를 들어 트리거를 설정하거나 기본 데이터베이스의 다른 기능을 사용할 수 있습니다.
이 단계에서는 Prisma 스키마에서 데이터 모델을 정의하고 Prisma Migrate로 각각의 데이터베이스 테이블을 생성했습니다. 다음 단계에서는 데이터베이스를 쿼리할 수 있도록 프로젝트에 Prisma 클라이언트를 설치합니다.
4단계 - 일반 스크립트에서 Prisma 클라이언트 쿼리 탐색
Prisma 클라이언트는 Node.js 또는 TypeScript 애플리케이션에서 프로그래밍 방식으로 데이터베이스의 데이터를 읽고 쓰는 데 사용할 수 있는 자동 생성 및 유형 안전 쿼리 빌더입니다. REST API 경로 내에서 데이터베이스 액세스에 사용하여 기존 ORM, 일반 SQL 쿼리, 사용자 지정 데이터 액세스 계층 또는 데이터베이스와 통신하는 다른 방법을 대체합니다.
이 단계에서는 Prisma 클라이언트를 설치하고 보낼 수 있는 쿼리에 익숙해집니다. 다음 단계에서 REST API에 대한 경로를 구현하기 전에 먼저 일반 실행 스크립트에서 일부 Prisma 클라이언트 쿼리를 탐색합니다.
먼저 Prisma Client npm
패키지를 사용하여 프로젝트 폴더에 Prisma Client를 설치합니다.
- npm install @prisma/client
다음으로 소스 파일을 포함할 src
라는 새 디렉터리를 만듭니다.
- mkdir src
이제 새 디렉터리 내에 TypeScript 파일을 만듭니다.
- nano src/index.ts
모든 Prisma 클라이언트 쿼리는 코드에서 대기
할 수 있는 약속을 반환합니다. 이렇게 하려면 async
함수 내에서 쿼리를 보내야 합니다.
src/index.ts
파일에서 스크립트에서 실행되는 async
함수와 함께 다음 상용구를 추가합니다.
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
// ... your Prisma Client queries will go here
}
main()
.catch((e) => console.error(e))
.finally(async () => await prisma.$disconnect())
다음은 상용구에 대한 간략한 설명입니다.
- 이전에 설치된
@prisma/client
npm
패키지에서PrismaClient
생성자를 가져옵니다. - 생성자를 호출하고
prisma
라는 인스턴스를 얻어서PrismaClient
를 인스턴스화합니다. - Prisma 클라이언트 쿼리를 추가할
main
이라는async
함수를 정의합니다. main
함수를 호출하여 잠재적인 예외를 포착하고 Prisma 클라이언트가prisma.$disconnect()
로 열린 데이터베이스 연결을 닫도록 합니다.
main
기능이 있으면 Prisma 클라이언트 쿼리를 스크립트에 추가할 수 있습니다. 비동기 함수에 강조 표시된 줄을 포함하도록 index.ts
를 조정합니다.
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const newUser = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
posts: {
create: {
title: 'Hello World',
},
},
},
})
console.log('Created new user: ', newUser)
const allUsers = await prisma.user.findMany({
include: { posts: true },
})
console.log('All users: ')
console.dir(allUsers, { depth: null })
}
main()
.catch((e) => console.error(e))
.finally(async () => await prisma.$disconnect())
이 코드에서는 두 개의 Prisma 클라이언트 쿼리를 사용하고 있습니다.
create
: 새User
레코드를 만듭니다. 중첩된 쓰기 쿼리를 사용하여 동일한 쿼리에서User
및Post
레코드를 모두 생성합니다.findMany
: 데이터베이스에서 모든 기존사용자
레코드를 읽습니다. 각User
레코드에 대한 관련Post
레코드를 추가로 로드하는include
옵션을 제공합니다.
파일을 저장하고 닫습니다.
이제 다음 명령으로 스크립트를 실행합니다.
- npx ts-node src/index.ts
터미널에 다음 출력이 표시됩니다.
OutputCreated new user: { id: 1, email: 'alice@prisma.io', name: 'Alice' }
[
{
id: 1,
email: 'alice@prisma.io',
name: 'Alice',
posts: [
{
id: 1,
title: 'Hello World',
content: null,
published: false,
authorId: 1
}
]
}
참고: 데이터베이스 GUI를 사용하는 경우 User
및 Post
테이블을 검토하여 데이터가 생성되었는지 확인할 수 있습니다. 또는 npx prisma studio
를 실행하여 Prisma Studio에서 데이터를 탐색할 수 있습니다.
이제 Prisma Client를 사용하여 데이터베이스에서 데이터를 읽고 씁니다. 나머지 단계에서는 샘플 REST API에 대한 경로를 구현합니다.
5단계 - 첫 번째 REST API 경로 구현
이 단계에서는 애플리케이션에 Express를 설치합니다. Express는 이 프로젝트에서 REST API 경로를 구현하는 데 사용할 Node.js용 인기 웹 프레임워크입니다. 구현할 첫 번째 경로를 통해 GET
요청을 사용하여 API에서 모든 사용자를 가져올 수 있습니다. 사용자 데이터는 Prisma 클라이언트를 사용하여 데이터베이스에서 검색됩니다.
다음 명령을 사용하여 Express를 설치합니다.
- npm install express
TypeScript를 사용하고 있으므로 각 유형을 개발 종속성으로 설치해야 합니다. 이렇게 하려면 다음 명령을 실행하십시오.
- npm install @types/express --save-dev
종속성이 있으면 Express 애플리케이션을 설정할 수 있습니다.
기본 소스 파일을 다시 엽니다.
- nano src/index.ts
이제 index.ts
의 모든 코드를 삭제하고 다음 코드로 교체하여 REST API를 시작합니다.
import { PrismaClient } from '@prisma/client'
import express from 'express'
const prisma = new PrismaClient()
const app = express()
app.use(express.json())
// ... your REST API routes will go here
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
다음은 코드의 빠른 분석입니다.
- 해당
npm
패키지에서PrismaClient
및express
를 가져옵니다. - 생성자를 호출하고
prisma
라는 인스턴스를 얻어서PrismaClient
를 인스턴스화합니다. express()
를 호출하여 Express 앱을 만듭니다.express.json()
미들웨어를 추가하여 Express에서 JSON 데이터를 제대로 처리할 수 있도록 합니다.- 포트
3000
에서 서버를 시작합니다.
이제 첫 번째 경로를 구현할 수 있습니다. app.use
와 app.listen
호출 사이에 강조 표시된 줄을 추가하여 app.get
호출을 만듭니다.
. . .
app.use(express.json())
app.get('/users', async (req, res) => {
const users = await prisma.user.findMany()
res.json(users)
})
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
추가되면 파일을 저장하고 종료합니다. 그런 다음 다음 명령을 사용하여 로컬 웹 서버를 시작합니다.
- npx ts-node src/index.ts
다음 출력을 받게 됩니다.
OutputREST API server ready at: http://localhost:3000
/users
경로에 액세스하려면 브라우저에서 http://localhost:3000/users
또는 다른 HTTP 클라이언트를 가리킬 수 있습니다.
이 자습서에서는 터미널 기반 HTTP 클라이언트인 curl
을 사용하여 모든 REST API 경로를 테스트합니다.
참고: GUI 기반 HTTP 클라이언트를 선호하는 경우 Postman과 같은 대안을 사용할 수 있습니다.
경로를 테스트하려면 새 터미널 창이나 탭을 열고(로컬 웹 서버가 계속 실행될 수 있도록) 다음 명령을 실행합니다.
- curl http://localhost:3000/users
이전 단계에서 만든 사용자
데이터를 받게 됩니다.
Output[{"id":1,"email":"alice@prisma.io","name":"Alice"}]
posts
배열은 구현에서
경로.findMany
호출에 include
옵션을 전달하지 않기 때문에 이번에는 포함되지 않습니다. /users
/users
에서 첫 번째 REST API 경로를 구현했습니다. 다음 단계에서는 나머지 REST API 경로를 구현하여 API에 더 많은 기능을 추가합니다.
6단계 - 나머지 REST API 경로 구현
이 단계에서는 블로그 애플리케이션에 대한 나머지 REST API 경로를 구현합니다. 결국 웹 서버는 다양한 GET
, POST
, PUT
및 DELETE
요청을 처리합니다.
구현할 경로에는 다음 옵션이 포함됩니다.
HTTP Method | Route | Description |
---|---|---|
GET |
/feed |
Fetches all published posts. |
GET |
/post/:id |
Fetches a specific post by its ID. |
POST |
/user |
Creates a new user. |
POST |
/post |
Creates a new post (as a draft). |
PUT |
/post/publish/:id |
Sets the published field of a post to true . |
DELETE |
post/:id |
Deletes a post by its ID. |
나머지 두 GET
경로를 먼저 구현합니다.
키보드에서 CTRL+C
를 눌러 서버를 중지할 수 있습니다. 그런 다음 먼저 편집을 위해 파일을 열어 index.ts
파일을 업데이트할 수 있습니다.
- nano src/index.ts
다음으로 /app.get
사용자 경로 구현 다음에 강조 표시된 줄을 추가합니다.
. . .
app.get('/feed', async (req, res) => {
const posts = await prisma.post.findMany({
where: { published: true },
include: { author: true }
})
res.json(posts)
})
app.get(`/post/:id`, async (req, res) => {
const { id } = req.params
const post = await prisma.post.findUnique({
where: { id: Number(id) },
})
res.json(post)
})
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
이 코드는 두 개의 GET
요청에 대한 API 경로를 구현합니다.
/feed
: 게시된 게시물 목록을 반환합니다./post/:id
: ID로 특정 게시물을 반환합니다.
Prisma 클라이언트는 두 구현 모두에서 사용됩니다. /feed
경로 구현에서 Prisma Client로 보내는 쿼리는 published
열에 값이 포함된 모든
. 또한 Prisma 클라이언트 쿼리는 Post
레코드를 필터링합니다. 참include
를 사용하여 반환된 각 게시물에 대한 관련 author
정보도 가져옵니다. /post/:id
경로 구현에서는 데이터베이스에서 특정 Post
레코드를 읽기 위해 URL의 경로에서 검색된 ID를 전달합니다.
파일을 저장하고 종료합니다. 그런 다음 다음을 사용하여 서버를 다시 시작합니다.
- npx ts-node src/index.ts
/feed
경로를 테스트하려면 두 번째 터미널 세션에서 다음 curl
명령을 사용할 수 있습니다.
- curl http://localhost:3000/feed
아직 게시된 게시물이 없으므로 응답은 빈 배열입니다.
Output[]
/post/:id
경로를 테스트하려면 다음 curl
명령을 사용할 수 있습니다.
- curl http://localhost:3000/post/1
이 명령은 처음에 만든 게시물을 반환합니다.
Output{"id":1,"title":"Hello World","content":null,"published":false,"authorId":1}
다음으로 두 개의 POST
경로를 구현합니다. 원래 터미널 세션에서 CTRL+C
로 서버를 중지한 다음 편집을 위해 index.ts
를 엽니다.
- nano src/index.ts
세 가지 GET
경로 구현에 따라 index.ts
에 강조 표시된 줄을 추가합니다.
. . .
app.post(`/user`, async (req, res) => {
const result = await prisma.user.create({
data: { ...req.body },
})
res.json(result)
})
app.post(`/post`, async (req, res) => {
const { title, content, authorEmail } = req.body
const result = await prisma.post.create({
data: {
title,
content,
published: false,
author: { connect: { email: authorEmail } },
},
})
res.json(result)
})
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
이 코드는 두 개의 POST
요청에 대한 API 경로를 구현합니다.
/user
: 데이터베이스에 새 사용자를 생성합니다./post
: 데이터베이스에 새 게시물을 생성합니다.
이전과 마찬가지로 Prisma Client는 두 구현 모두에서 사용됩니다. /user
경로 구현에서 HTTP 요청 본문의 값을 Prisma Client create
쿼리에 전달합니다.
/post
경로는 더 복잡합니다. HTTP 요청 본문에서 값을 직접 전달할 수 없습니다. 대신 먼저 수동으로 추출하여 Prisma 클라이언트 쿼리에 전달해야 합니다. 요청 본문의 JSON 구조가 Prisma 클라이언트에서 예상하는 구조와 일치하지 않기 때문에 예상 구조를 수동으로 생성해야 합니다.
완료되면 파일을 저장하고 종료합니다.
다음을 사용하여 서버를 다시 시작합니다.
- npx ts-node src/index.ts
/user
경로를 통해 새 사용자를 생성하려면 curl
과 함께 다음 POST
요청을 보낼 수 있습니다.
- curl -X POST -H "Content-Type: application/json" -d '{"name":"Bob", "email":"bob@prisma.io"}' http://localhost:3000/user
이렇게 하면 데이터베이스에 새 사용자가 생성되고 다음 출력이 인쇄됩니다.
Output{"id":2,"email":"bob@prisma.io","name":"Bob"}
/post
경로를 통해 새 게시물을 생성하려면 curl
과 함께 다음 POST
요청을 보낼 수 있습니다.
- curl -X POST -H "Content-Type: application/json" -d '{"title":"I am Bob", "authorEmail":"bob@prisma.io"}' http://localhost:3000/post
이렇게 하면 데이터베이스에 새 게시물이 생성되고 이메일 bob@prisma.io
를 사용하여 사용자에게 연결됩니다. 다음 출력을 인쇄합니다.
Output{"id":2,"title":"I am Bob","content":null,"published":false,"authorId":2}
마지막으로 PUT
및 DELETE
경로를 구현합니다. 개발 서버를 중지한 후 다음 명령을 사용하여 index.ts
를 엽니다.
- nano src/index.ts
다음으로 두 개의 POST
경로 구현에 따라 강조 표시된 코드를 추가합니다.
. . .
app.put('/post/publish/:id', async (req, res) => {
const { id } = req.params
const post = await prisma.post.update({
where: { id: Number(id) },
data: { published: true },
})
res.json(post)
})
app.delete(`/post/:id`, async (req, res) => {
const { id } = req.params
const post = await prisma.post.delete({
where: { id: Number(id) },
})
res.json(post)
})
app.listen(3000, () =>
console.log('REST API server ready at: http://localhost:3000'),
)
이 코드는 하나의 PUT
및 하나의 DELETE
요청에 대한 API 경로를 구현합니다.
/post/publish/:id
(PUT
): ID로 게시물을 게시합니다./post/:id
(DELETE
): ID로 게시물을 삭제합니다.
다시 말하지만, Prisma Client는 두 구현 모두에서 사용됩니다. /post/publish/:id
경로 구현에서 게시할 게시물의 ID는 URL에서 검색되어 Prisma Client의 update
쿼리로 전달됩니다. 데이터베이스에서 게시물을 삭제하기 위한 /post/:id
경로의 구현도 URL에서 게시물 ID를 검색하여 Prisma Client의 delete
쿼리에 전달합니다.
파일을 저장하고 종료합니다.
다음을 사용하여 서버를 다시 시작합니다.
- npx ts-node src/index.ts
다음 curl
명령을 사용하여 PUT
경로를 테스트할 수 있습니다.
- curl -X PUT http://localhost:3000/post/publish/2
이 명령은 ID 값이 2
인 게시물을 게시합니다. /feed
요청을 다시 보내면 이제 이 게시물이 응답에 포함됩니다.
마지막으로 다음 curl
명령을 사용하여 DELETE
경로를 테스트할 수 있습니다.
- curl -X DELETE http://localhost:3000/post/1
이 명령은 ID 값이 1
인 게시물을 삭제합니다. 이 ID가 있는 게시물이 삭제되었는지 확인하려면 다음 curl
을 사용하여 GET
요청을 /post/1
경로로 다시 보낼 수 있습니다. 명령:
- curl http://localhost:3000/post/1
이 단계에서는 블로그 애플리케이션에 대한 나머지 REST API 경로를 구현했습니다. API는 이제 다양한 GET
, POST
, PUT
및 DELETE
요청에 응답하고 읽기 및 쓰기 기능을 구현합니다. 데이터베이스의 데이터.
결론
이 기사에서는 샘플 블로깅 애플리케이션에 대한 사용자 및 게시물 데이터를 작성, 읽기, 업데이트 및 삭제하기 위한 다양한 경로가 있는 REST API 서버를 작성했습니다. API 경로 내에서 Prisma 클라이언트를 사용하여 해당 쿼리를 데이터베이스로 보냅니다.
다음 단계로 추가 API 경로를 구현하거나 Prisma Migrate를 사용하여 데이터베이스 스키마를 확장할 수 있습니다. prisma-examples
저장소를 방문하세요.