• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

stream이 아닌 querydsl transform을 이용하는 방법에대한 문의

22.04.15 12:21 작성 조회수 4.68k

1

안녕하세요
 
8:30초대 강의를 보면
1:N관계의 list형태를 mapping하기 위해
 
flats
.stream
~
.collect ~ 형태를 이용하고 있는데요
 
실무에서도 비슷한 사례가있어, 처음에 강사님처럼 어플리케이션단에 코드를 짰다가, 코드가 너무 복잡해져서
 
QueryDsl에서 transform + GroupBy.list를 이용하는식으로 변경해봤는데요. (아래 예시참조)


                from(Entity)
                //  1:N 관계의 List<Object> 를 추출, key : Entity.Id
                .transform(
                        groupBy(Entity.Id)
                            .list(
                                    Projections.fields(Example.class,
                                           Entity.Id,
                                            list(
                                                    Projections.fields(Detail.class,
                                                            Detail.id
                                                            Detail.name
                                                    )
                                            ).as("DetailList")
                                    )
                            )
                )
 
 
 
 
문제는 구글링을 해보니, 해당 방식이 쿼리결과를 memory에서 리스트형태로 만들어내는것이라고 하더라구요.
 
 
예전에 강사님의 강의에서 '컬렉션 fetch join은 페이징을 이용할 수 없다'는 내용을 설명해주실 때, 해당 동작이 메모리에서 일어나기때문에 OOM이 발생할 수 있다 라고 말씀해주셨는데
 
이와 마찬가지로 transform , Groupby.list를 이용하는 것 역시 문제가 발생할까봐 우려스럽네요
 
아래 두가지 질문에 답변 부탁드립니다.
 
Q1)
강사님의 application단에서 짜는 방식이 나을지
아니면 querydsl단에서 transform & Groupby.list를 이용하는게 나을지 고민되는데
두가지 방법중 무엇을 선택하는게 좋을까요?
후자의 경우 OOM이 발생하지는 않을지도 궁금합니다..
 
Q2)
memory에서 작업하는게 위험한 이유가 뭔가요?
강사님처럼 application단에서 로직을 수행하는것도 memory에서 동작하는것 아닌가요?
 
 
친절하고 유익한 강의 늘 감사드립니다. 답변 부탁드립니다!
 
 
 
 

답변 1

답변을 작성해보세요.

4

안녕하세요. 코딩의신님

Q1 - 이와 마찬가지로 transform , Groupby.list를 이용하는 것 역시 문제가 발생할까봐 우려스럽네요.

-> 이 부분은 실제 실행되는 쿼리를 눈으로 확인해보시는 과정이 필요합니다. 그래서 어느 부분까지 쿼리가 실행되는지 확인하셔야 합니다.

Q2 - 메모리에서 작업을 진행해도 됩니다. 그런데 메모리에서 진행할 때는 DB -> 애플리케이션으로 데이터를 퍼올려야 하기 때문에 메모리 사용량이 매우 증가할 수 있습니다. 그래서 최대한 DB에서 조회 가능 데이터를 줄여서 조회하는 것이 성능상 바람직한 방향입니다. 실시간 애플리케이션에서 메모리에 수십건 정도를 처리하는 것은 크게 문제가 없지만, 수백, 수천건을 처리한다면 성능상 문제가 발생할 수 있습니다.

감사합니다.