repository 코드는 테스트 코드를 작성하여야할까?


BACKEND
NESTJS

Repository 코드에 대한 테스트 코드를 작성하여야할까?

아래 코드는 단순한 CRUD typeorm 테스트 코드입니다.

import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { TechDomain } from "../../../../domain/tech.domain";
import { CreateTechRequestDto } from "../../../../dto/request/create-tech.request.dto";
import { UpdateTechRequestDto } from "../../../../dto/request/update-tech.request.dto";
import { ManageTechRepositoryPort } from "../../../../port/output/manage-tech.repository.port";
import { Tech } from "../entities/tech.entity";
import { TechMapper } from "../mapper/tech.mapper";

export class ManageTechRepositoryAdapter
implements ManageTechRepositoryPort
{
constructor(
 @InjectRepository(Tech)
 private readonly techRepository: Repository<Tech>,
) {}

async findAll(): Promise<TechDomain[]> {
 const techEntities = await this.techRepository.find();
 return techEntities.map(TechMapper.toDomain);
}

async findOneById(techId: number): Promise<TechDomain> {
 const techEntity = await this.techRepository.findOne({
   where: {
     id: techId,
   },
 });

 return TechMapper.toDomain(techEntity);
}

async findOneByContent(
 content: string,
): Promise<TechDomain> {
 const techEntity = await this.techRepository.findOne({
   where: {
     content,
   },
 });

 return TechMapper.toDomain(techEntity);
}

async create(
 createTechRequestDto: CreateTechRequestDto,
): Promise<TechDomain> {
 const techEntity = await this.techRepository.save(
   createTechRequestDto,
 );

 return TechMapper.toDomain(techEntity);
}

async update(
 techId: number,
 updateTechRequestDto: UpdateTechRequestDto,
) {
 await this.techRepository.update(
   techId,
   updateTechRequestDto,
 );
}

async remove(id: number) {
 await this.techRepository.delete(id);
}
}

위 코드에 대해서 테스트 코드를 작성하여야할까요?


결론부터 말하면, 반드시 작성할 필요는 없습니다..

이유는 ManageTechRepositoryAdapter가 TypeORM의 Repository 메서드만 호출하는 단순한 래퍼 역할을 하기 때문이다.

테스트가 불필요한 이유

어댑터 자체에는 비즈니스 로직이 없습니다. 위 메서드들 모두 TypeORM Repository의 기본 메서드를 단순히 호출하는 역할입니다. 비즈니스 로직은 use-case에 위임하기 때문에 굳이 테스트를 할 필요가 없습니다.

위 메서드들에 대한 테스트는 TypeORM 만든 사람들이 이미 테스트를 잘 해놨기때문에 저희는 그것을 믿고 쓰면 되는 것이죠.


따라서 findAll, findOneByContent, create, update, remove 메서드들은 충분히 검증되었기 때문에 굳이 테스트할 필요가 없습니다.

따라서 respositry 코드의 역할은 단순히 쿼리역할로만 두기 위해 비즈니스 로직은 usecase로 위임하는 것이 클린 코드가 아닐까 싶습니다.