- ๐ NestJS๋?
- ๐ NestJS ์ค์น
- ๐ NestJS ํด๋ ๊ตฌ์กฐ
- ๐ NestJS package.json
- ๐ prettier ์ ์ฅ์ ์๋ํฌ๋ฉงํ
- ๐ TypeScript ํด๋ ๊ตฌ์กฐ
- ๐ NestJS started with GraphQL & TypeScript
NestJS๋ TypeScript(ํ์ ์คํฌ๋ฆฝํธ)๋ฅผ ์ง์ํ๋ย ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํย Node.js์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ์ด๋ค.
OOP (Object Oriented Programming), FP (Functional Programming) ๋ฐ FRP (Functional Reactive Programming) ์์๋ฅผ ๊ฒฐํฉํ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
Node.js๋ก Backend๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ง์น ๋ ๊ณ ์ ๊ฐ์๋ฐ, ๋ ๊ณ ์ฒ๋ผ ์กฐ๋ฆฝํ ์ ์๋ ๋ถํ์ด ์๊ณ , ๊ทธ ์์ ๋ถํ๋ค์ ์ฐจ๊ทผ์ฐจ๊ทผ ์กฐ๋ฆฝํ๋ค ๋ณด๋ฉด ๊ฑฐ๋ํ ์์ฑํ์ ๋ง๋ค ์ ์๋ค.
Node.js๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋์ ํ์ผ์์ ์์ํด์ ์ ์ฐจ ์ ์ฐจ ์ปค์ง๊ฒ ๋๋ค.
๊ท์น๋, ์ ์ฝ๋ ์์ด ์์ ๋กญ๊ฒ ํ ์ ์๊ณ 0์์ ๊ฑฐ๋ํ ๊ฒ์ ์ฐฝ์กฐํ๋ ๊ณผ์ ์ด๊ธฐ์ ๋งค์ฐ ํ๋ฅญํ ๊ฒฝํ์ด ๋ ์ ์๋ค.
ํ์ง๋ง, ๋ฌธ์ ๋ ๋๋ฌด ์ ์ฝ์ด ์๊ณ , ๋๋ฌด ์์ ๋กญ๋ค๋ ๊ฒ์ด๋ค.
๋๋ก๋ ๊ท์น์ด๋ ์ ์ฝ, ์ฆ ๊ตฌ์กฐ์ ํ๋ ์์ํฌ๊ฐ ํ์ํ ๋๊ฐ ์๋ค.
๋ค๋ฅธ ์ธ์ด, ์๋ฅผ ๋ค์ด ํ์ด์ฌ์๋ ์ฅ๊ณ ๋ผ๋ ํ๋ ์์ํฌ๊ฐ ์๊ณ Java๋ Spring์ด ์์ต๋๋ค.
ํ์ง๋ง Node.js์๋ ๊ท์น์ด ์๊ณ , ์ด๋ค ํจํด์ ๋ฐ๋ผ์ผ ํ ์ง๋ ๋ชจ๋ฅด๋ฉฐ ์ฌ์ฉ์๊ฐ ์ ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค.
์ด๋ฐ ์์ ๋ก์์ ์ข์ ์ ๋ ๋ง์ง๋ง, ํ๋ก์ ํธ๋ก ํ์ ์ ์งํํ ๊ฒฝ์ฐ ๋งค์ฐ ์ด๋ ต๋ค.
๊ฐ๋ฐ์๋ง๋ค ๋ค์ํ Architecture ํจํด์ ๊ฐ์ง๊ณ ์๊ณ , ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ฐ์ธ์ ๊ตฌ์กฐ์ ์คํ์ผ์ ๋ค๋ฆ์ผ๋ก ์ธํด ํ์ ๊ณผ์ ์ ๋๋ ์ํต ๋น์ฉ์ด ์ฆ๊ฐํ๋ค.
์ด๋ ์์ฐ์ฑ ์ ํ์ ์ ์ง ๋ณด์์ ์ด๋ ค์์ผ๋ก ์ด์ด์ง๋ค.
NestJS๋ Architecture ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ Node.js์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๋ค!!!
NestJs๋ Node.js๋ฅผ ์ํ ํ๋ ์์ํฌ๋ก, ๊ท์น๊ณผ ๊ตฌ์กฐ ์์ด ์์ ๋ถ๋ฐฉํ node.js๋ฅผ ์์๊ฐ์ Python+Django, Java+Spring ์์ค์ผ๋ก ๋ง๋ค์ด์ค๋ค.
๋๋ฌธ์ ๊ฐ ๊ฐ๋ฐ์๋ค์ด Architecture๋ฅผ ํต์ผํ๊ณ ์ํต ๋น์ฉ์ ์ ๊ฐํ๋ฉฐ, ํ์ฅ์ฑ ์๊ณ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
NestJS๋ ๊ฐ๋ฐ์์ ํ์ด ๊ณ ๋๋ก ํ
์คํธ ๊ฐ๋ฅํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ๋์จํ๊ฒ ๊ฒฐํฉ๋๊ณ ์ ์ง๊ด๋ฆฌ๊ฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๋ย ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
์ํคํ
์ฒ
๋ฅผ ์ ๊ณตํ๋ค.
๊ทธ ์ธ์๋ย TypeScript๊ธฐ๋ฐ์ Framework
์ด๋ฉฐย Dependency Injection(์์กด์ฑ์ฃผ์
)
,ย Inversion of Control(์ ์ด์ ์ญ์ )
,ย Module
์ ํตํ ๊ตฌ์กฐํ ๋ฑ ์์ฐ์ฑ์ ์ฉ์ดํ๋ค.
NestJS๋ย TypeScript๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋์ ํ๋ฉด์ ์๋ฒ ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ์ ๋ฐ์ ๊ฐ๋ฅํ ์ค๋ฅ๋ค์ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋๋ก ํ๋ค.
๋ํ ์ธ๋ถ์ ์ธ Module๋ก ๋๋์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฆฝ์ ์ธ Unit Test๋ฅผ ์ฝ๊ฒ ์์ฑ ๊ฐ๋ฅํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
NestJS๋ Module Class๋ฅผ ์ง์ํ๋ฉฐ, ๊ฐ Module์ ๋น์ทํ ๊ธฐ๋ฅ๊ณผ ๊ฐ๋ ๋ค์ Class ํ ๊ณณ์ ๋ด์ ์บก์ํํ๊ณ ์๋ก Import๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํ๋์ด ์๋ค.
์ด๋ฌํ Module ๊ตฌ์กฐ๋ Architecture๋ฅผย ์กฐ์ง์ (Organize)์ผ๋ก ๊ฐ์ ธ๊ฐ๊ฒ ํ๊ณ ย ๋์จํ ๊ฒฐํฉ(Loose Coupling)์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ดย ํ์ฅ์ฑ(Extensible)๊ณผย ํ ์คํธ ๊ฐ๋ฅ์ฑ(Testable)์ ๋์ธ๋ค.
-g : global์ ์ฝ์๋ก, ํน์ ์์ค์ฝ๋๋ฅผ ํด๋น ํด๋์ ์ค์นํ๋ ๊ฒ์ด ์๋๋ผ ์ปดํจํฐ์ ์ค์นํ๊ฒ ๋๋ ๊ฒ
cli : CLI๋ Command-line interface๋ก ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด ํด๋๋ฅผ ์ด๊ณ , ํ์ผ์ ์คํํ๋ ๋ฑ์ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค.
yarn add -g @nestjs/cli
nest --version
nest new aaa(ํด๋๋ช )
// ์์ ๋ช ๋ น์ด๊ฐ ์๋๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ก ๋ง๋ค๊ธฐ
npx nest new aaa(ํด๋๋ช )
git clone https://github.com/nestjs/typescript-starter.git aaa
// aaa ํ๋ก์ ํธ ํด๋๊ฐ ์์ฑyarn install // yarn ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์น
yarn start // ์คํ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ์คํ
NestJs ๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด typescript ํ์ผ ๋ฑ ์ฌ๋ฌ ํ์ผ๋ค๊ณผ ํจ๊ป .git ํ์ผ
๋ ์๋์ผ๋ก ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
ํ์ง๋ง, ์ต์๋จ์ .git ํ์ผ์ด ์๋ค๋ฉด git ํ์ผ์ด 2๊ฐ ์ด์ ์กด์ฌํ๊ฒ ๋๋ฏ๋ก git add, commit ํ push ํ ๋ ์๋ฌ๊ฐ ๋ฐ์๋๋ฏ๋ก NestJs ๋ฅผ ๋ง๋ค ๋ ์๋ ์์ฑ๋ git ํ์ผ์ ์ญ์ ํด ์ฃผ์ด์ผ ํ๋ค.
ls -al // ์จ๊ฒจ์ง ํ์ผ๊น์ง ๋ชจ๋ ์กฐํํ๊ธฐ (.git ํ์ผ)
rm -rf .git // ์จ๊ฒจ์ ธ์๋ .gitํ์ผ ์ง์ฐ๊ธฐ
์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์คํํ ๋ ์ฒ์ ๋ง๋ค์ด์ง Nest ํด๋ ๊ตฌ์กฐ.
๋ชจ๋ ํ์ฌ๊ฐ ๊ฐ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์๋๋ค.
ํ์ฌ์ ๋ฐ๋ผ ๊ฐ์ง๊ณ ์๋ ํ์ํ ๊ธฐ๋ฅ๋ค์ด ๋ด์ฅ๋์ด ์๋ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ์กด์ฌํ๋ค.
package.json
ํ์ผ์ ํ๋ก์ ํธ ์ ์ฒด ์ค๋ช
์๋ผ๊ณ ํ ์ ์๋ค.
scripts
๋ ๋ช
๋ น์ด๋ฅผ ์ฝ๊ฒ ์คํ
ํ ์ ์๋๋ก ๋จ์ถ ๋ช
๋ น์ด๋ฅผ ๋ง๋ค์ด ๋ ๊ฒ์ด๋ค.
// package.json "scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json" },
- index.js , index.ts ์ ๊ฐ์ ํ์ผ์ด ๋ฐ๋ก ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ, scripts ํ๊ทธ ์์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ผ๋ก ์คํํ ์ ์๋ค.
- ์์ํ๋ ๋ถ๋ถ์ "start": "nest start" ์ start ๋ก ์คํํด ์ฃผ์๋ฉด ๋๋ค.
๊ฐ๋ฐ
ํ ๋ :"start:dev"
์ฌ์ฉ (dev ๋ development ์ ์ฝ์)๋ฐฐํฌ
ํ ๋ :"start:prod"
์ฌ์ฉ (prod ๋ production ์ ์ฝ์)
( "start:dev": "nest start --watch" โwatch
: ์์ค์ฝ๋๊ฐ ๋ฐ๋๋ฉด ์๋์ผ๋ก ๋ฆฌํ๋ ์ฌ ํด์ฃผ๋ ๊ฒ )
- Nest ์์ฒด์์ nodemon ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๊ณ ์๊ธฐ์ nodemond์ ํ์ ์๋ค.
test
: ๋ฐฐํฌ์ ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ ์คํ์์ผ ๋ด์ผ๋ก ๋ชจ๋ API๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์ผ๋ก ๋ณด๋ค ์์ ํ ๊ฐ๋ฐ์ ํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
// package.json "dependencies": { "@nestjs/common": "^8.0.0", "@nestjs/core": "^8.0.0", "@nestjs/platform-express": "^8.0.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0" }, "devDependencies": { "@nestjs/cli": "^8.0.0", "@nestjs/schematics": "^8.0.0", "@nestjs/testing": "^8.0.0", "@types/express": "^4.17.13", "@types/jest": "^27.0.1", "@types/node": "^16.0.0", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^4.28.2", "@typescript-eslint/parser": "^4.28.2", "eslint": "^7.30.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", "jest": "^27.0.6", "prettier": "^2.3.2", "supertest": "^6.1.3", "ts-jest": "^27.0.3", "ts-loader": "^9.2.3", "ts-node": "^10.0.0", "tsconfig-paths": "^3.10.1", "typescript": "^4.3.5" },
dependencies์ devDependencies ๋ node ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ค์น ๋ชฉ๋ก์ ๋ํ๋ธ๋ค.
dependencies
: ๋ฐฑ์๋ ์๋ฒ๋ฅผ ์คํ์ํฌ ๋ ํ์ํ ๋ชจ๋๋ค์ด ์์นํ๋ค.
devDependencies
: VS code ๋ด์์ ๊ฐ๋ฐํ ๋ ํ์ํ ๋ชจ๋๋ค์ด ์์นํ๋ค.
// package.json "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" }
๋ง์ง๋ง์ผ๋ก jest ๊ฐ ์๋ค.
jest๋ ํ ์คํธ ๊ด๋ จ๋ ๋ถ๋ถ์ด๋ค. ๋ง์ฐ์ค๋ก ํ๋ํ๋ ํด๋ฆญํด์ ํ ์คํธํด ๋ณผ ์ ์์ง๋ง, ๋ฐฑ์๋๋ ๋ณดํต ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์, ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ ํ์ผ์ ์คํํด์ ํ ์คํธํ๋ค.
ํ์ผ์ ์ต์๋จ ์์น์์ .vscode
ํด๋๋ฅผ ๋ง๋ค๊ธฐ.
.vscode
ํด๋ ์์ settings.json
ํ์ผ์ ๋ง๋ค๊ธฐ.
settings.json
ํ์ผ ์์ VS Code settings ์ ์์ฑํ๊ธฐ.
// settings.json { "editor.formatOnSave": true, "editor.defaultFormatter": "esbenp.prettier-vscode" }
"editor.formatOnSave": true
: ์ ์ฅํ๋ฉด ํ๋ฆฌํฐ์ด๊ฐ ๋ฐ๋ก ์ ์ฉ๋ ์ ์๊ฒ ์ค์
"editor.defaultFormatter": "esbenp.prettier-vscodeโ
: prettier ํฌ๋ฉง ์ ์ฉ ์ค์
// main.ts import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap();
์ฒ์์ ์คํ๋๋ ๋ถ๋ถ์ด
main.ts
ํ์ผ์ด๋ค.bootstrap : ํจ์ ์ด๋ฆ์ด๊ธฐ์ bootstrap ์ธ์ ์ํ๋ ์ด๋ฆ์ผ๋ก ์์ฑ ๊ฐ๋ฅํ๋ค.
app.listen(3000) : 3000๋ฒ ํฌํธ๊ฐ ์คํ๋์ 24์๊ฐ ๋์ listening ํ๊ณ ์์๊ฒ์ผ๋ก ๊ธฐ์กด์ ์คํ ์ค์ด๋ 3000๋ฒ ํฌํธ๊ฐ ์กด์ฌํ๋ค๋ฉด ์ข ๋ฃ์์ผ์ค์ผ ํ๋ค.
.create(AppModule) : AppModule ์์ ์ฐ๋ฆฌ๊ฐ ์์ผ๋ก ๋ง๋ค๊ฒ ๋๋ ๋ชจ๋ ๋ด์ฉ๋ค(API ๋ฑ)์ด ํฌํจ๋์ด ์๋ค.
test ๊ด๋ จ ์ฝ๋์ด๋ค.
// app.module.ts import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [], controllers: [AppController], providers: [AppService], }) export class AppModule {}
app.module.ts
ํ์ผ์์app.controller.ts
์app.service.ts
๊ฐ ํฉ์ณ์ง๊ฒ ๋๋ค.app.controller.ts ํ์ผ์
controllers
์ ํด๋น๋๋ฉฐ app.service.ts ํ์ผ์providers
์ ํด๋นํ๋ค.๋ฐ๋ผ์ ์ด module ์
main.ts
ํ์ผ์ import ํด์ฃผ๊ฒ ๋๋ค.๋ํ, NestJS์์๋ ์๋์ผ๋ก ์์กด์ฑ์ฃผ์ ์ ํด์ฃผ๊ฒ๋๋๋ฐ module ๋ถ๋ถ์ด
์์กด์ฑ์ฃผ์
์ ํด์ฃผ๋ ๋ถ๋ถ์ด๋ค.
// app.controller.ts import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} @Get('/qqq') getHello(): string { return this.appService.getHello(); } }
์์กด์ฑ์ฃผ์ ์ ์ฌ์ฉํ์ฌ appService ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์์ผ๋ฉฐ, ์ ์ด๊ฐ ์ญ์ ๋๊ฒ์ ํ์ธ ํ ์ ์๋ค.
@Controller() : ๋ฐ์ฝ๋ ์ดํฐ๋ก ํจ์์ ์ ์ ์ ์ ํธ์ถ๋๋ฉฐ ๊ธฐ์กด ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก ํ๋ ๋์์ธ ํจํด์ด๋ค.
@Get() : Get ์์ฒญ์ด ์คํ๋๋ ๋ถ๋ถ์ผ๋ก, ( ) ์์ dafault ๊ฐ์ โ/โ ์ด๋ค.
Nest๋ GraphQL ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ํ๋๋ฐ ย ์คํค๋ง ์ฐ์ (schema first)ย ๋ฐ ์ฝ๋ ์ฐ์ (code first) ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
Schema first
๋ graphql์ schema๋ฅผ ๋จผ์ ์ ์ํ๊ณ , ๊ทธ schema ์ ์์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
schema๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ graphql์ data model์ ๋ํ๋ด๊ธฐ ์ํด ๋ง๋ค์ด์ง SDL(Schema Definition Language)
๋ฅผ ์ฌ์ฉํ๋ค.
SDL์ ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋
๋ฆฝ์ ์ด๋ฉฐ, ํตํฉ๋๋ ์ธ์ด์ด๊ณ ,ย NestJS
์์๋ GraphQL ์คํค๋ง๋ฅผย TypeScript
์ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค ํ์์ผ๋ก ๊ตฌํ๋๋ค.
๋ฐ๋ผ์, GraphQL ์คํค๋ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก TypeScript ์ ์ (ํด๋์ค ๋๋ ์ธํฐํ์ด์ค ์ฌ์ฉ)๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ์ค๋ณต๋ ์์ฉ๊ตฌ ์ฝ๋๋ฅผ ์์ฑํ ํ์์ฑ์ ์ค์ฌ์ฃผ๋ฉฐ ****์ ์ฒด ๊ด๊ณ๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ํ๋์ผ๋ก ํ ์ปค๋ฎค๋์ผ์ด์ ์ฅ์ ๊ฐ ์ ์ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง ์ค์ ์ฝ๋์ ํด๋นํ๋ Resolver๋ ํฌํจ๋์ง ์์ผ๋ฏ๋ก ์คํค๋ง ์ ์์ ํจ๊ป Resolver๊ฐ ๊ณ์์ ์ผ๋ก ๋๊ธฐํ๋์ด์ผํ๋ฉฐ Resolver ์ฝ๋์ SDL์ ์ ์๊ฐ ์ ํํ๊ฒ ์ผ์นํด์ผํ๋ ๋จ์ ์ด ์กด์ฌํ๋ค.
GraphQLModule.forRoot({ typePaths: ['./**/*.graphql'], }),
์คํค๋ง ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ์ต์ ๊ฐ์ฒด์ย typePathsย ์์ฑ์ ์ถ๊ฐํด์ผ ํ๋ค.ย
typePathsย ์์ฑ์ย GraphQLModule์ด ์์ฑํ GraphQL SDL ์คํค๋ง ์ ์ ํ์ผ์ ์ฐพ์์ผํ๋ ์์น๋ฅผ ๋ํ๋ธ๋ค.
// cat.graphql type Query { cats: [Cat] cat(id: ID!): Cat } type Mutation { createCat(createCatInput: CreateCatInput): Cat } type Subscription { catCreated: Cat } type Owner { id: Int! name: String! age: Int cats: [Cat!] } type Cat { id: Int name: String age: Int owner: Owner } input CreateCatInput { name: String age: Int }
.graphql ๋ก ์คํค๋ง๋ฅผ ์ง์ ์์ฑํด์ค์ผ ํ๋ค.
์ฝ๋ ์ฐ์ ย ์ ๊ทผ ๋ฐฉ์์์๋ ๋ฐ์ฝ๋ ์ดํฐ์ TypeScript ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋จผ์ ์์ฑํ Resolver ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋น GraphQL ์คํค๋ง๋ฅผ ์๋ ์์ฑํ๋ค.
์ด ๋ฐฉ๋ฒ์ TypeScript๋ก๋ง ์์ ํ๊ณ ์ธ์ด ๊ตฌ๋ฌธ ๊ฐ์ ์ปจํ ์คํธ ์ ํ์ ํผํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
Schema์ Resolver๊ฐ์ type safety๋ฅผ ๋ณด์ฅํ๋ฉฐ ์ฝ๋ ์ค๋ณต์ด ์ต์ํ๋๋ ์ฅ์ ์ด ์กด์ฌ๋ค.
ํ์ง๋ง, SDL๊ณผ ๋น๊ตํด์ ์ง๊ด์ ์ด์ง ๋ชปํ ๋จ์ ์ด ์กด์ฌํ๋ค.
GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, autoSchemaFile: 'src/common/graphql/schema.gql', })
์ฝ๋ ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ์ต์ ๊ฐ์ฒด์ย autoSchemaFileย ์์ฑ์ ์ถ๊ฐํด์ผ ํ๋ค.
autoSchemaFileย ์์ฑ ๊ฐ์ ์๋์ผ๋ก ์์ฑ๋ ์คํค๋ง๊ฐ ์์ฑ๋ ๊ฒฝ๋ก์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก schema first
๋ graphql schema๋ฅผ ๋จผ์ ์์ฑํ ํ, typescript ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํด ์ฃผ๊ณ **code first**
๋ typescript๋ก ํด๋์ค๋ฅผย ๋ง๋ค๋ฉด ํด๋น ํด๋์ค์ย ํด๋นํ๋ graphql schema๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด ์ค๋ค.