[TypeORM] Active Record vs Data Mapper

hahaha·2021년 10월 18일
0

TypeORM

목록 보기
1/4

지금까지 사용하고 심지어 오늘도 사용한 게 무슨 방식인지도 모른다는 사실에... 정리해본다 😂😂

Active Record

  • 모든 쿼리 메서드를 모델 안에 정의 할 수 있음
  • 모델 메서드를 통해 CRUD 수행
  • 모든 엔티티는 BaseEntity를 상속해야 함
  • BaseEntityRepository의 많은 메서드들을 가짐
@Entity()
export class User extends BaseEntity {
  @PrimaryColumn()
  id: number
  
  @Column()
  firstName: string;
}

const user = new User();
user.firstName = 'Timber';
await user.save();

await user.remove();

const users = await User.find({ skip: 2, take: 5 });
  • 대부분의 경우 Repository or EntityManager를 엔티티와 사용할 필요가 없음
  • 관련 메소드들을 클래스(model) 내에 정의하여 사용할 수 있기에
@Entity()
export class User extends BaseEntity {
  @PrimaryColumn()
  id: number
  
  @Column()
  firstName: string;
 
  static findById(id: number) {
    return this.createQueryBuilder("user")
    	.where("user.id = :id", { id })
    	.getOne();
  }
}

const timber = await User.findById(1);

Data Mapper

  • 모든 쿼리 메서드를 repositories 라 불리는 별도의 클래스에 정의할 수 있음
  • repositories 를 통해 CURD 수행
  • 이 패턴을 사용하는 경우, 엔티티는 매우 "dumb" 하다..
    - 단지 속성을 정의하고 "dummy"한 메서드가 존재할 수 있음
  • 모델이 아닌 repositories를 통해 DB에 접근
const userRepository = connection.getRepository(User);

const user = new User();
user.firstName = 'Timber';
await userRepository.save();

await userRepository.remove();

const users = await userRepository.find({ skip: 2, take: 5 });
  • 사용자 정의 메서드는 custom repository 내에 생성 가능
@EntityRepository()
export class UserRepository extends Repository<User> {
  findById(id: number) {
    return this.createQueryBuilder("user")
    	.where("user.id = :id", { id })
    	.getOne();
  }
}

const userRepository = connection.getCustomRepository(UserRepository);
const timber = await userRepository.findById(1);

무엇을 사용해야 하나?

  • 두 방식 모두 장단점이 존재.
  • Active Record 방식은 작은 규모의 애플리케이션에서 간단하게 만들 수 있음
  • Data Mapper 방식은 큰 규모의 애플리케이션에서 유지보수성이 좋음
  • 간단함은 언제나 더 나은 유지보수를 만드는 열쇠이다...

[참고] Active Record vs Data Mapper

profile
junior backend-developer 👶💻

0개의 댓글