Nest.js를 공부하며 조그만한 프로젝트를 진행하였고, 중간 점검에서 받은 피드백 중 update 로직이 비효율적이라는 지적을 받았다. 이를 수정한 내용을 기록한다.
inventory.entity.ts : 인벤토리 엔티티는 아래와 같이 작성되었다.
inventory.controller.ts 와 inventory.service.tsinventory의 속성 값을 바꾸는 도메인이 모두 분리되어 있다.service를 보면 update 로직에서 코드의 중복이 남발하는 것이 보인다.
Body에서 받은 컬럼값들을 DTO로 포장하고, 수정이 필요해 입력이 들어온 속성들만 값을 변경해보자!UserEtcUpdateDto : 속성에는 ?를 붙여 필수가 아니도록 하였다.
inventory.controller.ts 와 inventory.service.tsservice에서는 매개 변수로 받은 DTO로부터 비구조화 할당으로 속성 값들을 저장하고, null이 아니면 값을 수정하도록 하였다.
Body에 작성한 속성 값만 수정됨을 확인할 수 있다.
다만, 이 코드도 비효율적이다.
만약inventory의 컬럼들이 100개가 넘는다면? DTO의 컬럼도 100개가 될 뿐더러,
null임을 체크하는 조건문도 100개가 되니 코드의 중복이 엄청나다.→ 따라서 typeORM의 쿼리 빌더를 이용해 작성해보자!
UpdateInventoryDto에 generateChanges() 추가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()로 변경 로직을 시행한다.
아직 한참 부족한 실력인게, 강의 영상에 나오지 않은 방법들을 혼자 해내지 못하는 데에 있어서 많이 느낀다.
물론 급하게 배운 감도 있을지라도, 모르는 게 있을 때 검색을 잘 하는 방법도 꽤나 필요한 능력인 것 같다. 기죽지 말고 열심히 해보자.
잘보고갑니다~