웹사이트 검색

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의 기초가 될 것입니다.

먼저 프로젝트의 새 디렉터리를 만듭니다.

  1. mkdir my-blog

다음으로 디렉토리로 이동하여 빈 npm 프로젝트를 초기화합니다. 여기서 -y 옵션은 명령의 대화형 프롬프트를 건너뛴다는 의미입니다. 프롬프트를 실행하려면 명령에서 -y를 제거하십시오.

  1. cd my-blog
  2. npm init -y

이러한 프롬프트에 대한 자세한 내용은 npm 및 package.json과 함께 Node.js 모듈을 사용하는 방법의 1단계를 따를 수 있습니다.

기본 응답이 있는 다음과 유사한 출력을 받게 됩니다.

Output
Wrote 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 설정을 위해 다음 명령을 실행합니다.

  1. npm install typescript ts-node @types/node --save-dev

이렇게 하면 프로젝트에 개발 종속성으로 세 가지 패키지가 설치됩니다.

  • typescript: TypeScript 툴체인.
  • ts-node: JavaScript로 사전 컴파일하지 않고 TypeScript 애플리케이션을 실행하는 패키지입니다.
  • @types/node: Node.js에 대한 TypeScript 유형 정의입니다.

마지막으로 해야 할 일은 tsconfig.json 파일을 추가하여 빌드하려는 애플리케이션에 대해 TypeScript가 올바르게 구성되었는지 확인하는 것입니다.

먼저 다음 명령을 실행하여 파일을 생성합니다.

  1. 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를 설치하여 시작하십시오.

  1. npm install prisma --save-dev

모범 사례로 Prisma CLI를 프로젝트에 로컬로(전역 설치가 아닌) 설치하는 것이 좋습니다. 이 방법은 컴퓨터에 둘 이상의 Prisma 프로젝트가 있는 경우 버전 충돌을 방지하는 데 도움이 됩니다.

다음으로 Docker를 사용하여 PostgreSQL 데이터베이스를 설정합니다. 다음 명령을 사용하여 새 Docker Compose 파일을 만듭니다.

  1. 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 데이터베이스 서버를 시작합니다.

  1. docker-compose up -d

이 명령의 출력은 다음과 유사합니다.

Output
Pulling 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

다음 명령을 사용하여 데이터베이스 서버가 실행 중인지 확인할 수 있습니다.

  1. docker ps

이 명령은 다음과 유사한 내용을 출력합니다.

Output
CONTAINER 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에서 다음 명령을 실행합니다.

  1. 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 파일을 엽니다.

  1. 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 파일을 엽니다.

  1. 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?
}

모델의 속성을 나타내는 두 개의 필드를 정의하고 있습니다. 모델은 데이터베이스 테이블에 매핑됩니다. 필드는 개별 열을 나타냅니다.

UserPost의 postsauthor 관계 필드에 의해 지정된 두 모델 간에 일대다 관계가 있습니다. . 즉, 한 명의 사용자가 여러 게시물과 연결될 수 있습니다.

파일을 저장하고 종료합니다.

이러한 모델이 준비되면 이제 Prisma Migrate를 사용하여 데이터베이스에 해당 테이블을 생성할 수 있습니다. 터미널에서 다음 명령을 실행합니다.

  1. npx prisma migrate dev --name init

이 명령은 파일 시스템에 새 SQL 마이그레이션을 생성하고 데이터베이스로 보냅니다. 명령에 제공된 --name init 옵션은 마이그레이션의 이름을 지정하고 파일 시스템에 생성된 마이그레이션 폴더의 이름을 지정하는 데 사용됩니다.

이 명령의 출력은 다음과 유사합니다.

Output
Environment 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를 설치합니다.

  1. npm install @prisma/client

다음으로 소스 파일을 포함할 src라는 새 디렉터리를 만듭니다.

  1. mkdir src

이제 새 디렉터리 내에 TypeScript 파일을 만듭니다.

  1. 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())

다음은 상용구에 대한 간략한 설명입니다.

  1. 이전에 설치된 @prisma/client npm 패키지에서 PrismaClient 생성자를 가져옵니다.
  2. 생성자를 호출하고 prisma라는 인스턴스를 얻어서 PrismaClient를 인스턴스화합니다.
  3. Prisma 클라이언트 쿼리를 추가할 main이라는 async 함수를 정의합니다.
  4. 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 레코드를 만듭니다. 중첩된 쓰기 쿼리를 사용하여 동일한 쿼리에서 UserPost 레코드를 모두 생성합니다.
  • findMany: 데이터베이스에서 모든 기존 사용자 레코드를 읽습니다. 각 User 레코드에 대한 관련 Post 레코드를 추가로 로드하는 include 옵션을 제공합니다.

파일을 저장하고 닫습니다.

이제 다음 명령으로 스크립트를 실행합니다.

  1. npx ts-node src/index.ts

터미널에 다음 출력이 표시됩니다.

Output
Created 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를 사용하는 경우 UserPost 테이블을 검토하여 데이터가 생성되었는지 확인할 수 있습니다. 또는 npx prisma studio를 실행하여 Prisma Studio에서 데이터를 탐색할 수 있습니다.

이제 Prisma Client를 사용하여 데이터베이스에서 데이터를 읽고 씁니다. 나머지 단계에서는 샘플 REST API에 대한 경로를 구현합니다.

5단계 - 첫 번째 REST API 경로 구현

이 단계에서는 애플리케이션에 Express를 설치합니다. Express는 이 프로젝트에서 REST API 경로를 구현하는 데 사용할 Node.js용 인기 웹 프레임워크입니다. 구현할 첫 번째 경로를 통해 GET 요청을 사용하여 API에서 모든 사용자를 가져올 수 있습니다. 사용자 데이터는 Prisma 클라이언트를 사용하여 데이터베이스에서 검색됩니다.

다음 명령을 사용하여 Express를 설치합니다.

  1. npm install express

TypeScript를 사용하고 있으므로 각 유형을 개발 종속성으로 설치해야 합니다. 이렇게 하려면 다음 명령을 실행하십시오.

  1. npm install @types/express --save-dev

종속성이 있으면 Express 애플리케이션을 설정할 수 있습니다.

기본 소스 파일을 다시 엽니다.

  1. 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'),
)

다음은 코드의 빠른 분석입니다.

  1. 해당 npm 패키지에서 PrismaClientexpress를 가져옵니다.
  2. 생성자를 호출하고 prisma라는 인스턴스를 얻어서 PrismaClient를 인스턴스화합니다.
  3. express()를 호출하여 Express 앱을 만듭니다.
  4. express.json() 미들웨어를 추가하여 Express에서 JSON 데이터를 제대로 처리할 수 있도록 합니다.
  5. 포트 3000에서 서버를 시작합니다.

이제 첫 번째 경로를 구현할 수 있습니다. app.useapp.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'),
)

추가되면 파일을 저장하고 종료합니다. 그런 다음 다음 명령을 사용하여 로컬 웹 서버를 시작합니다.

  1. npx ts-node src/index.ts

다음 출력을 받게 됩니다.

Output
REST API server ready at: http://localhost:3000

/users 경로에 액세스하려면 브라우저에서 http://localhost:3000/users 또는 다른 HTTP 클라이언트를 가리킬 수 있습니다.

이 자습서에서는 터미널 기반 HTTP 클라이언트인 curl을 사용하여 모든 REST API 경로를 테스트합니다.

참고: GUI 기반 HTTP 클라이언트를 선호하는 경우 Postman과 같은 대안을 사용할 수 있습니다.

경로를 테스트하려면 새 터미널 창이나 탭을 열고(로컬 웹 서버가 계속 실행될 수 있도록) 다음 명령을 실행합니다.

  1. 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, PUTDELETE 요청을 처리합니다.

구현할 경로에는 다음 옵션이 포함됩니다.

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 파일을 업데이트할 수 있습니다.

  1. 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 열에 값이 포함된 모든 Post 레코드를 필터링합니다. 참. 또한 Prisma 클라이언트 쿼리는 include를 사용하여 반환된 각 게시물에 대한 관련 author 정보도 가져옵니다. /post/:id 경로 구현에서는 데이터베이스에서 특정 Post 레코드를 읽기 위해 URL의 경로에서 검색된 ID를 전달합니다.

파일을 저장하고 종료합니다. 그런 다음 다음을 사용하여 서버를 다시 시작합니다.

  1. npx ts-node src/index.ts

/feed 경로를 테스트하려면 두 번째 터미널 세션에서 다음 curl 명령을 사용할 수 있습니다.

  1. curl http://localhost:3000/feed

아직 게시된 게시물이 없으므로 응답은 빈 배열입니다.

Output
[]

/post/:id 경로를 테스트하려면 다음 curl 명령을 사용할 수 있습니다.

  1. curl http://localhost:3000/post/1

이 명령은 처음에 만든 게시물을 반환합니다.

Output
{"id":1,"title":"Hello World","content":null,"published":false,"authorId":1}

다음으로 두 개의 POST 경로를 구현합니다. 원래 터미널 세션에서 CTRL+C로 서버를 중지한 다음 편집을 위해 index.ts를 엽니다.

  1. 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 클라이언트에서 예상하는 구조와 일치하지 않기 때문에 예상 구조를 수동으로 생성해야 합니다.

완료되면 파일을 저장하고 종료합니다.

다음을 사용하여 서버를 다시 시작합니다.

  1. npx ts-node src/index.ts

/user 경로를 통해 새 사용자를 생성하려면 curl과 함께 다음 POST 요청을 보낼 수 있습니다.

  1. 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 요청을 보낼 수 있습니다.

  1. 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}

마지막으로 PUTDELETE 경로를 구현합니다. 개발 서버를 중지한 후 다음 명령을 사용하여 index.ts를 엽니다.

  1. 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 쿼리에 전달합니다.

파일을 저장하고 종료합니다.

다음을 사용하여 서버를 다시 시작합니다.

  1. npx ts-node src/index.ts

다음 curl 명령을 사용하여 PUT 경로를 테스트할 수 있습니다.

  1. curl -X PUT http://localhost:3000/post/publish/2

이 명령은 ID 값이 2인 게시물을 게시합니다. /feed 요청을 다시 보내면 이제 이 게시물이 응답에 포함됩니다.

마지막으로 다음 curl 명령을 사용하여 DELETE 경로를 테스트할 수 있습니다.

  1. curl -X DELETE http://localhost:3000/post/1

이 명령은 ID 값이 1인 게시물을 삭제합니다. 이 ID가 있는 게시물이 삭제되었는지 확인하려면 다음 curl을 사용하여 GET 요청을 /post/1 경로로 다시 보낼 수 있습니다. 명령:

  1. curl http://localhost:3000/post/1

이 단계에서는 블로그 애플리케이션에 대한 나머지 REST API 경로를 구현했습니다. API는 이제 다양한 GET, POST, PUTDELETE 요청에 응답하고 읽기 및 쓰기 기능을 구현합니다. 데이터베이스의 데이터.

결론

이 기사에서는 샘플 블로깅 애플리케이션에 대한 사용자 및 게시물 데이터를 작성, 읽기, 업데이트 및 삭제하기 위한 다양한 경로가 있는 REST API 서버를 작성했습니다. API 경로 내에서 Prisma 클라이언트를 사용하여 해당 쿼리를 데이터베이스로 보냅니다.

다음 단계로 추가 API 경로를 구현하거나 Prisma Migrate를 사용하여 데이터베이스 스키마를 확장할 수 있습니다. prisma-examples 저장소를 방문하세요.