Nest Js 입문

강준호·2024년 2월 20일

NestJs

목록 보기
1/6

프레임워크란?

  • 제어의 역전이 발생하는것.

--

설치

npm i -g @nestjs/cli
nest new project-name


nest g module contexts/accounts
nest g resource contexts/accounts/users

데코레이터


출처: https://wikidocs.net/158481

  • 다양한 기능을 부여해줌.
  • 어떤건 데코레이터에 괄호가 있고, 어떤건 없는데,둘다 맞는 방법. 인자를 가지고 있어.

언제 괄호를 열고닫고 안하는지 공부!

  • 데코레이터를 찍어내는 함수를 괄호가 없는걸 리턴해주는

module

  • app.module 은 루트 모듈.

  • Nest 어플리케이션의 코드들은 Module 단위로 조직화하여 작성해야 해요.

  • 하나의 Module은 @Module() decorator를 사용하여 다음의 것들을 인자로 받아요.

    • providers : 본 Module 내에서 정의된 providers (그 중 인스턴화 되어야 하는 것들)
    • controllers : 본 Module 내에서 정의된 controllers (그 중 인스턴스화 되어야 하는 것들)
    • imports : 본 Module 내에서 필요한 provider를 export 하는 외부 모듈들을 적음
    • exports : providers의 subset 중 다른 모듈에서 import되어야 하는 것들
  • 모듈 자체를 export 하는게 아니라 provider 를 export 하는거야.
  • 다만 유일하게 컨트롤러는 의존성 주입을 해서 다른데서 쓰지 않아. 비즈니스 로직이 들어있는게 아니라 책임 수행자니까.
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
	imports: [CommonModule],
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}
  • catsModule 이
    다른데서 catsService 를 쓰고싶어, import 에는 catsModule 이라고 써.
  • import 는 내가 쓰고 싶은 provider export 해주는거 쓰고,
    exports 는

만약 어플리케이션 전반에 걸쳐 여러 모듈에서 import 되어야 하는 모듈이라면 @Global() 데코레이터를 사용해서 Global Module로 만들 수도 있어요. Global Module은 어플리케이션 전체에 걸쳐 단 한 번만 registered 되어야 해요. 보통 AppModule 에 등록해요 => DB 를 보통 등록!

질문 dogModule 에 catService를 넣으면?

=> 가능은 하지만, 싱글톤이 깨짐. 싱글톤이란? 인스턴스 하나로 계속 돌려쓰는것. 인스턴스는 객체기 때문에 캡슐화가 되어있어서 이 모두가 다 하나로 공유하면서 쓰려고 사용해.


controller

  • 응답를 받는것과 응답을 보내는것에 책임을 가지고 있는것.

(서비스는 비즈니스 로직만 작성.)

생성자

  • AppService 라고 쓰기만 해도 앱서비스를 알아서 찾아 넣어줌.

  • 뭘 그냥 쓰면 알아서 타입을 넣어줌.

  • this.appService = appService 도 알아서 해줌.

  • appController 는 앱 서비스에 의존하고 있음. => 생성자의 private readonly appService:AppService 가 의존성 주입을 해준다.

service

  • @ injectable()

  • 네스트에는 모듈, 컨트롤러, provider 이렇게 세개의 개념이 있다.

  • 여기에 injectable 없으면 의존성 주입으로 쓸 수 없어. 또 이런 의존성 주입에 필요한것들은 다 providers 라고 말해.

의존성 주입이 시작되는 포인트는 루트모듈인 app모듈이 실행될때. => 이건 main.ts 가 해줌.

main.ts

  • AppModule 을 넣어주면서 모든 injection 이 시작됨.

user 와 admin 을 총칭하는


nest g module contexts/accounts
nest g resource contexts/accounts/users

발랑 백엔드

프리즈마

  • 시드는 Migrate 할때마다 새로 생성. 그래서 upsert 를 사용!
 for (const product of products) {
    // product.brand.
    prismaClient.product.upsert({
      //create 중복 방지
      where: { id: Number(product.id) }, //여기에 있으면 업데이트
      update: {}, //근데 업데이트 안할거야.
      create: {
        // 없다면 create
        id: Number(product.id),
        name: product.goodsnm.trim(),
        imgSrc: product.img_i,
        deliveryType: '로켓배송',
        onlineStock: 9999,
        originalPrice: product.standard_price,
        price: product.price,

시드 실행

npx prisma db seed

promise all

장점

  • 데이터를 한번에 쫙 받으려고 사용

단점

  • 근데 뭐가 먼저 도착할지 순서는 보장하지 않아.

//nest가 DI 를 해서 인자로 프리즈마 넣어주고, this. 연결해줌


반복되는 Prisma 사용 팁..

export 는 서비스, import 는 모듈

global 모듈을 사용하면 import 매번 해줘야하는거 없앨 수 있어, But 생성자는 매번 써줘야해.


// prisma.module.ts
@Global()
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}


// prisma.service.ts

import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  //이제 Prisma서비스는 클라이언트다.
  async onModuleInit() {
    await this.$connect();
  }
}

  • 그리고 app 모듈에만 넣어주면, global 로 모듈 쓸 수 있어.

  • 또 prismaClient를 extend하면 한템포 줄일 수 있어.

여기서 OnModuleInit!

async onModuleInit() 을 사용해 시작하자마자 연결.

근데 OnModule 의 실행순서는??


깨알 팁들

ts 에서 json 파일 import 하기위한 tsconfig.json설정

"resolveJsonModule": true,
"esModuleInterop": true

타입 지정할때

user: Pick<User, 'id' | 'email'>
선택한것만 골르는것 . omit 의 반대임.


validator

npm 라이브러리 써봐!


JWT 생성 jwt.sign() 이란?

  generateAccessToken(user: Pick<User, 'id' | 'email'>) {
    const JWT_SECRET_KEY = process.env.JWT_SECRET_KEY;

    const accessToken = sign({ email: user.email }, JWT_SECRET_KEY, {
      subject: String(user.id),
      expiresIn: '5m',
    });

    return accessToken;
  }

기본형태

  • jwt.sign(payload, secretOrPrivateKey, [옵션, 콜백])

payload:

옵션:

  • 알고리즘이나, expiresIn,subject 등등이 들어갈 수 있다.

  • subject: JWT 의 소유자 이름 설정. 안써도 작동 되는 옵션이지만, 적극권장!

  • 아무거나 적어도 되지만, 보통 ID,Email 처럼 고유한것으로 설정한다!


EC2 배포

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash

nvm install --lts

//이제 노드설치 끝

// ts 니까 빌드를 해줘야해.
npm run build

npm run start

0개의 댓글