😎 1. Query Builder란?
✅ TypeORM에서 제공하는 기능으로, SQL 쿼리를 통해 데이터베이스와 상호작용 할 수 있는 기능이다.
Repository(기본 메서드)와 차이점
Repository
는 단순한 CRUD 작업에 적합하며, 가독성이 좋고 빠르게 사용할 수 있다.
QueryBuilder
는 복잡한 SQL 쿼리를 작성하거나 동적 쿼리를 구성할 때 사용한다.
👌 사용 방법
1. 단순 사용
import { Injectable } from '@nestjs/common';
import { Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>,
) {}
async getUsers() {
const queryBuilder = this.userRepository.createQueryBuilder('user');
return queryBuilder.getMany();
}
}
Repository
에 createQueryBuilder
를 생성해서 ()안에 테이블을 명시한다.
getMany
메서드로 쿼리를 실행한다.
2. 정렬과 페이징
async getPaginatedUsers(skip: number, take: number) {
return this.userRepository
.createQueryBuilder('user')
.orderBy('user.createdAt', 'DESC')
.skip(skip)
.take(take)
.getMany();
}
orderBy
로 정렬 조건을 추가한다 두번째 인자에는 ASC
or DESC
를 입력한다.
skip
과 take
를 사용해서 페이징한다.
3. 릴레이션
async getUsersWithProfile() {
return this.userRepository
.createQueryBuilder('user')
.leftJoinAndSelect('user.profile', 'profile')
.getMany();
}
leftJoinAndSelect
로 user
와 profile
관계 데이터를 함께 가져온다.
4. 여러 조건
async getFilteredUsers(name: string, isActive: boolean) {
return this.userRepository
.createQueryBuilder('user')
.where('user.name = :name', { name })
.andWhere('user.isActive = :isActive', { isActive })
.getMany();
}
where
와 andWhere
로 여러 조건을 걸어서 필터링해서 값을 가져온다.
참조