[Nest.js] TypeORM QueryBuilder의 5가지 실행 타입과 주요 메서드 이야기

궁금하면 500원·2024년 8월 12일
0

TypeORM의 QueryBuilder는 데이터베이스 쿼리를 프로그램matically(코드로) 작성할 수 있게
해주는 도구입니다.
복잡한 쿼리, 조인, 조건 등을 동적으로 생성하는 데 유용합니다.

사이드프로젝트에 QueryBuilder 사용하면서
이해하고자 주요 기능과 실행 타입, 그리고 몇 가지 메서드에 대해 정리할려고합니다.

1.QueryBuilder???

TypeORM의 Repository와 EntityManager에서 제공되며, SQL 쿼리를 동적으로 생성하고 실행할 수 있는 기능을 제공합니다.

복잡한 쿼리, 조건, 조인 등을 처리할 때 유용합니다.

2. QueryBuilder의 5가지 실행 타입

1. select()

데이터베이스에서 데이터를 조회합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .select(['user.id', 'user.name'])
  .getMany();

2. insert()

데이터베이스에 데이터를 삽입합니다.

예제 코드:

await this.userRepository.createQueryBuilder()
  .insert()
  .into(User)
  .values([
    { name: 'John Doe', email: 'john.doe@example.com' },
    { name: 'Jane Doe', email: 'jane.doe@example.com' }
  ])
  .execute();

3. update()

데이터베이스의 데이터를 수정합니다.

예제 코드:

await this.userRepository.createQueryBuilder()
  .update(User)
  .set({ name: 'Updated Name' })
  .where('id = :id', { id: 1 })
  .execute();

4. delete()

데이터베이스에서 데이터를 삭제합니다.

예제 코드:

await this.userRepository.createQueryBuilder()
  .delete()
  .from(User)
  .where('id = :id', { id: 1 })
  .execute();

5. relations()

관계가 설정된 엔티티와 함께 데이터를 조회합니다. (주로 find와 함께 사용)

예제 코드:

const usersWithPosts = await this.userRepository.createQueryBuilder('user')
  .leftJoinAndSelect('user.posts', 'post')
  .getMany();

3. 주요 메서드 설명

1. getOne()

쿼리의 결과로 하나의 엔티티를 반환합니다.

예제 코드:

const user = await this.userRepository.createQueryBuilder('user')
  .where('user.id = :id', { id: 1 })
  .getOne();

2. getMany()

쿼리의 결과로 여러 엔티티를 반환합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .where('user.age > :age', { age: 25 })
  .getMany();

3. select()

쿼리에서 선택할 컬럼을 지정합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .select(['user.id', 'user.name'])
  .getMany();

4. where()

쿼리의 조건을 지정합니다.

예제 코드:

const user = await this.userRepository.createQueryBuilder('user')
  .where('user.name = :name', { name: 'John' })
  .getOne();

5. orderBy()

쿼리 결과를 정렬합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .orderBy('user.name', 'ASC')
  .getMany();

6. skip()

쿼리 결과에서 특정 개수만큼 건너뜁니다. 페이지네이션에 유용합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .skip(10)
  .take(5)
  .getMany();

7. take()

쿼리 결과에서 특정 개수만큼 가져옵니다. 페이지네이션에 유용합니다.

예제 코드:

const users = await this.userRepository.createQueryBuilder('user')
  .take(5)
  .getMany();

8. join()

다른 엔티티와 조인합니다.

예제 코드:

const usersWithPosts = await this.userRepository.createQueryBuilder('user')
  .innerJoin('user.posts', 'post')
  .select(['user', 'post'])
  .getMany();

9. leftJoin(), leftJoinAndSelect()

왼쪽 조인을 수행합니다. leftJoinAndSelect는 조인된 엔티티도 결과에 포함합니다.

예제 코드:

const usersWithPosts = await this.userRepository.createQueryBuilder('user')
  .leftJoinAndSelect('user.posts', 'post')
  .getMany();

10. aggregate()

쿼리에서 집계 함수를 사용합니다.

예제 코드:

const count = await this.userRepository.createQueryBuilder('user')
  .select('COUNT(user.id)', 'count')
  .getRawOne();

11. subQuery()

서브쿼리를 생성합니다.

예제 코드:

const subQuery = this.userRepository.createQueryBuilder('user')
  .select('user.id')
  .where('user.age > :age', { age: 30 })
  .getQuery();

const users = await this.userRepository.createQueryBuilder('user')
  .where(`user.id IN (${subQuery})`)
  .getMany();

이 메서드들을 활용하면 복잡한 쿼리도 효율적으로 작성할 수 있습니다.

QueryBuilder를 활용하여 동적인 쿼리를 작성하고,
다양한 조건과 조인을 통해 원하는 데이터를 정확히 얻을 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글