Nestjs/TypeORM /QueryBuilder를 사용해야 하는 이유

25gStroy·2022년 2월 2일
0

Nest.js

목록 보기
20/23

QueryBuilder를 사용해야 하는 이유

저는 ORM기술을 springboot에 JPA부터 배워서 그런지처음에 typeorm문서를 읽어봤을때 쿼리빌더를 쓰면 생산성이 너무 떨어지지 않을까...? 하는 막연한 마음에 대충보고 넘어갔었는데 이게 나중에 문제를 불러올줄은 꿈에도 몰랐다.

DB관계가 복잡해 질수록 메서드들이 사용이 안된다...

처음에 1:N의 user와 board관계가 있었는데 board에 댓글기능을 넣고 싶어서 comment라는 entity를 하나 더 만들었더니 원래 잘 되던 save나 createm,find가 도저히 먹히질 않았다.
이유를 알아보니 관계를 맺은 특정 테이블을 조회하기 위해서는 직접 쿼리빌더로 쿼리를 작성해서 날려야 한다는 것이였다.
그래서 comment는 user와 board를 모두 n:1의 관계를 가지고 있었기때문에 관련된 userRepo.save나 boardRepo.save가 다 먹통이 돼서 관련된 모든 api들이 먹통이 된것이다.... (전부 쿼리빌더로 리펙터링,,,,해야했다..)
TypeORM을 사용할때는 웬만하면 쿼리빌더로 해서 사용하는것이 정신건강에 이롭다

QueryBuilder RUD 예제

import {getConnection} from "typeorm";

const user = await getConnection()
    .createQueryBuilder()
    .select("user")
    .from(User, "user")
    .where("user.id = :id", { id: 1 })
    .getOne();
    
    
// Insert
import {getConnection} from "typeorm";

await getConnection()
    .createQueryBuilder()
    .insert()
    .into(User)
    .values([
        { firstName: "Timber", lastName: "Saw" },
        { firstName: "Phantom", lastName: "Lancer" }
     ])
    .execute();
    
// Update
import {getConnection} from "typeorm";

await getConnection()
    .createQueryBuilder()
    .update(User)
    .set({ firstName: "Timber", lastName: "Saw" })
    .where("id = :id", { id: 1 })
    .execute();
    
    
// Delete
import {getConnection} from "typeorm";

await getConnection()
    .createQueryBuilder()
    .delete()
    .from(User)
    .where("id = :id", { id: 1 })
    .execute();
profile
애기 개발자

0개의 댓글