본문 바로가기

아카이브/Danmi

Active Record Pattern vs Data Mapper pattern

728x90

Active Record Pattern

엔티티 모델에서 BaseEntity를 상속 받아 사용한다.

엔티티 클래스 내부의 쿼리가 들어가는 메서드를 작성한다.

 

import {
  BaseEntity,
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
  DeleteDateColumn,
} from 'typeorm';
import { Type } from '../dto/type.enum';
import bcrypt from 'bcrypt';

@Entity()
export class Users extends BaseEntity {
  @PrimaryGeneratedColumn()
  userId: number;

  @Column()
  id: string;

  @Column()
  name: string;

  @Column()
  password: string;

  @Column()
  phone: string;

  @Column()
  credit: number;

  @Column()
  type: Type;

  @Column({ nullable: true })
  mainTutor: string;

  @CreateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  createdAt: Date;

  @UpdateDateColumn({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  updatedAt: Date;

  @DeleteDateColumn({ type: 'timestamp', nullable: true })
  deletedAt: Date;

  static async createUser(
    id: string,
    password: string,
    name: string,
    phone: string,
    credit: number,
    type: Type,
    mainTutor: string,
  ) {
    const user = new Users();
    user.id = id;
    user.password = await bcrypt.hash(password, 10);
    user.name = name;
    user.phone = phone;
    user.credit = credit;
    user.type = type;
    user.mainTutor = mainTutor;

    await user.save();

    return user;
  }

  static async findOneUserById(id: string) {
    return await Users.findOne({ where: { id } });
  }
}

 

Data Mapper pattern

레포지토리 레이어에서 쿼리를 작성한다.

서비스 로직 없이 레포지토리 레이어로 이어지는 API의 경우 불필요한 코드가 발생한다.

가독성이 좋아진다. (나의 견해)

 

기술적 의사 결정

가독성도 물론 중요하지만 불필요한 로직이 상당히 많아진다면 해당 로직을 제거하는 것이 우선이라고 생각한다. 

현재 만드는 Danmi 프로젝트에서는 복잡한 트랜젝션이 있는 쿼리 로직이 없기 때문에 

엔티티 클래스 안에 Active Record 방식으로 작성하는 것이 좋을 것 같다. 

'아카이브 > Danmi' 카테고리의 다른 글

express-session vs JWT Token (Refresh Token, Redis)  (0) 2024.02.22