본문 바로가기
Framekwork/SPRING

[스프링부트] Querydsl 사용 테스트 02 (commnet만 list에 담기)

by 아이엠제니 2024. 3. 9.

 


 

 

 

 

[스프링부트] Querydsl 사용 테스트 01 (댓글 있는 리스트 전체 조회)

Querydsl에 대해 찾아보고, 적용해 본 후? 내가 직접 간단한 설계를 해보고, Querydsl까지 적용해보고 싶다는 생각을 했다. 물론 너무 복잡한 건 아직 무리이다. 그리고 이번에 이 연습을 하면서 느낀

devje.tistory.com

위 게시물의 연장선이다.

동일한 앨범의 댓글은 list에 담아서 출력될 수 있도록 한다.

 

 

 

 

👉 DTO

우선 dto를 변경했다.

 

💾 EntertainmentResponseDto.java

package com.example.querydsltest.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EntertainmentResponseDto {
    private Long enterId;

    private String enterName;

    private String artistName;

    private String albumName;

    private int albumPrice;

    private String placeName;
    
    private List<CommentDto> comment = new ArrayList<>();

}

comment를 list에 담기 위해서, comment 관련 필드만 따로 클래스로 뺐다.

그리고 그 자리에 List 타입의 필드를 만들었다.

 

 

💾 CommentDto.java

package com.example.querydsltest.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CommentDto {

    private String commentUser;

    private String comment;
}

 

추가로 만든 `CommentDto'

 

 

 


👉 Repository

💾 EntertainmantRepositoryImpl.java

 

package com.example.querydsltest.repository;

import com.example.querydsltest.dto.CommentDto;
import com.example.querydsltest.dto.EntertainmentResponseDto;
import com.example.querydsltest.entity.*;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;

import java.util.List;

import static com.querydsl.core.group.GroupBy.list;
import static com.querydsl.core.group.GroupBy.groupBy;

public class EntertainmentRepositoryImpl {

    private final JPAQueryFactory queryFactory;

    public EntertainmentRepositoryImpl(JPAQueryFactory queryFactory) {
        this.queryFactory = queryFactory;
    }

    QEntertainment qEntertainment = QEntertainment.entertainment;
    QArtist qArtist = QArtist.artist;
    QAlbum qAlbum = QAlbum.album;
    QPlace qPlace = QPlace.place;
    QComment qComment = QComment.comment1;

    public List<EntertainmentResponseDto> searchList() {
        List<EntertainmentResponseDto> result = queryFactory
                .from(qEntertainment)
                .innerJoin(qArtist).on(qArtist.enterId.enterId.eq(qEntertainment.enterId))
                .innerJoin(qAlbum).on(qAlbum.artistId.artistId.eq(qArtist.artistId))
                .innerJoin(qPlace).on(qPlace.albumId.albumId.eq(qAlbum.albumId))
                .innerJoin(qComment).on(qComment.placeId.placeId.eq(qPlace.placeId))
                .transform(
                        groupBy(qAlbum.albumId).list(
                                Projections.fields(
                                        EntertainmentResponseDto.class,
                                        qEntertainment.enterId,
                                        qEntertainment.enterName,
                                        qArtist.artistName,
                                        qAlbum.albumName,
                                        qAlbum.albumPrice,
                                        qPlace.placeName,
                                        list(
                                                Projections.fields(
                                                        CommentDto.class,
                                                        qComment.commentUser,
                                                        qComment.comment
                                                )
                                        ).as("comment")
                                )
                        )
                );

        return result;
    }
}

 

그리고 위와 같이 코드를 수정한다.

 

 

Querydsl까지 변경 후!

스프링부트 3.x 버전에서 실행 시, 에러가 난다면!

 

[ERROR] java.lang.Object org.hibernate.ScrollableResults.get(int) (Querydsl transform)

org.springframework.boot spring-boot-starter-parent 3.2.3 17 스프링부트와 자바 버전은 위와 같다. 2024-03-09T20:11:37.815+09:00 ERROR 14104 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatche

devje.tistory.com

위 게시물을 참고한다.

 

 

 


👉 조회

그리고 호출을 해보면!!!

해당 앨범의 댓글은 list에 담겨서 출력이 된다.

전체 출력 결과는 아래에서 확인하면 된다.

 

💽 전체 출력 결과

더보기

 

[
    {
        "enterId": 1,
        "enterName": "SM",
        "artistName": "동방신기",
        "albumName": "Tri-Angle",
        "albumPrice": 12000,
        "placeName": "예스24",
        "comment": [
            {
                "commentUser": "하늘",
                "comment": "최고!!!"
            },
            {
                "commentUser": "미리",
                "comment": "재구매!!!"
            }
        ]
    },
    {
        "enterId": 1,
        "enterName": "SM",
        "artistName": "동방신기",
        "albumName": "MIROTIC",
        "albumPrice": 15000,
        "placeName": "알라딘",
        "comment": [
            {
                "commentUser": "슬기",
                "comment": "멋있어요!!!"
            }
        ]
    },
    {
        "enterId": 2,
        "enterName": "YG",
        "artistName": "빅뱅",
        "albumName": "Stand Up",
        "albumPrice": 14000,
        "placeName": "교보문고",
        "comment": [
            {
                "commentUser": "홍",
                "comment": "짱!!!"
            }
        ]
    },
    {
        "enterId": 2,
        "enterName": "YG",
        "artistName": "빅뱅",
        "albumName": "Bigbang Vol.1",
        "albumPrice": 13000,
        "placeName": "예스24",
        "comment": [
            {
                "commentUser": "민",
                "comment": "와우!!!"
            }
        ]
    },
    {
        "enterId": 3,
        "enterName": "JYP",
        "artistName": "데이식스",
        "albumName": "Every DAY6 February",
        "albumPrice": 15000,
        "placeName": "알라딘",
        "comment": [
            {
                "commentUser": "종이",
                "comment": "최고네요!!!"
            }
        ]
    },
    {
        "enterId": 3,
        "enterName": "JYP",
        "artistName": "데이식스",
        "albumName": "The Book of Us : Gravity",
        "albumPrice": 10000,
        "placeName": "교보문고",
        "comment": [
            {
                "commentUser": "제인",
                "comment": "닥치고 구매!!!"
            },
            {
                "commentUser": "데이",
                "comment": "미쳤다!!!"
            }
        ]
    },
    {
        "enterId": 4,
        "enterName": "하이브",
        "artistName": "방탄소년단",
        "albumName": "화양연화 Young Forever",
        "albumPrice": 13000,
        "placeName": "예스24",
        "comment": [
            {
                "commentUser": "미나",
                "comment": "귀호강!!!"
            }
        ]
    },
    {
        "enterId": 4,
        "enterName": "하이브",
        "artistName": "방탄소년단",
        "albumName": "WINGS",
        "albumPrice": 12000,
        "placeName": "알라딘",
        "comment": [
            {
                "commentUser": "큘라",
                "comment": "재구매 각!!!"
            }
        ]
    }
]

 

 

근데  작성을 하다 보니, 구입처 부분이 이상한 걸 발견했다.

placeName 이 같은데도 계속 pk가 늘어난다..

이건 추후에 수정할 수 있도록 해야겠다.

 

 

 

 

300x250