오늘 겪은 문제
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 |