Prisma
Prisma
Prisma๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ GraphQL API๋ก ๋ฐ๊พธ๊ณ GraphQL์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฒ์ฉ ์ฟผ๋ฆฌ ์ธ์ด๋ก ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. SQL์ ์์ฑํ๊ฑฐ๋ NoSQL API๋ฅผ ์ฌ์ฉํ๋ ๋์ GraphQL์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌ ํ ์ ์์ต๋๋ค. ์ด ์ฅ์์๋ Prisma์ ๋ํด ์์ธํ ๋ค๋ฃจ์ง ์์ผ๋ฏ๋ก ์น ์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํ์ฌ features๊ฐ ๋ฌด์์ธ์ง ์ดํด๋ณด์ญ์์ค.
warning ์๋ฆผ ์ด ๊ธฐ์ฌ์์๋
Prisma
๋ฅผ Nest ํ๋ ์ ์ํฌ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ GraphQL ๊ฐ๋ ๊ณผ@nestjs/graphql
๋ชจ๋์ ์ต์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค..
Dependencies
๋จผ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผํฉ๋๋ค.
$ npm install --save prisma-binding
Setup Prisma
Prisma๋ก ์์ ํ๋ ๋์ ์์ ์ ์ธ์คํด์ค๋ฅผ ํธ์คํ ํ๊ฑฐ๋ Prisma Cloud๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ์๊ฐ์์๋ Prisma๊ฐ ์ ๊ณตํ๋ ๋ฐ๋ชจ ์๋ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Prisma CLI ์ค์น
npm install -g prisma
์๋ก์ด ์๋น์ค
prisma init
๋ฅผ ๋ง๋ค๊ณ ๋ฐ๋ชจ ์๋ฒ๋ฅผ ์ ํํ ๋ค์ ์ง์๋ฅผ ๋ฐ๋ฅด์ญ์์ค์๋น์ค
prisma deploy
๋ฐฐํฌ
๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด Quick Start ์น์
์ผ๋ก ์ด๋ํ์ฌ ์์ธํ ๋ด์ฉ์ ํ์ธํ์ญ์์ค. ๊ฒฐ๊ตญ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์prisma.yaml
์ค์ ํ์ผ์ด๋ผ๋ ๋ ๊ฐ์ ์๋ก์ด ํ์ผ์ด ๋ํ๋ฉ๋๋ค.
endpoint: https://us1.prisma.sh/nest-f6ec12/prisma/dev
datamodel: datamodel.graphql
์๋์ผ๋ก ์์ฑ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ datamodel.graphql
.
type User {
id: ID! @unique
name: String!
}
warning ์๋ฆผ ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ง๋ญ๋๋ค. Prisma์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด ์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ญ์์ค.
prisma playground
๋ฅผ ์
๋ ฅํ๋ฉด Prisma GraphQL ๋์ดํฐ๋ฅผ ์ด ์ ์์ต๋๋ค.
Create the client
GraphQL API๋ฅผ ํตํฉํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ GraphQL ๊ฐ๋ฐ ์ํฌ ํ๋ก์ฐ๋ฅผ ์ํ ๋ช ๋ น ์ค ๋๊ตฌ ์ธ GraphQL CLI๋ฅผ ์ฌ์ฉํฉ๋๋ค. GraphQL CLI๋ฅผ ์ค์นํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ญ์์ค.
$ npm install -g graphql-cli
๊ทธ๋ฐ ๋ค์ Nest ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .graphqlconfig
๋ฅผ ์์ฑํ์ญ์์ค.
$ touch .graphqlconfig.yml
๋ค์ ๋ด์ฉ์ ๋ฃ์ผ์ญ์์ค.
projects:
database:
schemaPath: src/prisma/prisma-types.graphql
extensions:
endpoints:
default: https://us1.prisma.sh/nest-f6ec12/prisma/dev
codegen:
- generator: prisma-binding
language: typescript
output:
binding: src/prisma/prisma.binding.ts
Prisma GraphQL ์คํค๋ง๋ฅผ prisma/prisma-types.graphql
๋ก ๋ค์ด๋ก๋ํ๊ณ prisma/prisma.binding.graphql
์์ Prisma ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช
๋ น์ ์คํํ์ญ์์ค.
$ graphql get-schema --project database
$ graphql codegen --project database
Integration
๊ฑฐ์ ๋ค๋์ต๋๋ค. ์ด์ Prisma ํตํฉ์ ์ํ ๋ชจ๋์ ๋ง๋ค์ด ๋ด ์๋ค.
@@filename(prisma.service)
import { Injectable } from '@nestjs/common';
import { Prisma } from './prisma.binding';
@Injectable()
export class PrismaService extends Prisma {
constructor() {
super({
endpoint: 'https://us1.prisma.sh/nest-f6ec12/prisma/dev',
debug: false,
});
}
}
PrismaService
๊ฐ ์ค๋น๋๋ฉด ํด๋น ๋ชจ๋์ ๋ง๋ค์ด์ผํฉ๋๋ค.
@@filename(prisma.module)
import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
info ํํธ ์๋ก์ด ๋ชจ๋๊ณผ ์๋น์ค๋ฅผ ์ฆ์ ์์ฑํ๊ธฐ ์ํด Nest CLI๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
PrismaModule
ํ์์ ๋ง๋ค๊ธฐ ์ํด์๋nest g module prisma
๊ทธ๋ฆฌ๊ณ ์๋น์ค๋ฅผ ์ํด์nest g service prisma
Usage
์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด PrismaModule
์ ๊ฐ์ ธ์ค๊ณ PrismaService
๋ฅผ UsersResolver
์ ์ฃผ์
ํฉ๋๋ค.
@@filename(users.module)
import { Module } from '@nestjs/common';
import { UsersResolver } from './users.resolver';
import { PrismaModule } from '../prisma/prisma.module';
@Module({
imports: [PrismaModule],
providers: [UsersResolver],
})
export class UsersModule {}
PrismaModule
์ ๊ฐ์ ธ ์ค๋ฉด UsersModule
์ปจํ
์คํธ์์ ๋ด ๋ณด๋ธ PrismaService
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@@filename(users.resolver)
import { Query, Resolver, Args, Info } from '@nestjs/graphql';
import { PrismaService } from '../prisma/prisma.service';
import { User } from '../graphql.schema';
@Resolver()
export class UsersResolver {
constructor(private readonly prisma: PrismaService) {}
@Query('users')
async getUsers(@Args() args, @Info() info): Promise<User[]> {
return await this.prisma.query.users(args, info);
}
}
Example
์ฝ๊ฐ ์์ ๋ ์์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค ์ฌ๊ธฐ.
Last updated
Was this helpful?