[NestJS] TypeORM

올리브수
|2024. 1. 15. 23:06
728x90

TypeORM

  • node.js 기반 TypeScript로 작성된 객체 관계형 매퍼 라이브러리

 

  • TypeORM 특징 & 이점
    • 모델을 기반으로 데이터베이스 체계 자동 생성 가능
    • 데이터베이스에서 개체 쉽게 삽입, 업데이트 및 삭제 가능
    • 테이블 간의 매핑
    • 간단한 CLI 명령 제공

 

ORM(Object Relational Mapping)

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 변형 및 연결하는 작업
  • 객체와 데이터베이스의 변형에 유연하게 사용 가능

 

Entity?

  • 데이터베이스 테이블로 변환되는 Class이므로 클래스를 생성한 뒤 그 안에 컬럼들을 정의한다.

 

  • @Entity() : Board 클래스가 엔티티임을 나타냄
  • @PrimaryGeneratedColumn() : id 컬럼이 Board 엔티티의 기본키 임을 나타냄
  • Column() : title, description과 같은 다른 열을 나타냄

 

📄 board.entity.ts

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { BoardStatus } from './boards.model';

@Entity()
export class Board extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  description: string;

  @Column()
  status: BoardStatus;
}

 

 

Repository

  • 데이터베이스에 관련된 일은 Repository에서 담당한다.
    • Repository Pattern이라고도 부른다.

💡 @EntityRepository

  • typeorm 0.3.x 버전 이상부터 사라짐
  • Ref로 방법 개선 가능

 

 

  • @InjectRepository
    • 해당 서비스에서 BoardRepository를 이용한다고 명시

 

  • typeorm 자체에서 제공하는 findOne 메소드를 사용한다.

 

 

Solution 1. Repository Pattern을 사용하여 구현

  • typeorm 구버전에서만 작동

 

📄 board.repository.ts

import { EntityRepository, Repository } from 'typeorm';
import { Board } from './board.entity';

@EntityRepository(Board)
export class BoardRepository extends Repository<Board> {}

 

📄 boards.service.ts

import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Board } from './board.entity';
import { BoardRepository } from './board.repository';

@Injectable()
export class BoardsService {
  constructor(
    @InjectRepository(BoardRepository)
    private boardRepository: BoardRepository,
  ) {}

  async getBoardById(id: number): Promise<Board> {
    const found = await this.boardRepository.findOne(id);

    if(!found) {
      throw new NotFoundException(`Can't find Board with id ${id}`);
    }

    return found;
  }
}
  • repository 자체를 주입

 

 

Solution 2. typeorm v 0.3.0

constructor(
    @InjectRepository(Board)
    private readonly boardRepository: Repository<Board>,
  ) {}
  • 직접적으로 boardRepository내에 넣어주면됨
const found = await this.boardRepository.findOneBy({ id });

이런 형태로 넣어줘야 에러가 발생하지 않음.

 

 

삭제

remove()

  • 무조건 존재하는 아이템을 remove를 이용하여 지워야한다.

 

delete()

  • 만약 아이템이 존재하면 지우고 존재하지 않으면 아무런 영향이 없다.

 

 

728x90

'🏠 Framework > NestJS' 카테고리의 다른 글

[NestJS] Pipe 이용  (0) 2024.01.15
[NestJS] CRUD 구현  (0) 2024.01.15
[NestJS] NestJS 기본 요소  (20) 2024.01.15
[NestJS] Overview  (0) 2023.06.28