Spring/프로젝트 코드 리뷰

Spring 클론코딩 프로젝트 콘텐츠 DetailPage(별점,별점 그래프, 해당 유저 별점 달았는지)

code2772 2023. 3. 4. 13:50
728x90
반응형

✔ MovieController - @RequesdtMapping("/movie") 기본 주소

@Controller
@RequestMapping("/movie")
@RequiredArgsConstructor

✔     @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1 

    @GetMapping("/{movieIdx}") // http://localhost:8080/movie/1
    public String movieDetail(
            @PathVariable Long movieIdx,
            @PageableDefault(size = 5, sort = "commIdx", direction = Sort.Direction.DESC) Pageable pageable,
            ModelMap map,
            HttpSession session
    ){
        UserSessionDto dto = (UserSessionDto) session.getAttribute("userSession");

@PathVariable Long movieIdx 를 사용하여 영화 디테일 페이지 해당 프라이머리 값인 Idx를 통해 페이지를 이동한다.

 

MovieService의 movieView

@Transactional(readOnly = true)
public MovieResponse movieView(Long movieIdx){
    MovieDto mov = movieRepository.findById(movieIdx).map(MovieDto::from).get();
    return MovieResponse.from(mov);
}

 

 

✔ 평균 별점 구하는 부분

  MovieResponse movie = movieService.movieView(movieIdx);
//      평균 별점
        double sum = 0;
        double avgStar = 0;
        if(movie.starList().size() == 1){
            avgStar = movie.starList().get(0).getStarPoint();
        }else if(movie.starList().size() > 0){
            for(int i=0; i<movie.starList().size(); i++){
                sum += movie.starList().get(i).getStarPoint();
            }
            avgStar = Math.round((sum / movie.starList().size()) * 10.0) / 10.0;
        }

영화 별점이 있는지 없는지에 따라  1개의 별점만 있으면 한 값만 출력하지만 if-else문을 사용하여 여러개일 경우 for문을 사용하여 반복하여 별점의 합을 구하고 별점들의 평균을 출력해주는 부분이다. 평균을 구하기 위해 나누기를 해야하기 때문에 double형을 사용하였다.

 

 

✔ 별점 중복문제와 로그인 했을 경우 

        StarResponse hasStar = null;
        if(dto!=null) {
//        해당 유저가 별점을 매겼는지
            hasStar = starService.findStar("movie", movie.idx(), dto.userIdx());
        }

콘텐츠 중 해당 영화에 로그인한 유저 정보가 평가한 기록이 있는지 확인하는 컨트롤러에서의 기능 부분

 

✔ 별점 그래프 출력

//        별점 그래프
        HashMap<Long, Integer> starGraph = new HashMap<Long,Integer>(){{
            put(1L,0);put(2L,0);put(3L,0);put(4L,0);put(5L,0);
        }};
        if(movie.starList().size() > 0){
            int graphPx = 88 / movie.starList().size();
            for(Star star : movie.starList()){
                for(Long i=1L; i<=5L; i++){
                    if(star.getStarPoint() == i){
                        starGraph.put(i,starGraph.get(i) + graphPx);
                    }
                }
            }
        }
        Long bigStar = starGraph.entrySet().stream().max((m1, m2) -> m1.getValue() > m2.getValue() ? 1 : -1).get().getKey();

별점 그래프를 출력하기 위한 Controller 부분의 기능

 

✔ 별점 그래프 타임리프 

<!--    별점 그래프-->
<attr sel="section[data-rowindex='8']" th:if="${movie.starList().size()} >= 5">
    <attr sel="span.css-14yj34l-RatingStatHeaderTopRight/h4" th:text="'평균 ★' + ${avg}"/>
    <attr sel="span.css-14yj34l-RatingStatHeaderTopRight/strong" th:text="'(' + ${movie.starList().size()} + '명)'"/>
    <!--        그래프 부분-->
    <attr sel="div.css-g1q7ln" th:object="${graph}">
        <attr sel="span.css-111q860-Bar" th:style="*{get(1L)} == 0 ? 'height:1px;' : (${bigStar} == 1 ? 'height: 88px; background-color: #ffa136;' : 'height:'+ *{get(1L)} +'px;')"/>
        <attr sel="span.css-5vyahd-Bar" th:style="*{get(2L)} == 0 ? 'height:1px;' : (${bigStar} == 2 ? 'height: 88px; background-color: #ffa136;' : 'height:'+ *{get(2L)} +'px;')"/>
        <attr sel="span.css-himw0d-Bar" th:style="*{get(3L)} == 0 ? 'height:1px;' : (${bigStar} == 3 ? 'height: 88px; background-color: #ffa136;' : 'height:'+ *{get(3L)} +'px;')"/>
        <attr sel="span.css-3zcnds-Bar" th:style="*{get(4L)} == 0 ? 'height:1px;' : (${bigStar} == 4 ? 'height: 88px; background-color: #ffa136;' : 'height:'+ *{get(4L)} +'px;')"/>
        <attr sel="span.css-mr14ik-Bar" th:style="*{get(5L)} == 0 ? 'height:1px;' : (${bigStar} == 5 ? 'height: 88px; background-color: #ffa136;' : 'height:'+ *{get(5L)} +'px;')"/>
    </attr>
</attr>

별점의 수가 5개 이상일 때 부터 출력하기 위해 th:if 문을 사용하였으며 그래프 표기를 하기 위해 5개로 나눠서 해당하는 부분이 증가할 수 있도록 구성

 

✔ 별점 그래프 출력 화면

반응형