SQL (TypeORM)

SQL (TypeORM)

This chapter applies only to TypeScript

๊ฒฝ๊ณ  ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์ปค์Šคํ…€ ํ”„๋กœ ๋ฐ”์ด๋” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ TypeORM ํŒจํ‚ค์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ DatabaseModule์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด ์†”๋ฃจ์…˜์—๋Š” ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ „์šฉ @nestjs/typeormํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [์—ฌ๊ธฐ] (/techniques/sql)๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

TypeORMarrow-up-right์€ node.js ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์„ฑ์ˆ™ํ•œ ORM (Object Relational Mapper)์ž…๋‹ˆ๋‹ค. TypeScript๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ Nest ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Getting started

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ๋ชจ๋“  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

$ npm install --save typeorm mysql

์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผํ•  ์ฒซ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š”typeorm ํŒจํ‚ค์ง€์—์„œ ๊ฐ€์ ธ์˜จ createConnection()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. createConnection()ํ•จ์ˆ˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ async providerarrow-up-right๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@@filename(database.providers)
import { createConnection } from 'typeorm';

export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: async () => await createConnection({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [
          __dirname + '/../**/*.entity{.ts,.js}',
      ],
      synchronize: true,
    }),
  },
];

warning ํžŒํŠธ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋”ฐ๋ผ * .providers.ts ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์žˆ๋Š” ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ๊ณต๊ธ‰์ž๋ฅผ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋จธ์ง€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด๋“ค ๊ณต๊ธ‰์ž๋ฅผ ๋‚ด ๋ณด๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ @Inject() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Connection ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Connection ๋น„๋™๊ธฐ ์ œ๊ณต์ž์— ์˜์กดํ•˜๋Š” ๊ฐ ํด๋ž˜์Šค๋Š” Promise๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Repository pattern

TypeORMarrow-up-right์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋””์ž์ธ ํŒจํ„ด์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ฐ ์—”ํ„ฐํ‹ฐ์—๋Š” ์ž์ฒด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ์งธ, ์šฐ๋ฆฌ๋Š” ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์‹ค์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ์—์„œ Photo ์—”ํ‹ฐํ‹ฐ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Photo ์—”ํ‹ฐํ‹ฐ๋Š” photo ๋””๋ ‰ํ† ๋ฆฌ์— ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋””๋ ‰ํ† ๋ฆฌ๋Š” PhotoModule์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด์ œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณต๊ธ‰์ž๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

warning ์•Œ๋ฆผ ์‹ค์ œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋งค์ง ๋ฌธ์ž์—ด์„ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. PHOTO_REPOSITORY์™€ DATABASE_CONNECTION์€ ๋ถ„๋ฆฌ ๋œ constants.ts ํŒŒ์ผ์— ๋ณด๊ด€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ @Inject() ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Repository<Photo>๋ฅผ PhotoService์— ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์€ ๋น„๋™๊ธฐ์ด์ง€๋งŒ Nest๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ๋ณผ ์ˆ˜ ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. PhotoRepository๋Š” db ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฉฐ, PhotoService๋Š” ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜๋ฉด ์ „์ฒด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ PhotoModule์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

warning ํžŒํŠธ PhotoModule์„ ๋ฃจํŠธ ApplicationModule๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Last updated