카테고리 없음

패스트캠퍼스 환급챌린지 40일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기

Laftel 2025. 4. 13. 20:31
반응형

***본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다 
영화 목록 조회 기능(getManyMovies)을 개선하고, TypeORM의 Repository를 올바르게 활용
1. import { Like } from 'typeorm'; 추가:

  • 이유: 영화 제목으로 검색 기능을 구현하기 위해 TypeORM에서 제공하는 Like 오퍼레이터를 사용하기 위함입니다. Like 오퍼레이터를 사용하면 SQL의 LIKE 구문을 활용하여 특정 문자열을 포함하는 데이터를 검색할 수 있습니다.

2. constructor 내부 변경:

  • 이전:
     
    constructor(
      @InjectRepository(Movie)
      private readonly movieRepository: RepositoryType<Movie>,
    )
    
  • 현재:
     
    constructor(
      private readonly movieRepository: Repository<Movie>,
    ){}
    
  • 이유:
    • @InjectRepository(Movie) 데코레이터가 사라졌습니다. 이는 해당 서비스가 속한 모듈 (MovieModule일 가능성이 높음)에서 TypeOrmModule.forFeature([Movie])를 통해 Movie 엔티티에 대한 Repository를 제공하고 있기 때문에 NestJS의 의존성 주입 시스템이 자동으로 movieRepository를 주입해 줄 수 있기 때문입니다. 명시적인 데코레이터 없이도 타입 힌트(Repository<Movie>)만으로 의존성 주입이 가능합니다.
    • RepositoryType<Movie>에서 단순히 Repository<Movie>로 타입이 변경되었습니다. 이는 TypeORM의 일반적인 Repository 타입을 명시하는 방식입니다.

3. getManyMovies(title?: string) 함수 내부 변경:

  • 이전:

     
    getManyMovies(title?: string){
      return this.movieRepository.find();
      //   if(!title){
      //         return this.movies;
      //       }
      //   return this.movies.filter(m=>m.title.startsWith(title));
    }
    
  • 현재:

     
    async getManyMovies(title?: string){
      return [await this.movieRepository.findAndCount(),await this.movieRepository.count()];
        if(!title){
          return this.movieRepository.find({
            where:{
              title: Like(`%${title}%`),
            },
        });
        }
      return this.movies.filter(m=>m.title.startsWith(title));
    }
    
  • 이유:
    • return [await this.movieRepository.findAndCount(), await this.movieRepository.count()];: 이 부분은 주석 처리된 이전 코드를 완전히 대체하는 새로운 로직으로 보입니다. findAndCount() 메서드는 데이터베이스에서 조건에 맞는 엔티티 배열과 그 총 개수를 동시에 반환합니다. count() 메서드는 조건 없이 모든 엔티티의 총 개수를 반환합니다. 이 변경의 목적은 아마도 영화 목록과 함께 전체 영화 개수 등의 메타데이터를 함께 제공하기 위함일 수 있습니다. 하지만 바로 아래 if(!title) 조건문에서 다시 find()를 호출하는 것은 논리적으로 불필요해 보입니다.
    • if(!title) 블록 내부: 영화 제목(title)이 제공되지 않았을 경우, 이전에는 단순히 this.movieRepository.find()를 호출하여 모든 영화를 반환했습니다. 현재 코드는 제목이 없을 경우에도 Like 오퍼레이터를 사용하여 모든 제목을 포함하는 (%${title}%이 빈 문자열이 되므로) 검색을 수행합니다. 이는 모든 영화를 조회하는 이전 동작과 유사한 결과를 낼 수 있지만, 굳이 Like 검색을 수행하는 것은 약간 비효율적일 수 있습니다.
    • return this.movies.filter(m=>m.title.startsWith(title));: 이 코드는 여전히 남아있지만, TypeORM을 사용하여 데이터베이스에서 데이터를 가져온 후 다시 메모리 상에서 필터링하는 것은 일반적으로 비효율적인 방식입니다. 데이터베이스 레벨에서 필터링하는 것이 성능상 훨씬 유리합니다. 이 코드는 이전의 메모리 기반 데이터 관리 방식의 잔재일 가능성이 높으며, 제거되거나 TypeORM 쿼리로 통합되어야 할 것으로 보입니다.

요약하자면, 변경된 getManyMovies 함수는 다음과 같은 의도를 가진 것으로 보입니다.

  • 영화 목록과 함께 전체 영화 개수를 반환하려고 시도합니다.
  • 영화 제목으로 검색 기능을 구현하기 위해 Like 오퍼레이터를 사용합니다.

하지만 코드의 논리적인 흐름에 약간의 비효율적인 부분이 남아있습니다.
개선 제안:
getManyMovies 함수는 다음과 같이 수정하는 것이 더 효율적이고 명확해 보입니다.

 
  async getManyMovies(title?: string) {
    const whereCondition = title ? { title: Like(`%${title}%`) } : {};
    const [movies, total] = await this.movieRepository.findAndCount({
      where: whereCondition,
    });
    return [movies, total];
  }

이렇게 수정하면:

  • 제목이 제공되면 해당 제목을 포함하는 영화 목록과 총 개수를 데이터베이스에서 한 번의 쿼리로 가져옵니다.
  • 제목이 제공되지 않으면 모든 영화 목록과 총 개수를 가져옵니다.
  • 메모리 상에서의 추가 필터링은 불필요합니다.

나머지 함수 (getMovieById, createMovie, updateMovie, deleteMovie)는 이전 코드와 큰 차이가 없으므로, TypeORM의 Repository를 사용하여 데이터베이스와 상호작용하는 기본적인 방식을 유지하고 있다고 볼 수 있습니다.


#패스트캠퍼스 #직장인자기계발 #직장인공부 #환급챌린지 #패스트캠퍼스후기 #오공완
https://bit.ly/4hTSJNB

반응형