프레임워크란?
--
설치
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되어야 하는 것들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 {}
만약 어플리케이션 전반에 걸쳐 여러 모듈에서 import 되어야 하는 모듈이라면 @Global() 데코레이터를 사용해서 Global Module로 만들 수도 있어요. Global Module은 어플리케이션 전체에 걸쳐 단 한 번만 registered 되어야 해요. 보통 AppModule 에 등록해요 => DB 를 보통 등록!
=> 가능은 하지만, 싱글톤이 깨짐. 싱글톤이란? 인스턴스 하나로 계속 돌려쓰는것. 인스턴스는 객체기 때문에 캡슐화가 되어있어서 이 모두가 다 하나로 공유하면서 쓰려고 사용해.
controller
(서비스는 비즈니스 로직만 작성.)

AppService 라고 쓰기만 해도 앱서비스를 알아서 찾아 넣어줌.
뭘 그냥 쓰면 알아서 타입을 넣어줌.
this.appService = appService 도 알아서 해줌.
appController 는 앱 서비스에 의존하고 있음. => 생성자의 private readonly appService:AppService 가 의존성 주입을 해준다.
service
@ injectable()
네스트에는 모듈, 컨트롤러, provider 이렇게 세개의 개념이 있다.
여기에 injectable 없으면 의존성 주입으로 쓸 수 없어. 또 이런 의존성 주입에 필요한것들은 다 providers 라고 말해.
의존성 주입이 시작되는 포인트는 루트모듈인 app모듈이 실행될때. => 이건 main.ts 가 해줌.
main.ts

user 와 admin 을 총칭하는
nest g module contexts/accounts
nest g resource contexts/accounts/users
발랑 백엔드
프리즈마
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
//nest가 DI 를 해서 인자로 프리즈마 넣어주고, this. 연결해줌
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하면 한템포 줄일 수 있어.
async onModuleInit() 을 사용해 시작하자마자 연결.
깨알 팁들
"resolveJsonModule": true,
"esModuleInterop": true
user: Pick<User, 'id' | 'email'>
선택한것만 골르는것 . omit 의 반대임.
npm 라이브러리 써봐!
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;
}
알고리즘이나, 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