[for10days] Nestjs & Prisma & PostgreSQL

suhwani·2024년 1월 26일
0

NestJS 란


https://github.com/su-hwani/for10days

  • Node.js 서버측 프레임워크, Node.js 의 라이브러리 사용, 컴포넌트 재사용성 등 장점은 그대로
  • Typescript 지원
  • express 를 기반으로 여러 기능을 구현해놓은 형태, express 단점을 커버
  • 단, 러닝커브는 높을 수 있음. spring 과 비슷한 형태

    Express 와 다른 점❓

    개발자의 자유도를 선택한 Express 는 프로젝트의 규모가 커질수록 개발자들 사이에서
    코드, 아키텍쳐 스타일이 다르기 때문에 서로의 결과물을 이해할 수 없다.
    이런 단점을 보완하기 위해 나온 게 NestJS
    아키텍쳐의 정의를 프레임워크에서 하기 때문에, 각 개발자들의 아키텍쳐가 통일된다. (장점이자 단점)
    개발자들 서로 작성한 코드를 이해하기 쉽다.

NestJS 시작하기


$ npm i -g @nestjs/cli : NestJS 전역 설치

$ nest new {projectName} : NestJS 에서 프로젝트 생성하기

  • 주의할 점
    새로 만들어지는 프로젝트는 “.git“ 을 가지고 있기 때문에, 상위 폴더에서 “git init” 으로 연결을 하면 제대로 commit 이 되지 않는다.

npm run start:dev → localhost:3000 흐름도


npm run start → 서버 실행

npm run start:dev → express 의 nodemon 과 동일, 서버 수정사항 자동 반영

nest generate: 템플릿 생성 역할


  • nest g : 자주 사용하는 템플릿 생성 명령어
  • nest g module catiscute : “catiscute” 라는 이름을 가진 module 을 생성해준다.
  • nest g res users : “users” 에 관한 CRUD 기능을 생성해준다.

nest g res users: REST API 형태로 생성


Service


  • Service 파일은 비지니스 로직을 처리하는 파일이다.
  • UserService(src/users/users.service.ts)
    :
     클래스 안을 살펴 보면 create, findAll, findOne, update, remove 함수들있다.
    여기서 리턴하는 문자열 = response 로 온 문자열

Decorator

  • 객체에 동적으로 새로운 책임을 추가할 수 있는 구조적인 패턴
  • 클래스, 메소드, 속성 등에 메타데이터를 부여하거나 기능을 추가하기 위해 사용됩니다.

@Module() = Module

  • 모듈을 정의할 때 사용되는 데코레이터로, 클래스에 주석을 추가하여 모듈을 정의합니다.

    @Controller() = Controller → Routing 역할

    ex) @Controller(’users’) → http://localhost:3000/users

    • @Controller() 내부에서 HTTP Method @Get, @Post …. 사용

    • @Get(’:id’) → http://localhost:3000/users/1 /users/:id 로 들어온 요청을 처리

    • @Body () : request body 에 변수를 할당하겠다는 의미

    • @Param(’id’): ‘:’ 으로 시작하는 문자열은 파라미터로 인식하겠다. :id 를 id 변수에 할당한다.

    • 컨트롤러를 정의할 때 사용되는 데코레이터로, 클래스에 주석을 추가하여 컨트롤러를 정의합니다.

      @Injectable() = Service

    • 서비스를 정의할 때 사용되는 데코레이터로, 클래스에 주석을 추가하여 서비스를 정의합니다.

      정리

      1. Request 요청 → Controller (Service 호출) → Service (Logic 처리 및 결과값 리턴)
        → Controller (Service 의 리턴값을 반환) → Response
      2. Module 은 Controller 와 Service 를 하나로 묶어준다. 구조적 기능을 하는 듯..?

Prisma 란 ?


02. Nest.js에서 Prisma 사용하기 (Postgres, AWS LightSail, DBeaver)

ORM이란 ?

  • DB데이터(schema)를 객체(Object)로 매핑해 주는 역할을 하는 것입니다.
  • 모델링 된 객체와 관계를 바탕으로 SQL을 자동으로 생성해 주는 도구입니다.

❓DB connection 생성 후에 sql 문을 직접 작성하는 것보다 좋은가

  • 생산성, 가독성, 유지보수 용이

Prisma 장점 & 구성

  • 기존 ORM 과 근본적으로 다른 ORM 으로 기존 ORM 의 문제점을 개선
  • Prisma는 Schema Prisma introspect Prisma migration Prisma client Prisma studio
  • Prisma introspect : 기존의 Database의 구조를 자동으로 Prisma schema 로 불러올 수 있습니다.
  • Prisma Migrate : 새로운 테이블을 생성, 기존 테이블에 열을 추가 등 Database를 변경하는 기능(도구)
  • Prisma Client : 데이터에 맞춰 자동 생성되는 쿼리생성기
  • Prisma Studio : GUI로 지원하는 Database 편집기입니다.
  • VScode - extension - “prisma” 설치

데이터베이스 Mysql vs PostgreSQL

  • MySQL은 가장 많이 쓰는 RDBMS이자, update 성능이 Postgres보다 우수하며 간단한 처리 속도가 뛰어나다. 로드가 많거나 복잡한 쿼리는 성능이 낮은 편이다.
  • PostgreSQL은 update 속도가 느린 편이지만 확장성과 호환성이 좋아 데이터를 검증해야하는 시스템에서 사용하기 좋다. 또한 MVCC(다중 버전 동시성 제어)로, 로킹에 의한 병목 현상이 생기지 않아 동시성 제어에 있어서 우수하다.

PostgreSQL 설치


  • brew install postgresql
  • brew services start postgresql
  • 새로운 USER, DATABASE 만들기

[Prisma] Prisma란? / 간단시작하기 ( PostgreSQL 연결 )

Prisma Model 작성하기


  • .env 파일에 database 연결하기
  • schema.prisma → Model 작성하기
  • Prisma → DataBase 로 자동으로 Push

    Prisma Migration

    • migration은 데이터베이스 스키마가 발전함에 따라, Prisma에서 작성한 스키마와 동기화된 상태로 유지하는 것이다. 즉 중간 세이브이다.

      $ npx prisma migrate dev --name init → 데이터 손실이 일어날 수 있으니 주의!

      Prisma Studio

    • Prisma의 장점 중 하나인 UI이다. 거의 쓸 일 없지만, 프론트에서 DB 를 보고 싶은 경우 사용!

    • $ npx prisma studio

    • 위의 명령어를 입력하면 http://localhost:5555 에 UI가 생성된다.

전역 Prisma Module 생성하고 설정하기

  • 사전 작업 : $ nest g mo prisma & $ nest g s prisma
  • module과 service를 만들어준다.
  • prisma.module.ts에서 Global로 export해서 어느 모듈에서나 provider추가 없이 injection이 가능!
  • prisma 코드 추가!
    //prisma.module.ts
    import { Global, Module } from '@nestjs/common';
    import { PrismaService } from './prisma.service';
    
    @Global()
    @Module({
      providers: [PrismaService],
      exports: [PrismaService],
    })
    export class PrismaModule {}
    //prisma.service.ts
    import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
    import { PrismaClient } from '@prisma/client';
    import { INestApplication } from '@nestjs/common';
    
    @Injectable()
    export class PrismaService
      extends PrismaClient
      implements OnModuleInit, OnModuleDestroy
    {
      constructor() {
        super();
      }
    
      async onModuleInit() {
        await this.$connect();
      }
    
      async onModuleDestroy() {
        await this.$disconnect();
      }
    
      async enableShutdownHook(app: INestApplication) {
        process.on('beforeExit', async () => {
          await app.close();
        });
      }
    }

DTO 설정하고, Create & FindMany 사용하기


성공..!

Repository 패턴 사용 X → 이해는 했지만, 시간 부족.

profile
Backend-Developer

0개의 댓글