SQL (Sequelize)
SQL (Sequelize)
This chapter applies only to TypeScript
Sequelizeλ λ°λλΌ JavaScriptλ‘ μμ±λ μΈκΈ°μλ ORM (Object Relational Mapper)μ΄μ§λ§ sequelize-typescriptκ° μμ΅λλ€. κΈ°λ³Έ μνμ€μ λν λ°μ½λ μ΄ν° λ° κΈ°ν μΆκ° μΈνΈλ₯Ό μ 곡νλ TypeScript λνΌμ λλ€.
Getting started
μ΄ λΌμ΄λΈλ¬λ¦¬λ‘ λͺ¨νμ μμνλ €λ©΄ λ€μκ³Ό κ°μ μ’ μμ±μ μ€μΉν΄μΌν©λλ€.
$ npm install --save sequelize sequelize-typescript mysql2
$ npm install --save-dev @types/sequelize
μ°λ¦¬κ° ν΄μΌ ν 첫λ²μ§Έ λ¨κ³λ μμ±μμ μ λ¬λ μ΅μ
κ°μ²΄λ‘ Sequelize μΈμ€ν΄μ€λ₯Ό λ§λλ κ²μ
λλ€. λν λͺ¨λ λͺ¨λΈμ μΆκ°ν΄μΌ ν©λλ€ (λμμ modelPaths
μμ±μ μ¬μ©νλ κ²μ) λ° λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈ sync()
λ₯Ό μ¬μ©ν΄μΌν©λλ€.
@@filename(database.providers)
import { Sequelize } from 'sequelize-typescript';
import { Cat } from '../cats/cat.entity';
export const databaseProviders = [
{
provide: 'SEQUELIZE',
useFactory: async () => {
const sequelize = new Sequelize({
dialect: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'password',
database: 'nest',
});
sequelize.addModels([Cat]);
await sequelize.sync();
return sequelize;
},
},
];
warning ννΈ λͺ¨λ² μ¬λ‘μ λ°λΌ
* .providers.ts
μ λ―Έμ¬κ° μλ λ³λμ νμΌλ‘ μ¬μ©μ μ§μ 곡κΈμλ₯Ό μ μΈνμ΅λλ€.
κ·Έλ° λ€μ μμ© νλ‘κ·Έλ¨μ λλ¨Έμ§ λΆλΆμ λν΄ μ‘μΈμ€ ν μ μλλ‘ μ΄λ¬ν 곡κΈμλ₯Ό λ΄ λ³΄λ΄μΌν©λλ€.
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';
@Module({
providers: [...databaseProviders],
exports: [...databaseProviders],
})
export class DatabaseModule {}
μ΄μ μ°λ¦¬λ @Inject()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ Sequelize
κ°μ²΄λ₯Ό μ£Όμ
ν μ μμ΅λλ€. Sequelize
λΉλκΈ° 곡κΈμμ μμ‘΄νλ κ° ν΄λμ€λ Promise
κ° ν΄κ²°λ λκΉμ§ κΈ°λ€λ¦½λλ€.
Model injection
Sequelizeμμ Modelμ λ°μ΄ν°λ² μ΄μ€μ ν μ΄λΈμ μ μν©λλ€. μ΄ ν΄λμ€μ μΈμ€ν΄μ€λ λ°μ΄ν°λ² μ΄μ€ νμ λνλ λλ€. λ¨Όμ μ°λ¦¬λ μ΅μν νλμ μν°ν°κ° νμν©λλ€.
@@filename(cat.entity)
import { Table, Column, Model } from 'sequelize-typescript';
@Table
export class Cat extends Model<Cat> {
@Column
name: string;
@Column
age: number;
@Column
breed: string;
}
Cat
μν°ν°λ cats
λλ ν 리μ μν©λλ€. μ΄ λλ ν 리λ CatsModule
μ λνλ
λλ€. μ΄μ μ μ₯μ 곡κΈμλ₯Ό λ§λ€ μ°¨λ‘μ
λλ€.
@@filename(cats.providers)
import { Cat } from './cat.entity';
export const catsProviders = [
{
provide: 'CATS_REPOSITORY',
useValue: Cat,
},
];
ννΈ μ€μ μμ© νλ‘κ·Έλ¨μμλ λ§€μ§ λ¬Έμμ΄μ νΌν΄μΌ ν©λλ€.
CATS_REPOSITORY
μSEQUELIZE
λ λͺ¨λ λΆλ¦¬ λconstants.ts
νμΌμ 보κ΄ν΄μΌ ν©λλ€.
Sequelizeμμλ μ μ λ©μλλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ‘°μνλ―λ‘ μ¬κΈ°μ λ³λͺ (alias)μ λ§λ€μμ΅λλ€.
μ΄μ @Inject()
λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νμ¬ CATS_REPOSITORY
λ₯Ό CatsService
μ μ½μ
ν μ μμ΅λλ€.
@@filename(cats.service)
import { Injectable, Inject } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { Cat } from './cat.entity';
@Injectable()
export class CatsService {
constructor(
@Inject('CATS_REPOSITORY') private readonly CATS_REPOSITORY: typeof Cat) {}
async findAll(): Promise<Cat[]> {
return await this.CATS_REPOSITORY.findAll<Cat>();
}
}
λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ λΉλκΈ°μ΄μ§λ§ Nestλ μ΅μ’
μ¬μ©μκ° μ΄ νλ‘μΈμ€λ₯Ό μμ ν λ³Ό μ μλλ‘ ν©λλ€. CATS_REPOSITORY
μ 곡μλ db μ°κ²°μ κΈ°λ€λ¦¬κ³ μμΌλ©° CatsService
λ μ μ₯μλ₯Ό μ¬μ©ν μ€λΉκ° λ λκΉμ§ μ§μ°λ©λλ€. κ° ν΄λμ€κ° μΈμ€ν΄μ€ν λλ©΄ μ 체 μμ© νλ‘κ·Έλ¨μ μμν μ μμ΅λλ€.
λ§μ§λ§CatsModule
μ λ€μκ³Ό κ°μ΅λλ€.
@@filename(cats.module)
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { catsProviders } from './cats.providers';
import { DatabaseModule } from '../database/database.module';
@Module({
imports: [DatabaseModule],
controllers: [CatsController],
providers: [
CatsService,
...catsProviders,
],
})
export class CatsModule {}
warning ννΈ
CatsModule
μ 루νΈApplicationModule
λ‘ κ°μ Έ μ€λ κ²μ μμ§ λ§μμμ€.
Last updated
Was this helpful?