인프런 커뮤니티 질문&답변

김동민님의 프로필 이미지

작성한 질문수

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

common.service.ts-composeFindOptions

해결된 질문

24.08.08 12:56 작성

·

50

0

private composeFindOptions<T extends BaseModel>(
    dto: BasePaginationDto,
  ): FindManyOptions<T> {
    /**
     * where, order, take, skip 반환
     * skip-> page based pagination에서만
     */
    /**
     * DTO의 현재 생긴 구조는 아래와 같다.
     *
     * {
     *  where__id__more_than: 1,
     *  order__createdAt: 'ASC,
     * }
     *
     * 현재는 where__id__more_than / where__id__less_than에 해당하는 where 필터만 사용중이지만
     * 나중에 추가적인 where 필터를 넣고싶어졌을 때 모든 where 필터를 자동으로 파싱할 수 있을만한 기능이
     * 필요하다..
     *
     * 1) where로 시작한다면 필터 로직을 적용
     * 2) order로 시작한다면 정렬 로직을 정용한다.
     * 3) 필터 로직을 적용한다면 '__' 기준으로 split 했을 때 3개의 값으로 나뉘는지 2개인지 확인한다.
     *      3-1) 3개의 값으로 나뉜다면 FILTER_MAPPER에서 해당되는 operator 함수를 찾아서 적용한다.
     *          ex) ['where', 'id', 'more_than'] -> more_than을 실제 typeorm-operator로 적용
     *      3-2) 2개의 값으로 나뉜다면 정확한 값을 필터하는 것이기 때문에 operator 없이 적용한다.
     *          ex) ['order', 'createdAt'] -> operator 필요 X
     * 4) order의 경우 3-2와 같이 적용한다.
     */

    let where: FindOptionsWhere<T> = {};
    let order: FindOptionsOrder<T> = {};

    for (const [key, value] of Object.entries(dto)) {
      if (key.startsWith('where__')) {
        where = {
          ...where,
          ...this.parseWhereFilter(key, value),
        };
      } else if (key.startsWith('order__')) {
        order = {
          ...order,
          ...this.parseWhereFilter(key, value),
        };
      }
    }

    return {
      where,
      order,
      take: dto.take,
      skip: dto.page ? dto.take * (dto.page - 1) : null,
    };
  }

여기서 함수가 실행되면 where, order은 빈 객체로 초기화 되는데 왜 for 문 안에선 ...where, ...order을 해주는건가요?

 

 

답변 1

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

2024. 08. 09. 10:05

안녕하세요!

좋은 practise라고 생각하시면 될 것 같습니다.

지금은 빈 객체지만 나중에 그렇지 않을수도 있고 어쨋든 목적은 where와 order를 모두 그대로 옮겨주는 것이기 때문에 그렇습니다.

감사합니다!