저장을 습관화

NestJS TypeORM 연습 기록 - DB 생성, 테이블 생성, seeding(초기 데이터 입력) 본문

공부/node.js

NestJS TypeORM 연습 기록 - DB 생성, 테이블 생성, seeding(초기 데이터 입력)

ctrs 2023. 11. 12. 17:06

지난 시간에 app.module과 .env에 사용할 DB 서버의 위치를 지정해 주었으므로, DB를 생성, 사용해 보기로

https://ctrs.tistory.com/466

 

NestJS - TypeORM을 위한 app.module.ts 설정 기록

메모... @nestjs/typeorm, typeorm, mysql2 패키지가 모두 설치되어 있는 상황일때 - app.module.ts // 생략... import { TypeOrmModule } from '@nestjs/typeorm'; import { ChannelChats } from './entities/ChannelChats'; import { ChannelMembers }

ctrs.tistory.com

 

1. DB 생성

1-1. 필요한 라이브러리 설치

$ npm install typeorm-extension

 

typeorm 0.2 버전까지는 'typeorm-seeding' 이었으나

typeorm 버전이 0.3이 되면서 'typeorm-extension'을 사용하게 되었다.

 

 

1-2. package.json - scripts 내용 추가

좀 더 편한 사용을 위해서

{
// ...중략
  "scripts": {
    // ...중략
    "typeorm": "ts-node --require tsconfig-paths/register ./node_modules/typeorm/cli.js",
    "db:create": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:create -d ./dataSource.ts",
    "db:drop": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs db:drop -d ./dataSource.ts",
    "seed": "ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:run -d ./dataSource.ts",
    "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
    "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
    "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
    "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
    "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
    "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"
  },
// ...중략
}

 

 

1-3. dataSource.ts 파일 생성

typeorm-extension 라이브러리 스스로는 app.module.ts의 TypeOrmModule의 내용을 읽지 못한다.

따라서 typeorm-extension이 읽을 수 있는 파일을 별도로 생성해주어야 한다.

 

위치는 root 디렉토리이다.

import dotenv from 'dotenv';
import { ChannelChats } from './src/entities/ChannelChats';
import { ChannelMembers } from './src/entities/ChannelMembers';
import { Channels } from './src/entities/Channels';
import { DMs } from './src/entities/DMs';
import { Mentions } from './src/entities/Mentions';
import { Users } from './src/entities/Users';
import { WorkspaceMembers } from './src/entities/WorkspaceMembers';
import { Workspaces } from './src/entities/Workspaces';
import { DataSource } from 'typeorm';

dotenv.config();

const dataSource = new DataSource({
  type: 'mysql',
  host: process.env.DB_HOST,
  port: 3306,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  entities: [
    Users,
    Workspaces,
    WorkspaceMembers,
    Channels,
    ChannelMembers,
    ChannelChats,
    DMs,
    Mentions,
  ],
  migrations: [__dirname + '/src/migrations/*.ts'],
  charset: 'utf8mb4_general_ci',
  synchronize: false,
  logging: true,
});

export default dataSource;

 

 

1-4. DB 생성

$ npm run db:create

 

sequelize의 명령어 db:create와 동일한 역할

$ npx sequelize db:create

 

 

생성 확인

 

1-5. DB 삭제

$ npm run db:drop

 

sequelize의 명령어 db:drop와 동일한 역할

$ npx sequelize db:drop

 

 

정상 삭제 확인

 

 

2. 테이블 생성

2-1. 테이블 생성

테이블 생성의 명령어는 '$ npm run schema:sync' 이지만

현재 packge.json에는 테이블 생성/삭제 명령어 schema:sync와 schema:drop에 경로가 지정되어 있지 않다.

{
  "scripts": {
    "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
    "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
  },
}

 

이유는 app.module.ts/TypeOrmModule의 synchronize 옵션이 true로 설정되어 있기 때문인데

@Module({
  imports: [
    TypeOrmModule.forRoot({
      synchronize: true, 
    }),
  ],
})

 

이 옵션의 영향으로 DB가 생성된 상태에서 nest 서버가 실행되는 순간 자동으로 테이블을 생성하게 된다.

$ npm run start:dev

> a-nest@0.0.1 start:dev
> nest build --webpack --webpackPath webpack-hmr.config.js --watch


 Info  Webpack is building your sources...

webpack 5.89.0 compiled successfully in 7249 ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [NestFactory] Starting Nest application...
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] TypeOrmModule dependencies initialized +141ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] WorkspacesModule dependencies initialized +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] ChannelsModule dependencies initialized +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] DmsModule dependencies initialized +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] ConfigHostModule dependencies initialized +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] UsersModule dependencies initialized +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] ConfigModule dependencies initialized +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:45     LOG [InstanceLoader] AppModule dependencies initialized +0ms
query: SELECT VERSION() AS `version`
query: START TRANSACTION
query: SELECT DATABASE() AS `db_name`
query: SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'dms' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'mentions' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'workspacemembers' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'workspaces' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'channels' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'channelmembers' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'users' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'channelchats' UNION SELECT `TABLE_SCHEMA`, `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'workspacemembers' UNION SELECT `TABLE_SCHEMA`, 
`TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'channelmembers'
query: SELECT * FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_SCHEMA` = '00_nestjs_typeorm' AND `TABLE_NAME` = 'typeorm_metadata'
query: CREATE TABLE `dms` (`id` int NOT NULL AUTO_INCREMENT, `content` text NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `WorkspaceId` int NULL, `SenderId` int NULL, `ReceiverId` int NULL, INDEX `dms_ibfk_3` (`ReceiverId`), INDEX `dms_ibfk_2` (`SenderId`), INDEX `WorkspaceId` (`WorkspaceId`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: CREATE TABLE `mentions` (`id` int NOT NULL AUTO_INCREMENT, `category` enum ('chat', 'dm', 'system') NOT NULL, `ChatId` int NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `WorkspaceId` int NULL, `SenderId` int NULL, `ReceiverId` int NULL, INDEX `ReceiverId` (`ReceiverId`), INDEX `SenderId` (`SenderId`), INDEX `WorkspaceId` (`WorkspaceId`), PRIMARY KEY (`id`)) ENGINE=InnoDB   
query: CREATE TABLE `workspacemembers` (`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `WorkspaceId` int NOT NULL, `UserId` int NOT NULL, `loggedInAt` datetime NULL, INDEX `UserId` (`UserId`), PRIMARY KEY (`WorkspaceId`, `UserId`)) ENGINE=InnoDB
query: CREATE TABLE `workspaces` (`id` int NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `url` varchar(30) NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` 
datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `deletedAt` datetime(6) NULL, `OwnerId` int NULL, INDEX `OwnerId` (`OwnerId`), UNIQUE INDEX `url` (`url`), UNIQUE INDEX `name` (`name`), UNIQUE INDEX `IDX_de659ece27e93d8fe29339d0a4` (`name`), UNIQUE INDEX `IDX_22a04f0c0bf6ffd5961a28f5b7` (`url`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: CREATE TABLE `channels` (`id` int NOT NULL AUTO_INCREMENT, `name` varchar(30) NOT NULL, `private` tinyint(1) NULL DEFAULT '0', `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `WorkspaceId` int NULL, INDEX `WorkspaceId` (`WorkspaceId`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: CREATE TABLE `channelmembers` (`createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `ChannelId` int NOT NULL, `UserId` int NOT NULL, INDEX `UserId` (`UserId`), PRIMARY KEY (`ChannelId`, `UserId`)) ENGINE=InnoDB
query: CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT, `email` varchar(30) NOT NULL, `nickname` varchar(30) NOT NULL, `password` varchar(100) NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `deletedAt` datetime(6) NULL, UNIQUE INDEX `email` (`email`), UNIQUE INDEX `IDX_97672ac88f789774dd47f7c8be` (`email`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: CREATE TABLE `channelchats` (`id` int NOT NULL AUTO_INCREMENT, `content` text NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), `UserId` int NULL, `ChannelId` int NULL, INDEX `ChannelId` (`ChannelId`), INDEX `UserId` (`UserId`), PRIMARY KEY (`id`)) ENGINE=InnoDB
query: ALTER TABLE `workspacemembers` DROP COLUMN `createdAt`
query: ALTER TABLE `workspacemembers` DROP COLUMN `updatedAt`
query: ALTER TABLE `workspacemembers` DROP COLUMN `loggedInAt`
query: ALTER TABLE `channelmembers` DROP COLUMN `createdAt`
query: ALTER TABLE `channelmembers` DROP COLUMN `updatedAt`
query: ALTER TABLE `workspacemembers` ADD `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
query: ALTER TABLE `workspacemembers` ADD `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
query: ALTER TABLE `workspacemembers` ADD `loggedInAt` datetime NULL
query: ALTER TABLE `channelmembers` ADD `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
query: ALTER TABLE `channelmembers` ADD `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
query: CREATE INDEX `IDX_1f3af49b8195937f52d3a66e56` ON `workspacemembers` (`UserId`)
query: CREATE INDEX `IDX_77afc26dfe5a8633e6ce35eaa4` ON `workspacemembers` (`WorkspaceId`)
query: CREATE INDEX `IDX_3446cc443ce59a7f7ae62acc16` ON `channelmembers` (`UserId`)
query: CREATE INDEX `IDX_e53905ed6170fb65083051881e` ON `channelmembers` (`ChannelId`)
query: ALTER TABLE `dms` ADD CONSTRAINT `FK_904b6c6393befe39400ad9ff29c` FOREIGN KEY (`WorkspaceId`) REFERENCES `workspaces`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `dms` ADD CONSTRAINT `FK_e0b2f87fa1167f44f12aea6f5ca` FOREIGN KEY (`SenderId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `dms` ADD CONSTRAINT `FK_ccb84506be7d2dcb3df1163e8ac` FOREIGN KEY (`ReceiverId`) 
REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `mentions` ADD CONSTRAINT `FK_51792a8377dc294a53b2bf7b213` FOREIGN KEY (`WorkspaceId`) REFERENCES `workspaces`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `mentions` ADD CONSTRAINT `FK_f2a3d51cdda2918df6295336ebb` FOREIGN KEY (`SenderId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `mentions` ADD CONSTRAINT `FK_9cdbb618081d505406bde0e248e` FOREIGN KEY (`ReceiverId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `workspacemembers` ADD CONSTRAINT `FK_77afc26dfe5a8633e6ce35eaa44` FOREIGN KEY (`WorkspaceId`) REFERENCES `workspaces`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
query: ALTER TABLE `workspacemembers` ADD CONSTRAINT `FK_1f3af49b8195937f52d3a66e566` FOREIGN KEY (`UserId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
query: ALTER TABLE `workspaces` ADD CONSTRAINT `FK_d9a20240a57a1c75e626ef56b2f` FOREIGN KEY (`OwnerId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `channels` ADD CONSTRAINT `FK_9fb12216c2d8cac3fad686e293b` FOREIGN KEY (`WorkspaceId`) REFERENCES `workspaces`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `channelmembers` ADD CONSTRAINT `FK_e53905ed6170fb65083051881e7` FOREIGN KEY (`ChannelId`) REFERENCES `channels`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
query: ALTER TABLE `channelmembers` ADD CONSTRAINT `FK_3446cc443ce59a7f7ae62acc168` FOREIGN KEY (`UserId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE
query: ALTER TABLE `channelchats` ADD CONSTRAINT `FK_d94a7a11d2bc17e56ed7c9790c3` FOREIGN KEY (`UserId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: ALTER TABLE `channelchats` ADD CONSTRAINT `FK_8494e7d49237c46d648fbab8cf4` FOREIGN KEY (`ChannelId`) REFERENCES `channels`(`id`) ON DELETE SET NULL ON UPDATE CASCADE
query: COMMIT
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [InstanceLoader] TypeOrmCoreModule dependencies initialized +2794ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [InstanceLoader] TypeOrmModule dependencies initialized +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RoutesResolver] AppController {/}: +36ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/, GET} route +2ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RoutesResolver] UsersController {/api/users}: +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/users, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/users, POST} route 
+1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/users/login, POST} 
route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/users/logout, POST} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RoutesResolver] WorkspacesController {/api/workspaces}: +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces, GET} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces, POST} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/members, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/members, POST} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/members/:id, DELETE} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/members/:id, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RoutesResolver] ChannelsController {/api/workspaces/:url/channels}: +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels, POST} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels/:name, GET} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels/:name/chats, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels/:name/chats, POST} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels/:name/members, GET} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/channels/:name/members, POST} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RoutesResolver] DmsController {/api/workspaces/:url/dms}: +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/dms/:id/chats, GET} route +0ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [RouterExplorer] Mapped {/api/workspaces/:url/dms/:id/chats, POST} route +1ms
[Nest] 30684  - 2023. 11. 12. 오후 4:43:48     LOG [NestApplication] Nest application successfully started +3ms
listening on port 3030

 

터미널에서 Nest 실행 로그 외에도

SELECT VERSION() AS `version`, START TRANSACTION... 등의 쿼리문을 확인할 수 있다.

 

 

새로고침 후 테이블(엔티티) 생성 확인

 

테이블 작업이 정상적으로 완료되었다면 app.module.ts의 synchronize 옵션을 false로 바꾼다.

@Module({
  imports: [
    TypeOrmModule.forRoot({
      synchronize: false, 
    }),
  ],
})

 

이 옵션은 nest 서버가 실행될때마다 적용되기 때문에

핫 리로딩이 설정되어 있는 현재 환경에서는 저장할때마다 테이블들을 생성하려는 쿼리문을 보내게 되고,

에러가 발생하게 된다.

 

 

2-2. 테이블 삭제

삭제할 테이블의 DB 정보가 담긴 dataSource.ts 파일의 경로를 추가해준다.

{
  "scripts": {
    "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop -d ./dataSource.ts",
  },
}

 

 

 

 

테이블들이 모두 DROP된 것을 확인할 수 있다.

 

 

3. seeding

seeding은 테스트를 위한 더미 데이터, 혹은 서비스 운영에 필요한 초기 데이터를 삽입하는데 쓰인다.

 

3-1. /src/database/seeds 디렉토리 하단에 파일 생성한다.

seed 명령어를 실행하면 해당 디렉토리 하단의 모든 파일을 확인하기 때문에

파일 이름은 자유롭게 작성해도 된다.

 

- create-initial-data.ts

import { Seeder, SeederFactoryManager } from 'typeorm-extension';
import { DataSource } from 'typeorm';
import { Workspaces } from '../../entities/Workspaces';
import { Channels } from '../../entities/Channels';

export default class UserSeed implements Seeder {
  public async run(
    dataSource: DataSource,
    // import는 from 'typeorm'으로 되어 있지만
    // 실제 데이터는 dataSource.ts에 존재함
    factoryManager: SeederFactoryManager,
    // '@faker-js/faker' 라이브러리를 이용해서 가짜 데이터를 만들때 사용함
  ): Promise<any> {
    const workspacesRepository = dataSource.getRepository(Workspaces);
    await workspacesRepository.insert([
      { id: 1, name: 'TypeORM seeder', url: 'Welcome' },
    ]);
    const channelsRepository = dataSource.getRepository(Channels);
    await channelsRepository.insert([
      {
        id: 1,
        name: '일반',
        WorkspaceId: 1,
        private: false,
      },
    ]);
  }
}

/** 기본 워크스페이스와 채널을 만드는(seeding) 파일
 * 회원가입을 완료했을때 워크스페이스 화면으로 넘어갈건데,
 * 처음에는 기본 워크스페이스와 그 안의 채널이 없기 때문에
 * 워크스페이스로 넘어가는 순간 에러가 발생함
 * 이를 방지하기 위해 초창기 데이터를 생성하는 역할
 */

 

 Workspaces와 Channels 테이블에 데이터를 삽입하는 내용이다.

현재 해당 테이블들에는 아무런 데이터가 없다.

 

 

3-2. seed 명령어 실행

$ npm run seed

> a-nest@0.0.1 seed
> ts-node ./node_modules/typeorm-extension/bin/cli.cjs seed:run -d ./dataSource.ts

ℹ DataSource Directory: C:\(중략)\a-nest              오후 5:04:13
ℹ DataSource Name: dataSource.ts                                                     오후 5:04:13
query: SELECT VERSION() AS `version`
query: INSERT INTO `workspaces`(`id`, `name`, `url`, `createdAt`, `updatedAt`, `deletedAt`, `OwnerId`) VALUES (?, ?, ?, DEFAULT, DEFAULT, DEFAULT, DEFAULT) -- PARAMETERS: [1,"TypeORM seeder","Welcome"]
query: SELECT `Workspaces`.`id` AS `Workspaces_id`, `Workspaces`.`createdAt` AS `Workspaces_createdAt`, `Workspaces`.`updatedAt` AS `Workspaces_updatedAt`, `Workspaces`.`deletedAt` AS `Workspaces_deletedAt` FROM `workspaces` `Workspaces` WHERE ( `Workspaces`.`id` = ? ) AND ( `Workspaces`.`deletedAt` IS NULL ) -- PARAMETERS: [1]
query: INSERT INTO `channels`(`id`, `name`, `private`, `createdAt`, `updatedAt`, `WorkspaceId`) VALUES (?, ?, ?, DEFAULT, DEFAULT, ?) -- PARAMETERS: [1,"일반",false,1]
query: SELECT `Channels`.`id` AS `Channels_id`, `Channels`.`private` AS `Channels_private`, `Channels`.`createdAt` AS `Channels_createdAt`, `Channels`.`updatedAt` AS `Channels_updatedAt` FROM `channels` `Channels` WHERE `Channels`.`id` = ? -- PARAMETERS: [1]

 

 

Workspaces, Channels 테이블에 데이터가 생성되었다.