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_id
와token.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();
{
"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