TypeOrm

ayboori·2024년 11월 26일

Nest.js

목록 보기
3/11

구현 패턴

Active Record 패턴

  • 모델 자체에 쿼리 메소드를 정의

  • 모델의 메소드를 사용하여 객체를 CRUD

  • 규모가 작은 어플리케이션에 적합, 유지보수하는데 효과적

    엔티티 선언

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;
}

// BaseEntity를 상속받아 커스텀 메소드 선언 및 사용 가능
// 아래의 경우 직접 작성할 수 있는 커스템 메소드
    static findByName(firstName: string, lastName: string) {
        return this.createQueryBuilder("user")
            .where("user.firstName = :firstName", { firstName })
            .andWhere("user.lastName = :lastName", { lastName })
            .getMany()
    }

데이터 CRUD


// new를 이용하여 새로운 인스턴트를 생성하여 사용 가능
const user = new User();
user.firstName = "timber";
user.isActive = true;
await user.save();

// 삭제
await user.remove();

Data Mapper 패턴

  • 쿼리 접근 방법을 repository 별도의 클래스로 정의, 저장소를 이용하여 개체를 저장, 제거, 로드한다.
  • 규모가 큰 애플리케이션에 적합, 유지보수하는데 효과적
  • BaseEntity를 상속하지 않고, 위와 같이 Entity를 선언한다.

repository 선언

import {EntityRepository, Repository} from "typeorm";
import {User} from "../entity/User";

@EntityRepository()
export class UserRepository extends Repository<User> {

    findByName(firstName: string, lastName: string) {
        return this.createQueryBuilder("user")
            .where("user.firstName = :firstName", { firstName })
            .andWhere("user.lastName = :lastName", { lastName })
            .getMany();
    }

}

Service에서 사용


//repository 주입
const userRepository = dataSource.getRepository(User)

// new 키워드를 이용한 데이터 저장
const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.isActive = true
await userRepository.save(user)

// 데이터 삭제
await userRepository.remove(user)

// 데이터 찾기
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",
})

구현

database.module.ts

import / export에

import { Module } from '@nestjs/common';
import { databaseProviders } from './database.repository';

@Module({
  providers: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {}
export const handlers = [CreatePostHandler, GetPostHandler];

@Module({
  imports: [TypeOrmModule.forFeature([PostEntity])],
  providers: [PostService, ...handlers],
  controllers: [PostController],
})
export class PostModule {}

참고 https://aonee.tistory.com/77 https://cdragon.tistory.com/entry/NestJS-TypeORM으로-MySQL-데이터베이스-연결하기TypeORM-기능-다-알아보기
profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글