[DevCamp - 4일차] 로그인 API 구현

sooyoung choi·2024년 3월 21일
0

jti?

  • jwt 고유 식별자 → 중복처리방지용

class 가 아닌 type으로 선언

export type SignupResDto = {
  id: string;
  name: string;
  email: string;
  phone: string;
  password: string;
};
  • dto를 클래스로 항상 선언해왔었음
  • type으로 export를 왜 해줬을까?

TypeScript에서 typeclass를 사용하여 데이터 모델을 정의할 때, 각각의 선택이 가지는 이점과 상황에 따른 적합성을 고려하는 것이 중요합니다. 여기서 LoginReqDtotype으로 정의한 경우의 이점을 살펴보겠습니다.

class를 사용할 경우, 인스턴스 생성, 메소드 정의, 상속 등 더 복잡한 객체 지향 프로그래밍 기능이 필요할 때 적합합니다. 반면, type은 주로 데이터의 형태를 정의하는 데 초점을 맞추고 있습니다. 따라서, LoginReqDto 같은 간단한 데이터 전달 객체를 정의할 때는 type이 더 적합할 수 있습니다.

index.ts

각 폴더마다 index.ts 파일이 있었고, 각 파일들을 export 해주고 있었습니다.

무슨 의미인지 알아보았습니다.

모듈화와 재사용성을 위해 사용되는 패턴이며 간결한 임포트, 폴더 단위의 캡슐화 등의 장점이 있어 쓰인다고 합니다.

어떠한 파일을 import, export하는 걸 한번에 처리가 가능해 유지보수성도 높아집니다.

@InjectEntityManager()

  • 지금까지는 @InjectRepository만 써보았었습니다.
  • 트랜잭션은 queryRunner를 사용해보았으나 EntityManager를 통해 하는 방법이 간결하고 한눈에 알아볼 수 있게 명확한 느낌을 받았습니다.
  • EntityManager와 비교할 때, EntityManager는 주로 엔티티를 중심으로 데이터베이스 작업을 수행합니다.
  • queryRunner는 복잡하고 세밀한 제어가 필요한 상황에서 유용하며, 특히 사용자가 트랜잭션을 수동으로 관리해야 할 때 적합합니다.
 @InjectRepository(AccessToken)
    private readonly repo: Repository<AccessToken>,
    @InjectEntityManager()
    private readonly entityManager: EntityManager,
  ) {
    super(repo.target, repo.manager, repo.queryRunner);
  }
  • **repo.target**Repository가 작업하고 있는 엔티티 클래스를 가리킨다. AccessToken 클래스를 참조
  • repo.manager 현재 Repository에 연결된 엔티티 매니저
  • **repo.queryRunner** → 현재 Repository에서 사용 중인 QueryRunner 인스턴스를 가리킨다.

Repository pattern

  • 비즈니스 로직과 DB에 접근하는 로직을 구분
  • Repository는 entity객체와 함께 작동하며 개체 찾기, 삽입, 업데이트, 삭제 등을 처리
  • service 파일에서 비즈니스 로직을 처리할 때 DB작업은 Repository가 담당한다.

Promise<void> 반환 유형은 함수가 성공적으로 완료되면 특정 값이 아닌 완료 상태만 반환하고, 에러가 발생하면 예외를 던진다는 것

주어진 문자열 형태의 만료시간을 계산, 해당 시점을 나타내는 Date 객체 반환 함수

private calculateExpiry(expiry: string): Date {
    let expiresInMilliseconds = 0;

    if (expiry.endsWith('d')) {
      const days = parseInt(expiry.slice(0, -1), 10);
      expiresInMilliseconds = days * 24 * 60 * 60 * 1000;
    } else if (expiry.endsWith('h')) {
      const hours = parseInt(expiry.slice(0, -1), 10);
      expiresInMilliseconds = hours * 60 * 60 * 1000;
    } else if (expiry.endsWith('m')) {
      const minutes = parseInt(expiry.slice(0, -1), 10);
      expiresInMilliseconds = minutes * 60 * 1000;
    } else if (expiry.endsWith('s')) {
      const seconds = parseInt(expiry.slice(0, -1), 10);
      expiresInMilliseconds = seconds * 1000;
    } else {
      throw new HttpException('invalid expiry', HttpStatus.BAD_REQUEST);
    }

    return new Date(Date.now() + expiresInMilliseconds);
  }

0개의 댓글