ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [typeORM] typeORM 넘어져보기 (상속된 엔터티에서쿼리빌더 사용)
    데이터베이스/typeORM 2023. 6. 1. 12:40

     


    시작하며

    현재 모든 엔터티의 구조는 CoreEntity를 상속하고 있고, CoreEntity의 Column은 id, createdAt, updatedAt, deletedAt으로 구성되어 있습니다. typeORM를 사용하면서 다양한 방식으로 사용하는 방법을 기록하려 합니다.

     

     


    마주친 문제

    Product와 RewardSetting 엔터티는 1:1 관계를 맺고 있고, Product 테이블의 mall_id 칼럼은 RewardSetting의 id의 칼럼과 물려있습니다. 구현사항은 Product가 softdelete 되었을 때, RewardSetting도 함께 softdelete 되는 기능을 구현하던 중 쿼리에서 select를 2번 사용하는 현상이 발생했고, 쿼리 빌더를 사용했을 때 예상치 못한 에러를 맞닥트렸습니다. 이후, 공식 문서를 살펴보면서 해결한 방법과 제가 느낀 점을 기술하려 합니다.

     


     

    문제의 코드1 )

    select를 2번 사용하고 있어 성능상 좋지 않을 거라 판단하여 쿼리빌더로 다시 구현해 보았습니다.

     


     

    문제의 코드 2)

     

    Argument of type '{ isDeleted: () => string; "rewardSetting.isDeleted": () => string; }' is not assignable to parameter of type '_QueryDeepPartialEntity<Product>'.
 Object literal may only specify known properties, and '"rewardSetting.isDeleted"' does not exist in type '_QueryDeepPartialEntity<Product>'.

    해당 함수의 에러는 아래와 같습니다.

    Argument of type '{ isDeleted: () => string; "rewardSetting.isDeleted": () => string; }' is not assignable to parameter of type '_QueryDeepPartialEntity<Product>'.
      Object literal may only specify known properties, and '"rewardSetting.isDeleted"' does not exist in type '_QueryDeepPartialEntity<Product>'.

    해당 에러를 검색한 결과 set함수는 동적으로 값을 설정할 수 없어 에러가 난다고 생각했습니다. (아직 정확하게 에러가 나는 이유를 정확하게 모르지만, 나중에 더 찾아봐야 할 것 같다). 아마 외래키인 값을 설정하려고 해서 에러가 났다고 생각한다.....ㅜㅜ

     


     

    해결코드 )

     

    그렇다면 내가 raw query로 직접 작성해서 쿼리를 날릴 수 있지 않을까? 라는 질문에 공식 문서를 찾던 도중 dataSource를 사용하여 raw query를 사용할 수 있는 방법을 알게 되었습니다다.

    select를 줄일 수 있었을 뿐만 아니라 문제의 코드1)에서 48ms보다 더 빠른 15ms를 기록한 것을 볼 수 있습니다. 물론 많은 성능 차이가 없을거로 생각하지만 유의미한 결과를 낼 수 있었습니다.

     

     


    마치며

    지금 하는 프로젝트는 모든 엔터티가 CoreEntity를 상속하고 있어 수정을 할 수 있지만, 이것 또한 경험이고 넘어져 봐야 뛸 수 있듯이 넘어져 보려합니다. 다양한 방법을 쓸수 있다는 사실을 알고 이후에 같은 문제가 있을 때, 지금의 고민과 기록이 개발시간을 앞당겨 줄 거라 믿고 있습니다. 무엇이 정확한 방법일까? 무엇이 더 좋은 코드일까? 정답은 없다고 생각합니다. 계속 고민하고 알아가고 그 과정속에서 즐거움을 느끼며 성장하는 개발자가 되고 싶습니다.

Designed by Tistory.