Search
Duplicate
😲

repository 호출을 추가했을 때 더 빨라지는 응답

분야
BE
ISSUE
주제
BE
DB
심각도
낮음🤒
제보자
담당자
작성자
상태
처리 중
이슈링크(optional)
작성일자
2023/09/01 14:14
공개여부
공개
글감

문제 상황

기존의 코드에 repository에서 단순히 다른 것을 더 호출하는 로직이 생겼는데도 불구하고, 응답 속도가 갑자기 빨라졌다.

재현 환경

// 100명 평균 1200ms public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); // 100명 평균 57ms public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { List<Block> blocks = blockRepository.findAllByMemberIdToList(loginUserId); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .filter(board -> blocks.stream().parallel().noneMatch( block -> block.getTo().getId().equals(board.getMember().getId()))) .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
이 경우, filtering을 하지 않고도 blocks에 findAllBy…를 하는 것 만으로도 속도가 평균 약 400 → 60으로 줄어든다.

알아보기

Parallel..?

위의 blocks를 가져오는 로직에서 filter를 제외하면 미약하게 더 빨라지는 것으로 보아, filter를 추가한 것에 대한 부하가 더 생기는 것은 맞다.
→ 단순히 blocks를 호출하는 것으로 인해 더 빨라지는 것이다.

JPA..?

JPA와 관련한 캐싱일까 싶어서 EntityManager를 이용해 매 연산 후에 리턴 바로 직전, clear()를 호출했을 때에도 별 차이는 없었다.

다른 repository를 호출해도 똑같을까?

BoardCategoryFilterRepository를 findAll하도록 해봤다.
@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { //TODO: QueryDSL로 리팩토링 여부 결정하기 // List<Block> blocks = blockRepository.findAllByMemberIdToList(loginUserId); categoryFilterRepository.findAll(); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
바로 4.6초까지 치솟는다.
혹시나해서 findById로 하나만 가져오도록 해보았다.
@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { //TODO: QueryDSL로 리팩토링 여부 결정하기 // List<Block> blocks = blockRepository.findAllByMemberIdToList(loginUserId); categoryFilterRepository.findById(ConsumptionCompositeKey.of(1L, 1L)); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
이전과 비슷한 결과가 나온다.
해서, 아예 연관관계가 없는 repository를 단순 호출하는 로직을 넣어보았다.
@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { animalCategoryRepository.findById(1L); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
역시나 이전과 비슷하게 빠른 결과로 나타난다.
혹시 내가 잘못본게 아닐까? 하고 다시 원상복구해봤다.
@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { // animalCategoryRepository.findById(1L); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
역시나 원래처럼 느려진다.. 도대체 뭘까? → 혹시 메서드의 DB 호출이 매우 짧아서, 커넥션 풀의 사용과 반환이 너무 잦아지는게 문제인걸까? → 하지만, 결국 사용과 반환이라는 점에서 로직이 더 들어간게 더하면 더했지 적지는 않지 않을까?
→ 그럼 뭐지?

혹시 알게모르게 코어를 더 쓰는거 아닐까?

@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { animalCategoryRepository.findById(1L); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); // 현재 사용중인 코어 수 측정 int cores = Runtime.getRuntime().availableProcessors(); // 현재 가용중인 스레드 수 측정 ThreadGroup rootGroup = Thread.currentThread().getThreadGroup(); ThreadGroup parentGroup; while ((parentGroup = rootGroup.getParent()) != null) { rootGroup = parentGroup; } int threads = rootGroup.activeCount(); // 출력하기 System.out.println("Available cores: " + cores); System.out.println("Active threads: " + threads); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
왼쪽이 기존, 오른쪽이 불필요한 repo 호출을 한번 더 한 경우다. 심지어 active threads가 더 줄었다.. 도대체 뭘까..?

혹시 JpaRepository를 사용하고, QueryDSL을 사용하는 것 때문일까?

뭔가 내가 모르는 JpaRepository 인터페이스 자체의 마법이라도 있어서 빨라지는게 아닐까?
그래서, queryDSL을 사용하는 repository 메서드를 호출 해봤다.
@Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { boardRepository.getMainViewBoards(PageRequest.of(0, 1)); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
어.. 이 녀석은 느리다..?
혹시..?
@Query("SELECT b FROM Board b WHERE b.id = 1") Board selectIdOneJpa(); @Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { boardRepository.selectIdOneJpa(); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
이제 DSL로 똑같은 호출을 구현해보자.
@Override public Board selectIdOneDsl() { return queryFactory.selectFrom(board) .where(board.id.eq(1L)) .fetchOne(); } @Override public BoardsPaginationDto getMainViewBoards(Long loginUserId, PageRequest pageRequest) { boardRepository.selectIdOneDsl(); List<BoardInfoDto> result = boardRepository.getMainViewBoards(pageRequest).stream() .map(board -> createBoardInfoDto(loginUserId, board)) .toList(); return boardMapper.toBoardsResponseDto(result, result.size()); }
Java
복사
오히려 더 빠르다.. 도대체.. 뭐야…

DB의 웜업과 관련이 있을까?

DB의 웜업 자체는 DB의 캐시가 잘 쌓여 있는지와 관련이 있는데, 현재의 경우에서는 결국 비슷한 캐싱으로 이뤄지는 문제라면 boardRepository.getMainViewBoards이 핵심적이므로 짧은 쿼리를 추가하든 안하든 비슷해야 할 것 같다는 생각이 들었다.
@Override public List<Board> test() { return boardRepository.findAll(); }
Java
복사
그래도 혹시 몰라서 findAll을 호출하는 테스트 라우트를 만들고, 약 10번정도 찍어낸 후에 다시 테스트를 해보았다.
Postman의 테스트 횟수를 다써서.. Artillery를 사용했다.
Postman은 초당 평균 약 200개가 넘는 request였다면 아틸러리는 초당 100개이므로, 전의 경우보다 속도가 더 빠르게 나오기는 하지만, 여전히 속도에서 많은 차이가 발생한다는 점에서 그 이유를 찾지 못했다.

핀포인트를 통해 해당 요청들의 처리 과정을 보려고 했지만...

pinpoint agent를 달아놓은 상태로 artillery를 사용하면 DB 서버가 냅다 죽어버린다.
다른 팀원분의 도움을 받아서 pinpoint로 해당 요청들을 tracking 해본 결과, getConnection에서 시간이 많이 걸리는 것을 확인했다(짧은 쿼리가 없으면 2~7초, 있으면 0ms…)
다른 분들의 조언을 받아서 raw query가 어떤식으로 차이가 있게 발생하는지, 그리고 그로 인한 병목은 어떻게 발생하는지 알아보고자 한다.
# 짧은 쿼리가 위에 있을 때 230903 6:33:46 8 Query set autocommit=0 8 Query select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,b1_0.updated_at,b1_0.visible_scope from board b1_0 where b1_0.id=1 8 Query select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,m1_0.id,m1_0.campus,m1_0.country,m1_0.created_at,m1_0.deleted_at,m1_0.language,m1_0.role,m1_0.nickname,m1_0.nickname_updated_at,m1_0.oauth_id,m1_0.oauth_name,m1_0.oauth_type,m1_0.profile_image_url,m1_0.statement,b1_0.updated_at,b1_0.visible_scope from board b1_0 join member m1_0 on m1_0.id=b1_0.member_id where b1_0.deleted_at is null order by b1_0.created_at desc,b1_0.created_at desc limit 40,20 8 Query select s1_0.board_id,s1_0.id,s1_0.created_at,s1_0.member_id from scrap s1_0 where s1_0.board_id in(9248,1,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 8 Query select r1_0.board_id,r1_0.id,r1_0.created_at,r1_0.member_id,r1_0.reaction_type from reaction r1_0 where r1_0.board_id in(9248,1,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 8 Query select c1_0.board_id,c1_0.id,c1_0.content,c1_0.created_at,c1_0.deleted_at,c1_0.member_id from comment c1_0 where c1_0.board_id in(9248,1,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 8 Query select m1_0.board_id,m1_0.id,m1_0.media_index,m1_0.media_type,m1_0.media_url from board_media m1_0 where m1_0.board_id in(9248,1,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 8 Query select c1_0.consumer_id,c1_0.provider_id from board_category_filter c1_0 where c1_0.consumer_id in(9248,1,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 8 Query COMMIT 8 Query set autocommit=1 # 짧은 쿼리가 없을 때 230903 6:35:47 18 Query set autocommit=0 18 Query select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,m1_0.id,m1_0.campus,m1_0.country,m1_0.created_at,m1_0.deleted_at,m1_0.language,m1_0.role,m1_0.nickname,m1_0.nickname_updated_at,m1_0.oauth_id,m1_0.oauth_name,m1_0.oauth_type,m1_0.profile_image_url,m1_0.statement,b1_0.updated_at,b1_0.visible_scope from board b1_0 join member m1_0 on m1_0.id=b1_0.member_id where b1_0.deleted_at is null order by b1_0.created_at desc,b1_0.created_at desc limit 40,20 18 Query select s1_0.board_id,s1_0.id,s1_0.created_at,s1_0.member_id from scrap s1_0 where s1_0.board_id in(9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 18 Query select r1_0.board_id,r1_0.id,r1_0.created_at,r1_0.member_id,r1_0.reaction_type from reaction r1_0 where r1_0.board_id in(9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 18 Query select c1_0.board_id,c1_0.id,c1_0.content,c1_0.created_at,c1_0.deleted_at,c1_0.member_id from comment c1_0 where c1_0.board_id in(9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 18 Query select m1_0.board_id,m1_0.id,m1_0.media_index,m1_0.media_type,m1_0.media_url from board_media m1_0 where m1_0.board_id in(9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 18 Query select c1_0.consumer_id,c1_0.provider_id from board_category_filter c1_0 where c1_0.consumer_id in(9248,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL) 18 Query COMMIT 18 Query set autocommit=1
SQL
복사
해당 트랜잭션에서 select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,b1_0.updated_at,b1_0.visible_scope from board b1_0 where b1_0.id=1 의 짧은 raw query가 하나 더 추가되어 있는 것 말고는 차이가 없었다.
혹시나해서 짧은 쿼리인 부분을 제외하고 diff도 해보았지만, 차이점이 없었다.

혹시 모르니 show-sql로 hibernate에서 어떻게 처리하는지 확인해보자.

# 짧은 쿼리가 위에 위치할 때 Hibernate: select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,b1_0.updated_at,b1_0.visible_scope from board b1_0 where b1_0.id=? Hibernate: select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,m1_0.id,m1_0.campus,m1_0.country,m1_0.created_at,m1_0.deleted_at,m1_0.language,m1_0.role,m1_0.nickname,m1_0.nickname_updated_at,m1_0.oauth_id,m1_0.oauth_name,m1_0.oauth_type,m1_0.profile_image_url,m1_0.statement,b1_0.updated_at,b1_0.visible_scope from board b1_0 join member m1_0 on m1_0.id=b1_0.member_id where b1_0.deleted_at is null order by b1_0.created_at desc,b1_0.created_at desc limit ?,? Hibernate: select s1_0.board_id,s1_0.id,s1_0.created_at,s1_0.member_id from scrap s1_0 where s1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select r1_0.board_id,r1_0.id,r1_0.created_at,r1_0.member_id,r1_0.reaction_type from reaction r1_0 where r1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select c1_0.board_id,c1_0.id,c1_0.content,c1_0.created_at,c1_0.deleted_at,c1_0.member_id from comment c1_0 where c1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select m1_0.board_id,m1_0.id,m1_0.media_index,m1_0.media_type,m1_0.media_url from board_media m1_0 where m1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select c1_0.consumer_id,c1_0.provider_id from board_category_filter c1_0 where c1_0.consumer_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) # 짧은 쿼리 없음 Hibernate: select b1_0.id,b1_0.content,b1_0.created_at,b1_0.deleted_at,b1_0.member_id,m1_0.id,m1_0.campus,m1_0.country,m1_0.created_at,m1_0.deleted_at,m1_0.language,m1_0.role,m1_0.nickname,m1_0.nickname_updated_at,m1_0.oauth_id,m1_0.oauth_name,m1_0.oauth_type,m1_0.profile_image_url,m1_0.statement,b1_0.updated_at,b1_0.visible_scope from board b1_0 join member m1_0 on m1_0.id=b1_0.member_id where b1_0.deleted_at is null order by b1_0.created_at desc,b1_0.created_at desc limit ?,? Hibernate: select s1_0.board_id,s1_0.id,s1_0.created_at,s1_0.member_id from scrap s1_0 where s1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select r1_0.board_id,r1_0.id,r1_0.created_at,r1_0.member_id,r1_0.reaction_type from reaction r1_0 where r1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select c1_0.board_id,c1_0.id,c1_0.content,c1_0.created_at,c1_0.deleted_at,c1_0.member_id from comment c1_0 where c1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select m1_0.board_id,m1_0.id,m1_0.media_index,m1_0.media_type,m1_0.media_url from board_media m1_0 where m1_0.board_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) Hibernate: select c1_0.consumer_id,c1_0.provider_id from board_category_filter c1_0 where c1_0.consumer_id in(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
SQL
복사
이번에도 diff를 해보았으나 차이점은 없었다.

그렇다면 QueryDSL에 짧은 쿼리를 넣어도 빨라질까?

#BoardRepositoryCustomImpl.java @Override public List<Board> getMainViewBoards(PageRequest pageRequest) { selectIdOneDsl(); // <- 추가 return getBoardsWithFetchJoin( board.deletedAt.isNull(), board.createdAt.desc(), pageRequest); }
SQL
복사
지웠을 때

결과

종료된 날짜..