개발 블로그
article thumbnail
Published 2023. 5. 3. 20:41
[TIL] DAY31 항해99

오늘 겪은 문제

Lv5 를 넘어서 디벨롭하는 과정 중에 전체 게시글 조회 시 출력되는 내용의 변경이 필요했다.

 

기존에는 게시글과 거기에 달린 댓글들이 전부 출력되는 형태였는데 이를 변경하여 게시글과 거기에 달린 댓글의 숫자를 출력해야했다. 그래서 처음에는 Post를 PostResponseDto 로 변환할 때 댓글 리스트 대신 리스트의 사이즈를 담을 필드를 만들어야겠다고 생각했다.

 

그런데 이 방법은 어찌됐건 게시글에 달린 댓글을 DB에서 전부 가져와서 작업을 해야하는 방식이기에 애초에 조회할 때부터 갯수를 카운팅해서 그것만 가져오게 만들고 싶었다.

 

아마 이를 위해서 DB에게 실제로 날려야 할 쿼리는

select p.*, count(c.comment_id)
from post p 
	left join comment c on p.post_id = c.post_id
group by p.post_id

대략 이런 형식일 거라 생각했고 하나의 쿼리메서드로 내가 원하는 결과를 얻기에는 역부족이었다.

 

그래서 jpql 을 활용했는데 이 과정에서 에러를 만났다.

에러의 내용은 type 변환을 해줄 converter 가 없다는 내용이었다.

 

해결 방법

우선 위 문제는 나의 착각으로부터 발생한 문제였다. PostWithCommentCountDto 의 생성자 중 Post 객체와 Long 객체를 입력으로 받는 생성자를 만들어놨기에 jpa가 자동으로 조회한 p 와 count(c)를 여기에 주입해줄 거라고 생각했다.

 

하지만 PostWithCommentCountDto는 영속성 컨텍스트의 관리 대상이 아닌 전혀 무관한 하나의 클래스일 뿐이었고 jpa가 이를 자동으로 인식해 주입해주는 것은 말이 안 되는 일이었다.

 

그래서 다른 방법이 없나 jpql 문서를 찾아봤는데 JPQL Constructor Expressions 라는 게 있었다.

 

이를 이용하면 엔티티가 아닌 클래스의 자바 객체도 반환하는 jpql을 짤 수 있었다.

실제로 위 표현식을 이용해서 jpql 을 작성해주었더니 내가 원하는 대로 p 와 count(c)가 PostWithCommentCountDto 의 생성자에 입력값으로 들어가 객체를 만들어 반환할 수 있었다.

'항해99' 카테고리의 다른 글

[WIL] Week 5  (1) 2023.05.07
[TIL] DAY 34  (1) 2023.05.07
[TIL] DAY 29  (0) 2023.05.01
[WIL] 항해 4주차  (0) 2023.05.01
[TIL] DAY 27  (0) 2023.04.29
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!