[TypeORM] Start with Nest
TypeOrm์ ๋ํ์ ์ธ ํ์
์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ์ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
Sequelize๋ ํ์
์คํฌ๋ฆฝํธ ์ง์์ด ๋ถ์คํ๊ณ , Prisma ๊ฐ์ ํ๋ฐ์ฃผ์๋ค์ ์ข ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์,
ํ์
์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ORM์ ์ฌ์ฉํ๋ค๋ฉด 1์์๋ก ์ ํ๋๋ ์น๊ตฌ๋ค.
์๋ฌด๋ฐ๋ ๋ถ์ฌ๋ ๋์ง๋ง, ์ฌ๊ธฐ์๋ Nest์ ๋ถ์ฌ๋ณด๋ฉด์ ํ ์คํธ๋ฅผ ๊ฐ๋ตํ๊ฒ ํด๋ณด๊ฒ ๋ค.
์ค์น
์ค์น๋ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์๋ค.
typeorm ๋ชจ๋๊ณผ ์ฌ์ฉํ DB ๋ชจ๋์ ์ค์นํ๋ค.
๋๋ postgres๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ pg๋ฅผ ์ค์นํ๋๋ฐ, mysql์ ์ฌ์ฉํ๋ค๋ฉด mysql์ ๊น๋ฉด ๋๋ค.
์๋๋ DB์ ๋ฐ๋ฅธ ์ถ๊ฐ ์ค์น ๋ชจ๋์ด๋ค.

์๋ค์ํผ Nest์ ๊ฐ๋ ฅํ ๊ฐ์ ์ค ํ๋๊ฐ ์์กด์ฑ ์ฃผ์
์ ํตํ ๊ฐ์ฒด์ ๊ณต์ ์ ์ฌ์ฉ์ด๋ค.
๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
๊ฐ์ฒด๋ฅผ ๋ง๋ค๋, ์์กด์ฑ ์ฃผ์
์ผ๋ก ํด๋น ์ปค๋ฅ์
์ ๊ฐ๋ค์ธ ์ ์๋๋ก ํ ๊ฒ์ด๋ค.
์ปค๋ฅ์ ์ค์ ํ๊ธฐ
์ด๋ฅผ ์ํ ํ๋ก๋ฐ์ด๋ ์์ค database.ts๋ฅผ ์์ฑํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ ์ ๋ณด๋ค์ ์ ์จ์ฃผ๋ฉด ๋๋ค.
import { Connection, createConnection } from 'typeorm';
export const databaseProvider = {
provide: Connection,
useFactory: async () =>
await createConnection({
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'nest_user',
password: 'asdf123',
database: 'nest_test',
entities: [__dirname + '/../**/*.entity{.ts,.js}'],
synchronize: true,
logging: 'all',
}),
};
์ฌ๊ธฐ์ ์ด๊ธฐ ์์ฑ๋จ๊ณ๋ผ synchronize: true, ์ต์
์ ์คฌ๋๋ฐ, ๊ณ์ ์ด๋ฌ๋ฉด ์คํํ๊ฑฐ๋ ๋ฐ๋๋๋ง๋ค ๊ฐ์ ๋ก ํ
์ด๋ธ๋ฅผ ๋ฆฌ์
ํ ์๊ฐ ์๋ค.
๊ทธ๋์ ์ ๋๋ก ๋ฐฐํฌ๋ฅผ ํ์ ๋๋ false๋ก ์ฃผ๊ณ ์์ ํ๊ฒ ์ ๊ด๋ฆฌํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
์ ์ฃผ์
ํ๊ธฐ ์ํด์, ์ด๊ฑธ ๋ชจ๋์ ๋ฃ์ด์ค๋ค.
๋๋ database.module์ด๋ผ๋ ๋ณ๋์ ๋ชจ๋์ ์ ์ํด์
import { Module } from '@nestjs/common';
import { databaseProvider } from './../provider/database';
@Module({ providers: [databaseProvider], exports: [databaseProvider] })
export class DatabaseModule {}
๋ฃจํธ๋ชจ๋์ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
import { Module } from '@nestjs/common';
import { AppController } from './../controller/app.controller';
import { AppService } from './../app.service';
import { DatabaseModule } from './database.module';
@Module({
imports: [DatabaseModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
ํ๋ก๋ฐ์ด๋๋ฅผ ๊ทธ๋ฅ ๋ฃจํธ์ ๋๋ ค๋ฐ์๋ ๋๊ธด ํ๋๋ฐ ๊ณต์๋ฌธ์์์ ๊ทธ๋ฌ๊ธธ๋ ๋๊ฐ์ด ํ๋ค.
์ํฐํฐ ์ ์ํ๊ธฐ
๊ทธ๋ผ ์ด์ ๋งคํ์ํฌ ์ํฐํฐ ํด๋์ค๋ฅผ ์ ์ํ๋ค.
์ค์ ํ
์ด๋ธ๊ณผ 1:1๋ก ๋งค์นญ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค.
๋๋ User ํ
์ด๋ธ๊ณผ ๊ทธ ์ฌ์ฉ์๋ค์ด ์์ฑํ๋ Post์ ๋ํ ํ
์ด๋ธ 2๊ฐ๋ฅผ ์์ฑํ๊ฒ ๋ค.
// user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
@PrimaryGeneratedColumn() // ๊ธฐ๋ณธํค
id: number;
@Column()
email: string;
@Column()
password: string;
@Column()
name: string;
}// post.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column()
user_id: string;
@Column()
content: string;
}
ํน๋ณํ ๊ฒ์ ์๋ค.
@Entity ๋ฐ์ฝ๋ ์ดํฐ๋ก ํด๋น ํ์
์ด ํ
์ด๋ธ์ ๋งค์นญ๋ ๊ตฌ์กฐ์์ ๋ช
์ํ๊ณ , ํ๋๋ง๋ค Column ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ฌ์์ ํ
์ด๋ธ ์ปฌ๋ผ์์ ๋ช
์ํ๋ฉด ๋๋ค.
PrimaryGeneratedColumn๋ ๊ธฐ๋ณธํค ์ปฌ๋ผ์ฉ ๋ฐ์ฝ๋ ์ดํฐ๋ค.
ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด typeorm์ด ํ๋ ํ์ ์ ์ฝ์ด์ ์ปฌ๋ผํ์ ๋ ์์์ ์ ๋ง์ถฐ์ฃผ๋๋ฐ, ์ปฌ๋ผํ์ ์ ์ง์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด
@Column('TEXT')
user_id: string;
๋ฐ์ฝ๋ ์ดํฐ์ ๋ฌธ์์ด ์ธ์๋ก ์จ์ฃผ๋ฉด ๋๋ค.
์ปค๋ฅ์ ์ฃผ์ ํ๊ธฐ
์์์ ๋ง๋ ์ปค๋ฅ์
์ ์ด์ ๊ฐ๋ค์จ๋ณด์.
๋ฐฉ๋ฒ์ ์ฝ๋ค. ์ปจํธ๋กค๋ฌ ํ๋ ์๋ฌด๋ฐ๋
์ด๋ฐ์์ผ๋ก ๋ฐ์๋๋ฉด ๋๋ค.
nest๊ฐ ์์์ ์ ์ํ ์ปค๋ฅ์
์ ์ฝ์ด์ ์ ๋ฃ์ด์ค๋ค.
์ฟผ๋ฆฌ ๋น๋
๊ทธ๋ฌ๋ฉด ์ด์ ์ปค๋ฅ์
์ ๊ธฐ๋ฐ์ผ๋ก ํด์, ์ฟผ๋ฆฌ๋น๋ ๋ฑ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
๋ค์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ ์ฝ์
ํ๋ ์ฟผ๋ฆฌ๋ค.
into์ ์ฝ์
ํ ํ
์ด๋ธ ์ํฐํฐ๋ฅผ ์ ๋ฌ, values์ ์ฝ์
ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ,
execute๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฝ์
๋ ๊ฒ์ด๋ค.
์์ api๋ฅผ ์คํํ๋ค๋ฉด
๋๊ธฐํ ์ต์ ์ ์คฌ์ผ๋ ์๋ ํ ์ด๋ธ์ ์๋์ผ๋ก ์์ฑ๋์์ ๊ฒ์ด๊ณ

๋ฐ์ดํฐ๋ ์ฝ์ ๋์์ ๊ฒ์ด๋ค.

select๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ ์์ผ๋ก ํ ์ ์๋ค.

select๋ select ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๊ฒ ๋ค๋ ๊ฒ์ด๊ณ , from์ ์ฝ์ด์ฌ ํ
์ด๋ธ์ด๋ค.
์ฟผ๋ฆฌ๋น๋๋ ๋น๋ ํจํด์ผ๋ก ๊ตฌ์ถ๋ ๊ตฌ์กฐ๋ผ, ์ ๋ถ ์์ฒ๋ผ ๋ฉ์๋ ์ฒด์ด๋์ผ๋ก ์ฟผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ค.
์ด์ธ์๋ ์ฟผ๋ฆฌ๋น๋์๋ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ด ์๊ณ , ์ธ์๋ repository ํจํด ๋ฑ์ ํ๋ คํ ๊ธฐ๋ฅ๋ค์ด ์กด์ฌํ๋.
์์ธํ ๊ฒ๋ค์ ๋ค์ ํฌ์คํธ์์ ์ฒ์ฒํ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
์ฐธ์กฐ
https://docs.nestjs.com/recipes/sql-typeorm
https://orkhan.gitbook.io/typeorm/docs/logging