TypeORM의 QueryBuilder는 데이터베이스 쿼리를 프로그램matically(코드로) 작성할 수 있게
해주는 도구입니다.
복잡한 쿼리, 조인, 조건 등을 동적으로 생성하는 데 유용합니다.
사이드프로젝트에 QueryBuilder 사용하면서
이해하고자 주요 기능과 실행 타입, 그리고 몇 가지 메서드에 대해 정리할려고합니다.
TypeORM의 Repository와 EntityManager에서 제공되며, SQL 쿼리를 동적으로 생성하고 실행할 수 있는 기능을 제공합니다.
복잡한 쿼리, 조건, 조인 등을 처리할 때 유용합니다.
데이터베이스에서 데이터를 조회합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.select(['user.id', 'user.name'])
.getMany();
데이터베이스에 데이터를 삽입합니다.
예제 코드:
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();
데이터베이스의 데이터를 수정합니다.
예제 코드:
await this.userRepository.createQueryBuilder()
.update(User)
.set({ name: 'Updated Name' })
.where('id = :id', { id: 1 })
.execute();
데이터베이스에서 데이터를 삭제합니다.
예제 코드:
await this.userRepository.createQueryBuilder()
.delete()
.from(User)
.where('id = :id', { id: 1 })
.execute();
관계가 설정된 엔티티와 함께 데이터를 조회합니다. (주로 find와 함께 사용)
예제 코드:
const usersWithPosts = await this.userRepository.createQueryBuilder('user')
.leftJoinAndSelect('user.posts', 'post')
.getMany();
쿼리의 결과로 하나의 엔티티를 반환합니다.
예제 코드:
const user = await this.userRepository.createQueryBuilder('user')
.where('user.id = :id', { id: 1 })
.getOne();
쿼리의 결과로 여러 엔티티를 반환합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.where('user.age > :age', { age: 25 })
.getMany();
쿼리에서 선택할 컬럼을 지정합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.select(['user.id', 'user.name'])
.getMany();
쿼리의 조건을 지정합니다.
예제 코드:
const user = await this.userRepository.createQueryBuilder('user')
.where('user.name = :name', { name: 'John' })
.getOne();
쿼리 결과를 정렬합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.orderBy('user.name', 'ASC')
.getMany();
쿼리 결과에서 특정 개수만큼 건너뜁니다. 페이지네이션에 유용합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.skip(10)
.take(5)
.getMany();
쿼리 결과에서 특정 개수만큼 가져옵니다. 페이지네이션에 유용합니다.
예제 코드:
const users = await this.userRepository.createQueryBuilder('user')
.take(5)
.getMany();
다른 엔티티와 조인합니다.
예제 코드:
const usersWithPosts = await this.userRepository.createQueryBuilder('user')
.innerJoin('user.posts', 'post')
.select(['user', 'post'])
.getMany();
왼쪽 조인을 수행합니다. leftJoinAndSelect는 조인된 엔티티도 결과에 포함합니다.
예제 코드:
const usersWithPosts = await this.userRepository.createQueryBuilder('user')
.leftJoinAndSelect('user.posts', 'post')
.getMany();
쿼리에서 집계 함수를 사용합니다.
예제 코드:
const count = await this.userRepository.createQueryBuilder('user')
.select('COUNT(user.id)', 'count')
.getRawOne();
서브쿼리를 생성합니다.
예제 코드:
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를 활용하여 동적인 쿼리를 작성하고,
다양한 조건과 조인을 통해 원하는 데이터를 정확히 얻을 수 있습니다.