본문 바로가기

verdantjuly/Today I Learned

TIL 20240221

728x90

이번 주 목표

Danmi 프로젝트 완성

회원가입

로그인

로그아웃

회원탈퇴

회원 정보 수정

회원 전체 조회

회원 정보 (credit내역 보이게)

일주일 수업 정보

수업 생성

수업 삭제

수업 룸 수정

수업 강사 수정

수업 조회

credit 생성 (수업 신청)

credit status 변경 (수업 진행상태 변경- 수업 완료, 수업 예정, 노쇼)

오늘 목표

프로젝트 세팅

resmemory 회의

항해 99 리부트 유선 전화 면접 

TIL 작성

오늘 한 것

프로젝트 세팅

resmemory 회의

항해 99 리부트 유선 전화 면접

오늘 스케줄

2:00 PM - 항해 99 리부트 유선 전화 면접

3:00 PM ~ 9:00 PM Nest.js 프로젝트

9:00 PM ~ 10:00 PM resmemory 회의

10:00 PM ~ 11:00 PM TIL 작성

1. Active Record Pattern vs Data Mapper pattern

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 방식으로 작성하는 것이 좋을 것 같다. 

 

 


정리 

항해 리부트의 초기 참가 자료를 작성하면서 기술적 의사 결정과 나의 생각들이 얼마나 소중한지 알게되었다.

어떤 개발자로 성장할지 볼 수 있는 자료이기 때문에 사람들이 중요하다고 입이 닳도록 말한 것 같다.

앞으로 무언가를 만들 때 꼭 생각을 해 보고 만들어야겠다. 

KPT

Keep

기술적 의사 결정이 있다면 기록으로 남기기.

Problem

마음이 급해서 TIL 이나 기록을 자주 넘김

Try

조금은 여유있게 기록하며 개발하기

소감

오랜만에 개발을 조금 해서 뿌듯하다

 

 

 

 

'verdantjuly > Today I Learned' 카테고리의 다른 글

TIL 20240226  (2) 2024.02.26
TIL 20240222  (0) 2024.02.22
TIL 20240201  (0) 2024.02.01
TIL 20240131  (0) 2024.01.31
TIL 20240129  (0) 2024.01.29