Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- s3
- AWS
- ACM
- React
- route53
- 리액트
- styled-component
- GlobalStyle
- riotapi
- liunx
- typeorm
- 카카오 로그인
- 배포
- CloudFront
- e.stopPropagation()
- Python
- 롤
- Object.freeze()
- docker
- nestjs
- Github Actions
- e.preventDefault()
- requests
- code-server
- Django
- mysqlclient
- ci/cd
- Recoil
- 전역스타일
- 자바스크립트
Archives
- Today
- Total
군붕이의 메모장
[TypeORM] 테이블 생성시 기본값 저장 구현 본문
반응형
데이터베이스의 테이블을 설계하다보면 특정 테이블에 항상 기본값이 필요한 경우가 존재한다.
이 때 실제 프로덕션의 경우에는 DB가 초기화될 일이 없지만, 개발단계에서는 테이블의 구조가 바뀔수도 있기때문에 이 경우 DB의 데이터가 초기화되는 경우도 존재한다.
매번 데이터를 초기화되고 수동으로 넣어주는건 매우 비효율적이라 기본 데이터를 넣을수 있게 구현해봤다.
고민한 방법은 다음과 같다
- typeorm-seeding을 사용해서 초기값 구성
- typeorm-seeding은 typeorm@0.2.X 버전에 호환되므로 불가능한 케이스이다.
- typeorm@0.2.X → 0.3.X 버전으로 업그레이드 되면서 보안적인 이슈가 많이 해결됬다.
- typeorm-migration을 통해 초기값 구성
- 시도를 해보았으나 버전 이슈로 인해 작동이 잘 되지 않았다..
- 직접 데이터 넣기
- 위 방법으로 구현했다.
데이터베이스 ERD
내가 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를 실행시켜주면 데이터베이스에 정상적으로 들어간것을 확인할 수 있다.
반응형
'데이터베이스 > TypeORM' 카테고리의 다른 글
[TypeORM] Entity간 관계 지정시 Column명 커스텀하기 (0) | 2023.03.04 |
---|