[Project] 영화 상세보기

김호정's avatar
Oct 09, 2024
[Project] 영화 상세보기
 
notion image
 
메인페이지의 포스터를 클릭 했을 시 해당 영화에 대한 상세 정보와 리뷰를 볼 수 있는 창을 만들었습니다.
 
lazyloading전략과 open-in-view=false를 적용한 프로젝트에서
 
MovieRepository 쿼리 작성에 문제가 있었습니다.
영화 상세보기 페이지의 경우 영화와 영화에 관련된 모든 정보를 필요로 했고, 영화 엔티티는 OneToMany로 엮인 테이블이 여러개가 있었습니다. 그렇기에 db의 연결을 최소화 하고자 전부 join fetch를 하였지만 돌아 오는것은 MultipleBagFetchException 에러였습니다.
이 에러는 Hibernate가 한 번에 두 개 이상의 "bag" 타입(즉, List) 컬렉션을 join fetch할 수 없기 때문에 발생합니다. Hibernate는 한 엔티티에서 두 개 이상의 List 컬렉션을 join fetch로 처리하는 방법을 제공하지 않습니다. 아마 그 이유는
join fetch를 사용하여 두 개 이상의 @OneToMany 관계를 동시에 가져올 때, 데이터베이스는 해당 엔티티와 관련된 모든 컬렉션 데이터를 결합하여 반환하려고 합니다.
예를 들어, Movie 엔티티가 List<Poster>List<Still> 두 개의 @OneToMany 관계를 가지고 있다고 가정할 때, 두 관계를 동시에 join fetch하면:
  • Movie 1개에 대해
  • Poster 3개, Still 4개가 있을 경우,
  • 결과적으로 1 x 3 x 4 = 12개의 레코드가 반환됩니다.
즉, 하나의 Movie 엔티티에 대해 중복된 데이터가 반환되며, 이는 PosterStill 컬렉션의 각 조합마다 한 번씩 중복됩니다. 이것이 데이터의 카르테시안 곱을 유발합니다.
 
그렇기에 같은 error가 발생한 팀원들과 상의해 어느 정도의 lazyLoading을 허용하여 설계 하기로 했습니다.
notion image
 
저의 경우 영화 안 코멘트 테이블만 join해서 Movie객체를 만들어냈고,
그 이후 스틸컷과 포스터들을 가져와 movie객체에 넣어주는 형식으로 만들었습니다.
그렇게 모든 데이터를 가져온 Movie 객체를 DTO로 변환 하여 리턴 하였습니다.
notion image
 
컨트롤러에서 DTO를 model로 넘깁니다.
notion image
 
 
detail.mustache 로 상세보기 페이지를 만들고 동적 바인딩을 할수 있게 제작 하였습니다.
리뷰는 로그인 시에 작성이 가능하고, 리뷰의 작성자가 본인일 경우 삭제가 가능하게 구현 하였습니다.
notion image
 
Share article

keepgoing