![[NestJS] TypeORM 0.3 버전의 CustomRepository 생성, Repository패턴 적용하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWnqSZ%2FbtsC31m5zaC%2FNL1FsWQWiHtM9PMzXn6sDk%2Fimg.png)
0.2 버전
사내 서비스의 TypeORM버전은 0.2버전대를 사용중이다.
0.2버전대에서는 @EntityRepository 데커레이터를 지원하여, Repository를 커스텀화하여 리파지토리 클래스를 생성할 수 있었고,
이에 따라 Service와 Repository레이어를 분리하여 결합도를 낮출 수 있었다.
@Injectable()
export class RsvcenterService {
constructor(
@InjectRepository(CustomRsvRepository)
private readonly customRsvRepo: CustomRsvRepository,
//DB 관련 로직 예외처리 Provider
private readonly customEm: CustomEntityManager,
) { }
async getRsvList(id: string, rsvFilterQueryDto: RsvFilterQueryDto) {
//예약내역 조회
const rsvData = await this.customRsvRepo.findAllById(id);
//404 validation
this.customEm.validateEntity(rsvData);
return rsvData;
}
}
@EntityRepository(RsvEntity)
export class CustomRsvRepository extends Repository<RsvEntity> {
async findAllById(id: string) {
return await this.find({ where: { id: id }});
}
}
0.3 버전
사내 서비스의 버전 관리 일정에 앞서 새로운 프로젝트 일정이 잡혔고,
새로운 프로젝트를 위한 서버 및 CICD 구축,, 등등 할 일이 생겼다. 해당 글의 주제와는 맞지 않으니 넘어가도록 하고.
여튼 새로운 프로젝트 구성을 위해 가급적 높은 버전을 사용해보고, 현재 버전과 다른점이 무엇인지 선파악 해보려했다.
그리하여 위의 서비스는 0.2.45버전을 사용중이지만, 신규 서비스의 TypeORM은 0.3.19버전을 사용하게 되었다.
Releases · typeorm/typeorm
ORM for TypeScript and JavaScript. Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms. -...
github.com
Documentation | NestJS - A progressive Node.js framework
Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Rea
docs.nestjs.com
기본적으로 릴리즈 노트를 확인하고, 공식 문서들을 찾아봤는데
공식 문서에서 기본적으로 DB 접근을 할 때, 서비스 레이어에서 데이터 조회에 관련된 로직을 작성하는 것을 볼 수 있다.
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
constructor(
@InjectRepository(User)
private usersRepository: Repository<User>,
) {}
findAll(): Promise<User[]> {
return this.usersRepository.find();
}
findOne(id: number): Promise<User | null> {
return this.usersRepository.findOneBy({ id });
}
async remove(id: number): Promise<void> {
await this.usersRepository.delete(id);
}
}
더이상 @EntityRepository 데코레이터를 사용할 수 없게 되었고,
따로 커스텀 데커레이터를 만들까 하다가 원래도 상속받는 TypeORM의 Repository 클래스를 참조하여 작성해 보기로 했다.
export declare class Repository<Entity extends ObjectLiteral> {
readonly target: EntityTarget<Entity>;
readonly manager: EntityManager;
readonly queryRunner?: QueryRunner;
get metadata(): import("..").EntityMetadata;
constructor(target: EntityTarget<Entity>, manager: EntityManager, queryRunner?: QueryRunner);
//(...함수 생략...)
}
생성자로 Entity와 EntityManager, 선택사항으로 QueryRunner를 필요로한다는 것을 알아냈다.
이제 위의 코드를 0.3버전에 맞게 수정해보자
@Injectable()
export class CustomRsvRepository extends Repository<RsvEntity> {
constructor( private dataSource: DataSource ) {
super(RsvEntity, dataSource.createEntityManager());
}
async findAllById(id: string) {
return await this.find({ where: { id: id }});
}
}
EntityManager를 생성하기위해 dataSource를 생성자로 사용했고,
QueryRunner는 단순 조회만 하는 예제이기 때문에 추가하지 않았다. 트랜잭션을 사용할 일이 있으면 추가하면 될 것 같아 보인다.
이렇게 작성한 후, 서비스를 아래와 같이 수정하고, 모듈의 Provider에 리파지토리를 추가해주고, 엔터티를 Import시키면 정상적으로 동작하는 것을 확인할 수 있었다.
@Injectable()
export class RsvcenterService {
constructor(
private readonly customRsvRepo: CustomRsvRepository,
//DB 관련 로직 예외처리 Provider
private readonly customEm: CustomEntityManager,
) { }
async getRsvList(id: string, rsvFilterQueryDto: RsvFilterQueryDto) {
//예약내역 조회
const rsvData = await this.customRsvRepo.findAllById(id);
//404 validation
this.customEm.validateEntity(rsvData);
return rsvData;
}
}
후기
어떤 모듈을 설치한 후, 공식문서와 모듈 내장 클래스만 보고 직접 무언가를 작성하거나 수정하는 경험이 처음이었다.
만약 내가 작성한 커스텀 Repo가 잘못된 것일수도 있지만, 검색 없이도 공식문서와 내장 코드들을 들여다보며 수정할 수도 있구나 라는 생각에 뿌듯한 경험이 되었다.
혹시 더 좋은 코드가 있거나, 수정사항이 있으면 누군가 알려주셧으면 감사하겠습니다.. 꾸벅
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!