본문 바로가기
프로그래밍/TypeORM

[TypeORM] Active Record vs Data Mapper

by YuminK 2023. 8. 31.

https://orkhan.gitbook.io/typeorm/docs/active-record-data-mapper

 

What is the 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
}

 

모든 Active-Recorded 엔티티는 BaseEntity 클래스를 상속받아야 한다. (entity를 처리할 수 있는 메소드를 제공한다.)

 

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

// example how to remove AR entity
await user.remove()

// example how to load AR entities
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" })

 

BaseEntity는 표준 레포지토리 메소드의 대부분을 가지고 있다. 

대부분의 경우 Repository나 EntityManager를 사용할 필요가 없다. (with active record entities)

 

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 timber = await User.findByName("Timber", "Saw")

 

Entity 클래스 내부에 쿼리를 생성 한 후 사용한다.

 

What is the Data Mapper pattern?

TypeORM에서는 Active Record와 Data Mapper 패턴을 모두 사용할 수 있다.

 

데이터 메퍼 패턴을 사용하면, 모든 쿼리 메소드를 불리된 Repository 클래스에 정의한다.

데이터 메퍼 패턴에서 엔티티는 단순 데이터 용도로 사용된다.

쉽게 말해, 데이터 메퍼 패턴은 레포지토리 내부에서 데이터베이스에 접근하는 방식이다. 

 

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

 

Which one should I choose?

선택은 당신에게 달려있다. 두 전략 모두 장점과 단점을 가진다.

 

데이터메퍼 방식은 유지보수에 좋다. 더 큰 앱에 효과적이다.

액티브 레코드 방식은 작은 앱에 잘 어울린다. 

 

'프로그래밍 > TypeORM' 카테고리의 다른 글

[TypeORM] Transactions  (0) 2023.08.31
[TypeORM] Caching queries  (0) 2023.08.31
[TypeORM] Entity Inheritance  (0) 2023.08.31
[TypeORM] Embedded Entities  (0) 2023.08.31
[TypeORM] Eager and Lazy Relations  (0) 2023.08.31

댓글