이제껏 백엔드 에서 orm을 사용할때 rails에서는 active record 패턴을, nestjs에서는 data mapper 패턴을 사용하였습니다.
(rails에서는 ActiveRecord를 nestjs에서는 typeorm을 사용하였었습니다)
두 패턴간의 특징을 정리해두려 합니다
DB를 조회하는 메소드를 모델내에 정의하면 active record 패턴
별도의 repositories 클래스를 생성하여 쿼리 메소드를 작성하는 것은 data mapper 패턴이라 합니다.
active record 패턴
DB를 조회하는 메소드를 모델내에 정의하는 패턴을 active record 패턴이라 합니다.
간단하다고 생각합니다.
개인적인 생각으로는 typeorm 에서는 entity 내부에 관계정의까지 같이 정의하는 것이 좋다고 판단하여
active record를 적용하면 메서드가 조금만 많아져도 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 timber = await User.findByName("Timber", "Saw")
data mapper 패턴
별도의 클래스를 생성하여 해당 클래스 내부에 db 조회 메소드들을 몰아 넣습니다.
data mapper 패턴에서도 active record 패턴처럼 모델 내에 메소드를 필요에 의해 정의할 수는 있습니다.
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
}
import { EntityRepository, Repository, getRepository } from 'typeorm';
import { UsersEntity } from './users.entity';
@EntityRepository(UsersEntity)
export class UsersRepository extends Repository<UsersEntity> {
findByName(firstName: string, lastName: string) {
return this.createQueryBuilder("user")
.where("user.firstName = :firstName", { firstName })
.andWhere("user.lastName = :lastName", { lastName })
.getMany()
}
}
const userRepository = connection.getCustomRepository(UserRepository);
const timber = await userRepository.findByName("Timber", "Saw");
그러면 어떤것을 써야 할까요??
둘중 택일을 해야할 때는 유지보수의 측면에서 보는게 적합할것 같습니다.
data mapper 패턴은 규모가 큰 어플리케이션을 다룰때 유지보수에 도움을 줄 수 있습니다.
active record 패턴은 단순합니다. 규모가 작은 어플리케이션을 다룰때 유지보수에 도움을 줄 수 있습니다.
이 두개의 장단점은 정답이 아닙니다. 둘중 하나를 택하여 단순하게 관리 하는 것이 유지보수에 더 나은 경험을 줄것 같습니다.
출처: https://github.com/typeorm/typeorm/blob/master/docs/active-record-data-mapper.md
'Node' 카테고리의 다른 글
npm link (0) | 2022.03.04 |
---|---|
nestjs 의존성 주입, 싱글턴 패턴 (0) | 2022.02.28 |
npm 만드는 법 && 출시 (0) | 2022.02.07 |
.npmignore (0) | 2022.02.07 |
algorithm-cli 생성기 (0) | 2022.02.07 |