컨트롤러
@ResponseBody
@GetMapping("/artwork/wishlist")
public List<ArtworkDto> findArtworkByWishList() {
return artworkService.findArtworkByWishList();
}
@GetMapping("/artwork/wishlist")
public List<ArtworkDto> findArtworkByWishList() {
return artworkService.findArtworkByWishList();
}
서비스
public List<ArtworkDto> findArtworkByWishList() {
List<ArtworkEntity> artworkEntityList = artworkRepository.findArtworkByWishList();
return artworkMapper.toDtoList(artworkEntityList);
}
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();
"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;
}
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!
'자기개발 > TIL' 카테고리의 다른 글
리스트 연습 (0) | 2023.07.05 |
---|---|
배열에서 음수의 인덱스를 반환하란다 (0) | 2023.07.04 |
영어 면접을 봤습니다. (0) | 2023.06.27 |
프로그래머스 js 최대값 만들기(2) (0) | 2023.06.26 |
프로그래머스 lv.0 암호해독.js (0) | 2023.06.24 |