[Nest.js] typeORM 쿼리빌더를 이용해 동적쿼리 작성하기

이동엽·2022년 11월 6일
2

nestjs

목록 보기
3/3

Nest.js를 공부하며 조그만한 프로젝트를 진행하였고, 중간 점검에서 받은 피드백 중 update 로직이 비효율적이라는 지적을 받았다. 이를 수정한 내용을 기록한다.


변경 전, 기존 코드들

  • inventory.entity.ts : 인벤토리 엔티티는 아래와 같이 작성되었다.

  • inventory.controller.tsinventory.service.ts
    • 기존의 작성한 코드를 보면, inventory의 속성 값을 바꾸는 도메인이 모두 분리되어 있다.
    • 또한 service를 보면 update 로직에서 코드의 중복이 남발하는 것이 보인다.


💡 첫번째 수정사항! → DTO 이용하기

  • Body에서 받은 컬럼값들을 DTO로 포장하고, 수정이 필요해 입력이 들어온 속성들만 값을 변경해보자!
    • UserEtcUpdateDto : 속성에는 ?를 붙여 필수가 아니도록 하였다.

  • DTO를 적용한 inventory.controller.tsinventory.service.ts
    • service에서는 매개 변수로 받은 DTO로부터 비구조화 할당으로 속성 값들을 저장하고, null이 아니면 값을 수정하도록 하였다.

  • 실행 결과
    • Body에 작성한 속성 값만 수정됨을 확인할 수 있다.

다만, 이 코드도 비효율적이다.
만약 inventory의 컬럼들이 100개가 넘는다면? DTO의 컬럼도 100개가 될 뿐더러,
null임을 체크하는 조건문도 100개가 되니 코드의 중복이 엄청나다.

→ 따라서 typeORM의 쿼리 빌더를 이용해 작성해보자!


💡 두번째 수정사항! → 쿼리빌더 이용하기

  • 사실 쿼리빌더는 모든 인벤토리를 조회하는 기능에 사용한 적이 있다.
    • 단, 강의 영상을 보고 따라했기에 직접 활용할만큼의 이해도는 부족했다.
    • 어쨌든 공식 문서를 참고하여 수정하는 로직에도 적용해보자!!

  • 첫번째 수정사항에서 작성했던 UpdateInventoryDtogenerateChanges() 추가
    • 이후에 호출될 경우, 요청과 함께 들어온 속성들을 반환한다.
import { InventoryStatus } from '../inventory-status.enum';

export class UpdateInventoryDto {
  status?: InventoryStatus;
  description?: string;
  manufacturer?: string;

  generateChanges(): object {
    return {
      status: this.status.toString(),
      description: this.description,
      manufacturer: this.manufacturer,
    };
  }
}

  • 이후 inventory.service.ts에서 update 로직을 아래와 같이 수정하였다.
    • 첫번재 수정사항과 다르게, if문으로 null을 체크하지 않는다.
    • createQueryBuilder()를 이용해 쿼리 빌더를 생성하고, update를 시행한다.
    • 변경 사항은 방금 위에서 작성한 generateChanges() 메소드로 입력한다.
    • id를 비교하여, 변경할 인벤토리를 선별한다.
    • 마지막으로 execute()로 변경 로직을 시행한다.

아직 한참 부족한 실력인게, 강의 영상에 나오지 않은 방법들을 혼자 해내지 못하는 데에 있어서 많이 느낀다.
물론 급하게 배운 감도 있을지라도, 모르는 게 있을 때 검색을 잘 하는 방법도 꽤나 필요한 능력인 것 같다. 기죽지 말고 열심히 해보자.

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

1개의 댓글

comment-user-thumbnail
2022년 11월 9일

잘보고갑니다~

답글 달기