개발일지/2023_한이음
[개발] Querydsl을 사용하여 학교 좋아요 리스트 반환하기
기억지기 개발자
2023. 7. 19. 11:54
유저의 토큰을 header에 넣으면 해당 유저가 누른
- 좋아요 id (heart 테이블)
- 좋아요 한 학교의 schoolId (heart 테이블)
- 좋아요 누른 학교의 이름 (school 테이블)
- 좋아요 누른 학교의 학생수 (user 테이블)
🔜 우리 웹 사이트에 있는 해당 학교의 유저수를 의미함.
🔜 user정보에 재학 중인 schoolId가 있음. - 좋아요 누른 학교의 태그 (tag 테이블)
🔜 지난번에 포스팅 했지만 tag테이블과 school 테이블은 조인 관계를 맺고 있지 않다.
<<내가 생각한 query 로직>>
- 매개변수로 userId가 들어온다,
- 그 heart 테이블에 있는 Id 값과 schoolId 값을 차례대로(쌍으로) 조회한다.
- 그 schoolId를 가지고 school 테이블에서 schoolName을 조회한다.
- 그 schoolId를 가지고 user 테이블에 동일한 schoolId를 가진 user 수를 count(정수) 한다.
- schoolId를 가지고 tag 테이블에 가서 그 값을 가진 컬럼에 모든 Name을 조회한다.
🔺 여기서 포인트는 같은 schoolId를 가진 정보는 하나의 DTO에(객체에) 담겨서 반환되어야 한다.
public ResponseDTO<?> findAll(Long userId) {
QSchool school = QSchool.school;
QTag tag = QTag.tag;
QUser user = QUser.user;
hanium.highwayspring.school.heart.QHeart qHeart = hanium.highwayspring.school.heart.QHeart.heart;
List<SchoolHeartDTO> schoolHeartDTOList = jpaQueryFactory
.selectFrom(qHeart)
.where(qHeart.user.id.eq(userId))
.leftJoin(tag).on(tag.schoolId.eq(qHeart.school.id))
.leftJoin(user).on(user.schoolId.id.eq(qHeart.school.id))
.leftJoin(school).on(school.id.eq(qHeart.school.id))
.groupBy(qHeart.id, qHeart.school.id, school.schoolName, tag.name)
.transform(GroupBy.groupBy(qHeart.id).list(Projections.constructor(
SchoolHeartDTO.class,
qHeart.id,
qHeart.school.id,
school.schoolName,
user.schoolId.id.count().intValue(),
GroupBy.list(tag.name)
)));
return ResponseDTO.success(schoolHeartDTOList);
}
다른 거 도움 안 받고 지난번에 만들어 놓은 school List 반환하는 코드 보고 응용해서 뚝딱 해결했다ㅎㅎ
