ABOUT ME

Today
Yesterday
Total
  • 인기페이지 구현
    Spring Boot 2021. 11. 17. 22:32

    인기페이지란, 좋아요 수가 많은 이미지를 차례대로 출력해 화면에 보여주는 페이지이다.

     

    상황 설명을 하겠다.

    현재 사이트에 가입한 user 는 총 3명이다. (user = 1,2,3 존재)

     

    지금 로그인한 user =1 이다.

    user 1은,

    user 2 의 이미지(A)에 좋아요를 눌렀고,

    user 3의 이미지(B)에도 좋아요를 눌렀다.

     

    그런데 user2 역시 user 3의 이미지(B) 에 좋아요를 눌러서,

    결과적으로

     

    좋아요 수는

    user 2의이미지(A) : 1

    user 3의 이미지(B) : 2

    가 된다.

     

    따라서 user1 의 인기페이지에는

    B ,A 순으로 화면에 나타나게 된다. 

     

    즉 아래처럼 화면에 표시된다.

     

     

     

     

    쿼리는 직접 nativeQuery 로 완성하는데,

    아래 주소를 참조하면 그 과정을 볼 수 있다.

    https://happy-fun.tistory.com/144

     

    쿼리가 완성되었다고 하고, 다음 코드들을 완성한다.

     

     

    <jsp 파일>

    	<div class="popular-gallery">
    
    			<c:forEach var="image" items="${images}">
    				<div class="p-img-box">
    					<a href="/user/${image.user.id}"> <img src="/upload/${image.postImageUrl}" />
    					</a>
    				</div>
    			</c:forEach>
    
    		</div>

    controller.java에서는 db로부터 받아온 인기페이지를 

    model(images 변수) 을 통해 jsp 파일에 보내준다.

    그래서 위와 같이 images 값을 받아 image로 활용하는 것을 알 수 있다.

     

    더불어서 인기페이지의 각 이미지를 클릭하면, 그 이미지의 주인 user의 페이지로 이동하도록

    href 를 완성했다.

     

    img src를 통해 인기페이지에 이미지를 뿌려줌

     

     

    <controller.java파일>

     

    @GetMapping("/image/popular")
    	public String popular(Model model) {
    		List<Image> images = imageService.인기사진();
    		model.addAttribute("images", images);
    		
    		return "image/popular";
    	}

     

    보통은, apicontroller.java를 활용해서 데이터로 담아오기도 하는데,

    여기서 그렇게 하지 않은 이유는 

    굳이 ajax를 이용해서 어렵게 구현하지 않아도 model에 담아서 구현가능하기 때문.

     

     

    <service.java 파일>

    	
    	@Transactional(readOnly = true)
    	public List<Image> 인기사진(){
    		return imageRepository.mPopular();
    	}

     

     

    <repository.java 파일>

     

    	
    	@Query(value = "SELECT i.* FROM image i INNER JOIN (SELECT imageId, COUNT(imageId) likeCount FROM likes GROUP BY imageId) c ON i.id = c.imageId ORDER BY likeCount DESC", nativeQuery = true)
    	List<Image> mPopular();

    위에서 완성한 nativeQuery 를 여기서 활용한다.

     

    이렇게 하면 완성된다.

     

     

    참고 자료 : 이지업 강의 사이트 "스프링부트 SNS 프로젝트 - 포토그램 만들기"

    'Spring Boot' 카테고리의 다른 글

    댓글

Designed by Tistory.