프로젝트에서 사진 추천 기능을 구현하면서 사용했던 쿼리에 대해서 복습하면서 정리하도록 하겠다
코드를 먼저 보자
async getRecommendPhoto(id: number): Promise<Photo[]> {
const userPhoto = await this.photoRepository.findOne({ where: { id }, relations: { photoKeywords: true } });
const userPhotoKeywords = userPhoto?.photoKeywords.map((k) => k.id);
return this.photoRepository
.createQueryBuilder('photo')
.leftJoinAndSelect('photo.photoKeywords', 'keywords')
.leftJoinAndSelect('photo.photospot', 'photospot')
.leftJoinAndSelect('photospot.collection', 'collection')
.select(['photo.id', 'photo.image', 'photospot.id', 'collection.id'])
.where('keywords.id IN (:...userPhotoKeywords)', { userPhotoKeywords })
.andWhere('photo.id != :id', { id })
.groupBy('photo.id')
.orderBy('COUNT(photo.id)', 'DESC')
.limit(5)
.getMany();
}
포토 아이디를 받아서 포토를 가져와 map을 이용해서 리스트로 만든다
사진을 뽑아오기 때문에 photoRepository에서 photo라는 별칭으로 쿼리빌더를 생성한다
키워드를 비교해야 하기 때문에 photoKeywords와 콜렉션으로 이동시켜야 하기 때문에 photospot과 collection을 조인해서 모든 속성을 선택합니다 그 후 아이디와 이미지를 가져오고 포토스팟 아이디와 콜렉션 아이디를 선택한다 여기서 포토스팟을 선택하는 이유는 photo -> photospot -> collection으로 관계를 타고 올라가 collection.id를 가져오기 때문에 선택해야 했다 그 후 where 문을 이용해서 userPhotoKeywords에 있는 사진들만 필터링합니다
IN을 사용하는 예시이다 조금 더 이해하기 쉽게 참고하자
그 후 groupBy를 이용해서 photo.id를 그룹화시키고 orderBy를 통해서 photo.id의 개수 기준으로 내림차순으로 정렬한다
예시를 보면 이런 식으로 정렬되는 것을 볼 수 있다
그 후 5개만 선택하도록 limit을 5로 걸어서 제한하고 getMany로 쿼리를 실행하고 여러 개 사진을 가져온다
추가 쿼리빌더를 사용하면서 getMany()와 getRawMany()를 계속 헷갈렸다
간단하게 설명해 보도록 하겠다
getMany()는 엔티티 형태의 인스턴스로 반환되어 인스턴스 속성을 수정하며
getRawMany()는 엔티티 현태가 아니라 그냥 데이터베이스의 데이터를 객체형태로 반환된다
'과거공부모음' 카테고리의 다른 글
node.js 콜백(callback) (0) | 2023.04.13 |
---|---|
Nest.js log를 파일로 만들어서 관리 (logging) (0) | 2023.04.02 |
Nest.js에서 Google Vision API 사용하기 (0) | 2023.04.01 |
Nest.js에서 이미지를 S3에 업로드 (0) | 2023.04.01 |
Nest.js에서 Multer를 이용해 여러 장의 이미지 파일 관리 (0) | 2023.04.01 |