[nestjs] rest api 구현 01 - NestJS + Prisma + PostgreSQL + Swagger + TypeScript
개요 01
Rest API 를 구현하기 위한 과정을 설명
NestJS + Prisma + PostgreSQL + Swagger + TypeScript
설치 필요사항
- Node.js
- Docker 또는 PostgreSQL
- Prisma VSCode Extension
환경구성
# nestjs 설치
npx @nestjs/cli new backend
# nestjs 동작여부 확인
cd backend
npm run start:dev
# docker 로 postgresql 구동
# docker/postgresql/docker-compose.yml 참조
docker-compose up
# prisma 설치
npm install -D prisma
# prisma 초기화
# prisma/schema.prisma 참조
npx prisma init
# DB 접속정보 설정
# in .env 아래와 같이 경로 수정
DATABASE_URL="postgres://myuser:mypassword@localhost:5432/mogl-dev"
prisma 설정
prisma/schema.prisma 참조
- data source : 데이터베이스 연결을 지정합니다. 위의 구성은 데이터베이스 공급자가 PostgreSQL이고 데이터베이스 연결 문자열이 DATABASE_URL 환경 변수에서 사용 가능함을 의미합니다.
- Generator : 데이터베이스를 위한 형식이 안전한 쿼리 빌더인 Prisma 클라이언트를 생성하려고 함을 나타냅니다. 데이터베이스에 쿼리를 보내는 데 사용됩니다.
- Data model : 데이터베이스 모델을 정의합니다. 각 모델은 기본 데이터베이스의 테이블에 매핑됩니다. 현재 스키마에 모델이 없습니다. 다음 섹션에서 이 부분을 살펴보겠습니다.
DB 마이그레이션
npx prisma migrate dev --name "init"
- 마이그레이션 저장 : Prisma Migrate는 스키마의 스냅샷을 찍고 마이그레이션을 수행하는 데 필요한 SQL 명령을 파악합니다. Prisma는 SQL 명령이 포함된 마이그레이션 파일을 새로 생성된 prisma/migrations폴더에 저장합니다.
- 마이그레이션 실행 : Prisma Migrate는 마이그레이션 파일에서 SQL을 실행하여 데이터베이스에 기본 테이블을 생성합니다.
- Prisma 클라이언트 생성 : Prisma는 최신 스키마를 기반으로 Prisma 클라이언트를 생성합니다. 클라이언트 라이브러리를 설치하지 않았으므로 CLI도 설치합니다. @prisma/client파일 내부 dependencies에 패키지가 표시되어야 합니다 package.json. Prisma 클라이언트는 Prisma 스키마에서 자동 생성된 TypeScript 쿼리 빌더입니다. Prisma 스키마에 맞게 조정 되며 데이터베이스에 쿼리를 보내는 데 사용됩니다.
SEED 데이터 생성
prisma/seed.ts
참조
upsert - 데이터가 없으면 생성, 있으면 업데이트
위 파일을 실행할 스크립트를 작성 합니다. ( in package.json )
"prisma" : {
"seed": "ts-node prisma/seed.ts"
},
# 아래 커맨드를 실행한다
# 해당 결과, 신규 등록 또는 기 등록된 2건의 정보를 보여준다
npx prisma db seed
Prisma 서비스 생성하기
# src/prisma 폴더아래 생성된 ts 를 확인할 수 있음
npx nest generate module prisma
npx nest generate service prisma
swagger 설치
# 설치 후 main.ts 를 수정하여 swagger api 를 활성화 한다
npm install --save @nestjs/swagger swagger-ui-express
REST 자원 생성하기
wonsama (master #) backend $ npx nest generate resource
? What name would you like to use for this resource (plural, e.g., "users")? articles
? What transport layer do you use? REST API
? Would you like to generate CRUD entry points? Yes
CREATE src/articles/articles.controller.ts (957 bytes)
CREATE src/articles/articles.controller.spec.ts (596 bytes)
CREATE src/articles/articles.module.ts (268 bytes)
CREATE src/articles/articles.service.ts (651 bytes)
CREATE src/articles/articles.service.spec.ts (474 bytes)
CREATE src/articles/dto/create-article.dto.ts (33 bytes)
CREATE src/articles/dto/update-article.dto.ts (176 bytes)
CREATE src/articles/entities/article.entity.ts (24 bytes)
UPDATE src/app.module.ts (393 bytes)
To be continue
다음 편에 계속
Upvoted! Thank you for supporting witness @jswit.