TypeORM

이동현·2023년 4월 5일
0

코드 캠프 블로그

목록 보기
19/50

1. TypeORM

TypeORM이란 객체 지향 언어로 된 Class를 관계형 데이터 베이스의 Table와 연결시켜주는 것으로 직접 SQL문을 작성하지 않고, 객체 지향적으로 코드를 작성할 수 있게 도와주는 ORM중 하나이다.
여기서 다른 ORM과 다른 점이 있다면, 다른 ORM과 달리 액티브 레코드 패턴과 데이터 매퍼 패턴을 모두 지원하여 확장 가능하며 유지보수가 가능한 어플리케이션을 가장 생산적인 방법으로 작성할 수 있다는 점을 차이점으로 들 수 있다.

2. Active Record Pattern이란?

액티브 레코드 패턴은 모델 자체 내에서 모든 쿼리 메서드를 정의하고 모델 메서드를 사용하여 오브젝트를 생성, 삭제, 조회, 수정할 수 있게 하는 방식을 의미한다.

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()
    }
}
위 User 모델을 이용하여 user 객체를 이미 구현된 메서드로 간단하게 생성, 삭제, 조회, 수정할 수 있습니다.

3. Data Mapper Pattern이란?

데이터 매퍼 패턴은 "레포지토리" 라는 별도의 클래스에서 모든 쿼리 메서드를 정의하고 이 "레포지토리"를 사용하여 오브젝트를 생성, 삭제, 조회, 수정할 수 있습니다.

액티브 레코드 패턴과 같이 User 모델을 정의해 줍니다.

차이점은 User 모델을 BaseEntity로 확장하지 않습니다.

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

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

    @Column()
    firstName: string

    @Column()
    lastName: string

    @Column()
    isActive: boolean
}

아래와 같이 User의 레포지토리를 가져와 User 레포지토리에 생성, 삭제, 조회, 수정을 할 수 있습니다.

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",
})

0개의 댓글