NestJs - TypeORM

choko's avatar
Jun 29, 2024
NestJs - TypeORM

TypeOrm

자바스크립트에서 사용하는 ORM
@nestjs/typeorm // NestJS 에서Typeorm을 사용하기 위해 연동하는 모듈 typeorm pg // 위 3가지를 설치한다. npm install pg typeorm @nestjs/typeorm --save
 

TypeOrmModuleOptions

import { TypeOrmModuleOptions } from "@nestjs/typeorm"; export const typeORMConfig : TypeOrmModuleOptions = { type: 'postgres', host: 'localhost', port: 5432, username: "postgres", password: "1821", database: 'board-app', entities: [__dirname+'/../**/*.entity.{js,ts'], synchronize: true }
 
app.module.ts에서 import
import { TypeOrmModule } from '@nestjs/typeorm'; import { typeORMConfig } from './configs/typeorm.config'; @Module({ imports: [ TypeOrmModule.forRoot(typeORMConfig), BoardsModule ], controllers: [], providers: [], }) // forRoot 메서드는 주로 외부 모듈을 현재 모듈에 가져와서 설정을 제공하는 데 사용되는 네스트(Nest) 프레임워크의 일반적인 디자인 패턴입니다. // 이와 다르게 forFeature가 있는데, forRoot와 비슷하다. // 차이점은 forRoot는 최상위 모듈에서 전역적으로 사용, forFeature은 특정 모듈에서 사용한다.
💡
- forRoot 메서드는 주로 외부 모듈을 현재 모듈에 가져와서 설정을 제공하는데 사용되는 네스트(Nest) 프레임워크의 일반적인 디자인 패턴이다. - 이와 다르게 forFeature가 있는데, forRoot와 비슷하다. - 차이점은 forRoot는 최상위 모듈에서 전역적으로 사용, forFeature은 특정 모듈에서 사용한다.
 
 

ORM 데코레이터

  • ORM 데코레이터
    • @Entitiy() : 클래스가 엔티티임을 나타내는데 사용 (Create Table 부분)
    • @PrimaryGeneratedColumn(): 키가 기본 키임을 나타내는데 사용
    • @Column(): 열을 나타내는데 사용
    •  
 

연관관계 매핑

// @OneToOne @PrimaryColumn('uuid') @OneToOne(() => ItemEntity, { onDelete: 'CASCADE', }) @JoinColumn({"name":"item_id"}) item_id: ItemEntity; // @ManyToOne: @ManyToOne(type => ProviderEntity, { onDelete: 'CASCADE', }) @JoinColumn({"name":"provider_id"}) provider_id: ProviderEntity;
 
 
 

서브쿼리 - GetAddressesWithTokenName()

  • Address.token_idtoken.id 가 공통 필드인 특정 account_id 조회
    • (addressEntity와 tokenEntity는 연관관계가 맺혀 있어야 함 → @ManyToOne 같은)
    •  
      async GetAddressesWithTokenName(account_id:string) { try { let addresses = await this.createQueryBuilder("address"). leftJoinAndSelect("address.token_id","token"). where("address.account_id = :account_id", { account_id: account_id }). select([ 'address.account_id', 'address.account_type', 'address.user_id', 'address.token_id', 'address.balance', 'address.create_at', 'address.update_at', 'token.name', ]). getMany();
    • result
    • { "account_id": "0x0000000000000000000000000000000000000010", "account_type": "erc20", "user_id": "", "balance": "100", "create_at": "2024-03-21T01:26:53.752Z", "update_at": "2024-03-21T04:10:34.945Z", "token_id": { "name": "TOM" } },
 
 

save(), insert(), update() 차이

  • save()
    • 값이 없으면 insert 기능을 하여 저장하고, 값이 존재하면 덮어쓴다.
    • insert()보다 느리다.
      • save()는 select을 해서 리턴하기 때문
  • insert()
    • 값이 없으면 insert 기능을 하여 저장하고, 값이 존재하면 duplicate 오류를 발생시킨다
  • update()
    • 바꾸고 싶은 필드만 수정할 수 있다
    •  
  • save()는 select을 해서 리턴해주기 때문에, insert()보다 느리다.
  • save()는 update()보다 느리다. save()는 전체 필드를 적용시키는 반면 update()는 바꾸고 싶은 필드만 적용시키기 때문
 
Share article

Tom의 TIL 정리방