Spring Boot

인기페이지 구현

have a good time 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 프로젝트 - 포토그램 만들기"