본문 바로가기
자기개발/TIL

자바로 구현한 좋아요 많은 순서대로 반환 회고하기

by 금화맘 2023. 6. 28.

컨트롤러

@ResponseBody
@GetMapping("/artwork/wishlist")
public List<ArtworkDto> findArtworkByWishList() {
return artworkService.findArtworkByWishList();
}

서비스

public List<ArtworkDto> findArtworkByWishList() {
List<ArtworkEntity> artworkEntityList = artworkRepository.findArtworkByWishList();
return artworkMapper.toDtoList(artworkEntityList);
}

 

리포지토리

@Query(value = "SELECT a.* " +
"FROM artwork a " +
"LEFT JOIN wish_list w ON a.artwork_id = w.artwork_id " +
"WHERE visible = TRUE " +
"GROUP BY a.artwork_id " +
"ORDER BY COUNT(w.artwork_id) DESC, a.artwork_id DESC",
nativeQuery = true)
List<ArtworkEntity> findArtworkByWishList();

 

entity에는 

@Builder
public ArtworkEntity(Integer artwork_id, Integer user_id, String file_url, String title, String content, Integer artwork_price, String artwork_size, Integer artwork_state, int visible, String user_name) {
this.artwork_id = artwork_id;
this.user_id = user_id;
this.file_url = file_url;
this.title = title;
this.content = content;
this.artwork_price = artwork_price;
this.artwork_size = artwork_size;
this.artwork_state = artwork_state;
this.visible = visible;
this.user_name = user_name;
}

를 해줬다.

 

entity와 dto의 다른점은 오직 하나

private boolean like;

를 추가한것 뿐 !

좋아요를 한 것을 가져오는 것은 쉬웠다. 그런데 내가 자바 문법이 약하니까 count를 해서 어떻게 보내야 하고 쿼리를 어떻게 짜야하는지 어려움이 있었다.

동료분이 도와주셨었는데 신기했던건 left join을 많이 사용하는 거였다. 

left join을 사용하면 artwork 테이블의 모든 레코드와 wishlist 테이블에서 artwork_id랑 일치하는 레코드가 연결된다. 이때 artwork테이블을 기준ㅇ으로 조인을 수행하고, wishlist 테이블의 레코드가 없더라도 artwork 테이블의 레코드는 모두 결고에 포함된다고 한다.

artwork 테이블의 모든 작품에 대해 해당 작품이 찜 목록에 있는 경우에는 wishlist 테이블과 조인해서 결과에 포함되고, 없는 경우에는 null 값을 가지는 빈 레코드가 결과에 포함될 수 있다는 것.

 

그리고 이렇게 artwork 테이블을 기준으로 조인했더라도 group by를 사용해야 count를 사용할 수 있다.

나는 무턱대로 count만 사용했어서 전체 결과에 대한 갯수가 나오는 등의 에러가 났던 것.

group by로 artwork_id를 기준으로 묶어주고, wishlist테이블의 artwork_id를 개수를 세어줄 수 있게 됩니다. 

 

*잊지말자 group by!