개발일지/2023_한이음

[개발] Querydsl을 사용하여 학교 좋아요 리스트 반환하기

기억지기 개발자 2023. 7. 19. 11:54

성공한 실제 반환 값.

유저의 토큰을 header에 넣으면 해당 유저가 누른 

  • 좋아요 id (heart 테이블)
  • 좋아요 한 학교의 schoolId (heart 테이블)
  • 좋아요 누른 학교의 이름 (school 테이블)
  • 좋아요 누른 학교의 학생수 (user 테이블)
    🔜 우리 웹 사이트에 있는 해당 학교의 유저수를 의미함.
    🔜 user정보에 재학 중인 schoolId가 있음.
  • 좋아요 누른 학교의 태그 (tag 테이블)
    🔜 지난번에 포스팅 했지만 tag테이블과 school 테이블은 조인 관계를 맺고 있지 않다.

<<내가 생각한 query 로직>>

  1. 매개변수로 userId가 들어온다,
  2. 그 heart 테이블에 있는 Id 값과 schoolId 값을 차례대로(쌍으로) 조회한다.
  3. 그 schoolId를 가지고 school 테이블에서 schoolName을 조회한다.
  4. 그 schoolId를 가지고 user 테이블에 동일한 schoolId를 가진 user 수를 count(정수) 한다.
  5. 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 반환하는 코드 보고 응용해서 뚝딱 해결했다ㅎㅎ