군붕이의 메모장

[TypeORM] 테이블 생성시 기본값 저장 구현 본문

데이터베이스/TypeORM

[TypeORM] 테이블 생성시 기본값 저장 구현

초보군붕이 2023. 3. 5. 16:56
반응형

데이터베이스의 테이블을 설계하다보면 특정 테이블에 항상 기본값이 필요한 경우가 존재한다.

 

이 때 실제 프로덕션의 경우에는 DB가 초기화될 일이 없지만, 개발단계에서는 테이블의 구조가 바뀔수도 있기때문에 이 경우 DB의 데이터가 초기화되는 경우도 존재한다.

 

매번 데이터를 초기화되고 수동으로 넣어주는건 매우 비효율적이라 기본 데이터를 넣을수 있게 구현해봤다.

 

고민한 방법은 다음과 같다

  • typeorm-seeding을 사용해서 초기값 구성
    • typeorm-seeding은 typeorm@0.2.X 버전에 호환되므로 불가능한 케이스이다.
    • typeorm@0.2.X → 0.3.X 버전으로 업그레이드 되면서 보안적인 이슈가 많이 해결됬다.
  • typeorm-migration을 통해 초기값 구성
    • 시도를 해보았으나 버전 이슈로 인해 작동이 잘 되지 않았다..
  • 직접 데이터 넣기
    • 위 방법으로 구현했다.

 

데이터베이스 ERD

1:N 관계를 가진다

 

내가 board_category에 테이블에 넣고싶은 기본값은 홈페이지에서 사용할 13개의 카테고리이다.

 

SQL로 보면 아래와 같다.

INSERT INTO board_category (category_id, name) VALUES
      (1, 'notice'),
      (2, 'suggestion'),
      (3, 'free'),
      (4, 'knowledge'),
      (5, 'tips'),
      (6, 'review'),
      (7, 'qna'),
      (8, 'tech'),
      (9, 'career'),
      (10, 'recruitment'),
      (11, 'project'),
      (12, 'study'),
      (13, 'company');

 

● BoardsCategoryEntity에 기본 데이터 정의하기

import { Column, Entity, OneToMany, PrimaryColumn } from 'typeorm';
import { BoardsEntity } from './boards.entity';

@Entity({ name: 'board_category' })
export class BoardsCategoryEntity {
  @PrimaryColumn({ name: 'category_id' })
  categoryId: number;

  @Column({ type: 'varchar', name: 'name', length: 255 })
  name: string;

  @OneToMany(() => BoardsEntity, (board) => board.category1)
  boards1: BoardsEntity;

  @OneToMany(() => BoardsEntity, (board) => board.category2)
  boards2: BoardsEntity;
}

export const defaultCategorys: Partial<BoardsCategoryEntity>[] = [
  { categoryId: 1, name: 'notice' },
  { categoryId: 2, name: 'suggestion' },
  { categoryId: 3, name: 'free' },
  { categoryId: 4, name: 'knowledge' },
  { categoryId: 5, name: 'tips' },
  { categoryId: 6, name: 'review' },
  { categoryId: 7, name: 'qna' },
  { categoryId: 8, name: 'tech' },
  { categoryId: 9, name: 'career' },
  { categoryId: 10, name: 'recruitment' },
  { categoryId: 11, name: 'project' },
  { categoryId: 12, name: 'study' },
  { categoryId: 13, name: 'company' },
];

 

● BoardsRepository에서 데이터 저장로직 구현하기

import { DataSource, Repository } from 'typeorm';
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { BoardsEntity } from 'src/entities/boards.entity';
import { CreateBoardDto } from 'src/boards/dto/create-board.dto';
import { BoardsCategoryEntity, defaultCategorys } from 'src/entities/boards-category.entity';

@Injectable()
export class BoardsRepository {
  constructor(
    // 게시글 카테고리 엔티티 의존성주입
    @InjectRepository(BoardsCategoryEntity)
    private readonly boardsCategoryRepository: Repository<BoardsCategoryEntity>,
  ) {}
  
  /** board_category 테이블에 기본 데이터 저장하기 */
  async createDefaultCategorys() {
    for (const defaultCategory of defaultCategorys) {
      const user = this.boardsCategoryRepository.create(defaultCategory);
      await this.boardsCategoryRepository.save(user);
    }
  }
}

 

● app.module에서 생성자 내부에서 createDefaultCategory() 메소드 호출하기

export class AppModule {
  constructor(private boardsRepository: BoardsRepository) {
    this.boardsRepository.createDefaultCategorys();
  }
}

 

그 후 nest를 실행시켜주면 데이터베이스에 정상적으로 들어간것을 확인할 수 있다.

 

성공

반응형