저는 ORM기술을 springboot에 JPA부터 배워서 그런지처음에 typeorm문서를 읽어봤을때 쿼리빌더를 쓰면 생산성이 너무 떨어지지 않을까...? 하는 막연한 마음에 대충보고 넘어갔었는데 이게 나중에 문제를 불러올줄은 꿈에도 몰랐다.
처음에 1:N의 user와 board관계가 있었는데 board에 댓글기능을 넣고 싶어서 comment라는 entity를 하나 더 만들었더니 원래 잘 되던 save나 createm,find가 도저히 먹히질 않았다.
이유를 알아보니 관계를 맺은 특정 테이블을 조회하기 위해서는 직접 쿼리빌더로 쿼리를 작성해서 날려야 한다는 것이였다.
그래서 comment는 user와 board를 모두 n:1의 관계를 가지고 있었기때문에 관련된 userRepo.save나 boardRepo.save가 다 먹통이 돼서 관련된 모든 api들이 먹통이 된것이다.... (전부 쿼리빌더로 리펙터링,,,,해야했다..)
TypeORM을 사용할때는 웬만하면 쿼리빌더로 해서 사용하는것이 정신건강에 이롭다
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();