본문 바로가기

Server Programming/Spring Boot Backend Programming

[Spring 부트 - 영화 리뷰 프로젝트] 5. 영화 조회 처리

반응형

조회 페이지 구성

  1. 영화 조회
  2. 영화 리뷰 등록 / 수정 / 삭제

진행 순서

  1. MovieService에서 영화 번호를 이용해 MovieDTO를 반환하는 getMovie() 정의
  2. MovieServiceImpl에서 getMovie()를 구현
  3. MovieController의 목록 페이지에서 영화의 번호를 이용한 URL 처리 [조회와 수정에서 사용]
    : '/movie/read?mno=103&page=1'

 

 

1. MovieService에서 getMovie() 정의

    //특정 영화 번호를 이용해 영화 정보 전달 메서드
    MovieDTO getMovie(Long mno);

 

MovieServiceImpl에서 getMovie()를 구현하기 위해서는

: MovieDTO를 반환하기 위해 MovieRepository에서 받은 데이터를 가공해야한다

 

MovieRepository에서 받는 List<Object>의 구조

entitiesToDTO(Movie movie, List<MovieImage> imgList, Double avg, Long reviewCnt)

 

2. 리포지토리에서 데이터를 받아서 가공하는 MovieServiceImpl의 getMovie() 메서드 구현

    //리포지토리에서 데이터를 받아서 가공해 MovieDTO를 반환하는 메서드를 구현
    @Override
    public MovieDTO getMovie(Long mno){
        List<Object[]> result = movieRepository.getMovieWithAll(mno);

        //영화 이미지를 제외하고 모든 row가 동일한 값을 가지고 있다.

        Movie movie = (Movie) result.get(0)[0]; //맨 앞에 존재하는 Movie 엔티티
        List<MovieImage> movieImageList = new ArrayList<>(); //영화 이미지 개수만큼 객체 필요
        result.forEach(arr ->{
            MovieImage movieImage=(MovieImage) arr[1];
            movieImageList.add(movieImage);
        });

        Double avg= (Double) result.get(0)[2]; //평균 평점
        Long reviewCnt = (Long) result.get(0)[3]; //리뷰 개수

        return entitiesToDTO(movie,movieImageList,avg,reviewCnt);
    }

 

3. MovieController의 목록 페이지에서 영화의 번호를 이용한 URL 처리 [조회와 수정에서 사용]

    //조회와 수정에서 사용하는 URL 처리
    @GetMapping({"/read", "/modify"})
    public void read(long mno, @ModelAttribute("requestDTO") PageRequestDTO requestDTO, Model model){
        log.info("mno :"+ mno);
        MovieDTO movieDTO = movieService.getMovie(mno);

        model.addAttribute("dto", movieDTO);
    }

 

4. 조회 화면 구현

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">

<th:block th:replace="~{/layout/basic :: setContent(~{this::content} )}">

    <th:block th:fragment="content">

        <h1 class="mt-4">Movie Read Page</h1>


        <div class="form-group">
            <label >Title</label>
            <input type="text" class="form-control" name="title" th:value="${dto.title}" readonly>
        </div>

        <div class="form-group">
            <label >Review Count </label>
            <input type="text" class="form-control" name="title" th:value="${dto.reviewCnt}" readonly>
        </div>

        <div class="form-group">
            <label >Avg </label>
            <input type="text" class="form-control" name="title" th:value="${dto.avg}" readonly>
        </div>

        <style>
            .uploadResult {
                width: 100%;
                background-color: gray;
                margin-top: 10px;
            }

            .uploadResult ul {
                display: flex;
                flex-flow: row;
                justify-content: center;
                align-items: center;
                vertical-align: top;
                overflow: auto;
            }

            .uploadResult ul li {
                list-style: none;
                padding: 10px;
                margin-left: 2em;
            }

            .uploadResult ul li img {
                width: 100px;
            }
        </style>



        <div class="uploadResult">
            <ul >
                <li th:each="movieImage: ${dto.imageDTOList}" th:data-file="${movieImage.getThumbnailURL()}">
                    <img  th:if="${movieImage.path != null}" th:src="|/display?fileName=${movieImage.getThumbnailURL()}|">
                </li>
            </ul>
        </div>


        <script>
            $(document).ready(function(e) {

            });
        </script>

    </th:block>

</th:block>

 

반응형