export type SignupResDto = {
id: string;
name: string;
email: string;
phone: string;
password: string;
};
TypeScript에서 type
과 class
를 사용하여 데이터 모델을 정의할 때, 각각의 선택이 가지는 이점과 상황에 따른 적합성을 고려하는 것이 중요합니다. 여기서 LoginReqDto
를 type
으로 정의한 경우의 이점을 살펴보겠습니다.
class
를 사용할 경우, 인스턴스 생성, 메소드 정의, 상속 등 더 복잡한 객체 지향 프로그래밍 기능이 필요할 때 적합합니다. 반면, type
은 주로 데이터의 형태를 정의하는 데 초점을 맞추고 있습니다. 따라서, LoginReqDto
같은 간단한 데이터 전달 객체를 정의할 때는 type
이 더 적합할 수 있습니다.
각 폴더마다 index.ts 파일이 있었고, 각 파일들을 export 해주고 있었습니다.
무슨 의미인지 알아보았습니다.
모듈화와 재사용성을 위해 사용되는 패턴이며 간결한 임포트, 폴더 단위의 캡슐화 등의 장점이 있어 쓰인다고 합니다.
어떠한 파일을 import, export하는 걸 한번에 처리가 가능해 유지보수성도 높아집니다.
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
인스턴스를 가리킨다.Promise<void>
반환 유형은 함수가 성공적으로 완료되면 특정 값이 아닌 완료 상태만 반환하고, 에러가 발생하면 예외를 던진다는 것
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);
}