TypeORM

본 글은 네이버 부스트캠프 과정을 위해 별도 학습 후 작성한 노션 문서를 이전한 글입니다.


TypeORM에 대해서…

ORM이란?

TypeORM이란?

  • Node.js, Browser, React Native 플랫폼 등에서 JS,TS와 함께 사용할 수 있는 ORM
  • 소규모 데이터베이스부터 대규모 엔터프라이즈 어플리케이션을 개발하는데 도움이 되는 추가 기능을 제공하는 것을 목표로 함
  • 타 ORM과 달리 액티브 레코드 패턴과 데이터 매퍼 패턴을 모두 지원하여 확장 가능, 유지보수가 가능한 어플리케이션을 가장 생산적인 방법으로 작성할 수 있음

TypeORM 설치

TypeORM 사용법

TypeORM Entity 작성법

Active Record Pattern

  • Entity 자체 내에서 모든 쿼리 메서드를 정의
  • Entity의 메서드를 사용하여 오브젝트를 생성, 삭제 조회, 수정할 수 있게 하는 방식을 의미
import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  isActive: boolean;

  static findByName(firstName: string, lastName: string) {
    return this.createQueryBuilder("user")
      .where("user.firstName = :firstName", { firstName })
      .andWhere("user.lastName = :lastName", { lastName })
      .getMany();
  }
}
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await user.save();

await user.remove();
const users = await User.find({ skip: 2, take: 5 });
const newUsers = await User.findBy({ isActive: true });
const timber = await User.findOneBy({ firstName: "Timber", lastName: "Saw" });
//구현한 메서드
const timber = await User.findByName("Timber", "Saw");

Data Mapper Pattern

레포지토리라는 별도의 클래스에서 모든 쿼리 메서드를 정의하고 이 레포지토리를 사용하여 오브젝트를 생성/삭제/조회/수정 할 수 있음

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;

  @Column()
  isActive: boolean;
}
const userRepository = dataSource.getRepository(User);

// example how to save DM entity
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await userRepository.save(user);

// example how to remove DM entity
await userRepository.remove(user);

// example how to load DM entities
const users = await userRepository.find({ skip: 2, take: 5 });
const newUsers = await userRepository.findBy({ isActive: true });
const timber = await userRepository.findOneBy({
  firstName: "Timber",
  lastName: "Saw",
});

Reference