Baeg-won
좋았다면 추억이고 나빴다면 경험이다.
Baeg-won
전체 방문자
오늘
어제
  • 분류 전체보기
    • 🍃 Spring, Spring Boot
      • 스프링 프레임워크 기초
      • 스프링 핵심 원리 - 기본편
      • 자바 ORM 표준 JPA 프로그래밍 - 기본편
      • 스프링 MVC
      • 실전! 스프링 부트와 JPA 활용1 - 웹 애플리..
    • 🥑 Web Technoloy
    • 🚗 Backend Toy Project
      • 스프링 부트 게시판
      • Photogram
      • Baeg-won Clothing Gallery
    • 🥇 Problem Solving
      • Breadth-First Search
      • Depth-First Search
      • Backtracking
      • Simulation
      • Two-pointer
      • Binary Search
      • Greedy
      • Dynamic Programming
      • Minimum Spanning Tree
      • Dijkstra
      • Floyd warshall
    • ☕ Java
      • 명품 자바 에센셜
      • Applications
    • 🍦 JavaScript
      • JavaScript 기초
    • 🐧 Linux
      • 이것이 리눅스다(CentOS 8)
    • 📟 Database
      • 혼자 공부하는 SQL
    • 🧬 Data Structure
    • 🎬 HTML
    • 🎤 Tech Interview
    • 📌 etc
      • Unity 2D Raising Jelly Game
      • C++
      • 영어 쉐도잉

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Baeg-won

좋았다면 추억이고 나빴다면 경험이다.

🚗 Backend Toy Project/Photogram

[Photogram] 구독하기 - 구독 모달

2022. 7. 14. 10:36
  • 이번에는 구독 모달에 사용자가 구독한 구독 정보가 리스트 형태로 보여지며 해당 모달에서도 구독하기와 구독취소가 가능하도록 구현해보려고 합니다.


📝 DTO

  • 우선 구독 정보를 리스트로 나열하기 위해 필요한 항목들을 아래와 같이 구현해보았습니다.
package com.cos.photogram.web.dto.subscribe;

...

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class SubscribeDto {

	private BigInteger id;
	private String username;
	private String profile_image_url;
	private Integer subscribe_state;
	private Integer equal_user_state;
}
  • id: 현재 페이지의 사용자가 구독한 사용자 아이디
  • username: 현재 페이지의 사용자가 구독한 사용자 이름
  • profile_image_url: 현재 페이지의 사용자가 구독한 사용자의 프로필 사진
  • subscribe_state: 현재 접속중인 사용자가 해당 페이지의 사용자가 구독한 사용자를 구독했는지 여부
    • 구독 여부에 따라 구독하기 또는 구독취소 버튼이 나타도록 할 것임
  • equal_user_state: 현재 접속중인 사용자와 해당 페이지의 사용자가 동일한 사용자인지 여부
    • 자기 자신의 페이지일 경우 구독 버튼이 나타나지 않도록 할 것임
참고: 자료형을 BigInteger, Integer로 설정한 이유는 MariaDB의 경우 Long 타입과 int 타입을 위와 같이 설정하지 않으면 잘 동작하지 않는 경우가 있기 때문입니다.

📝 Service

  • 위와 같이 구독자 정보를 리스트로 뿌리기 위해 아래와 같은 쿼리문을 만들었습니다.
SELECT u.id, u.username, u.profile_image_url,
	if ((SELECT 1 FROM subscribe WHERE from_user_id = ? AND to_user_id = u.id), 1, 0) subscribe_state,
	if ((? = u.id), 1, 0) equal_user_state
FROM user u 
INNER JOIN subscribe s
ON u.id = s.to_user_id
WHERE s.from_user_id = ?;
  • 다만 위와 같은 네이티브 쿼리를 실행하기 위해서는 Repository에 함수를 생성하는 방식은 사용할 수 없고 따로 쿼리를 직접 만들어 실행시켜주어야 합니다.
  • 자세한 방법은 아래와 같습니다.
package com.cos.photogram.service;

import org.qlrm.mapper.JpaResultMapper;

...

@RequiredArgsConstructor
@Service
public class SubscribeService {
	
	private final EntityManager em;

	...
	
	@Transactional
	public void unSubs(Long fromUserId, Long toUserId) {
		subscribeRepository.unSubscribe(fromUserId, toUserId);
	}
	
	@Transactional(readOnly = true)
	public List<SubscribeDto> subscribeList(Long principalId, Long pageUserId) {
		
		//쿼리 준비
		StringBuffer sb = new StringBuffer();
		sb.append("SELECT u.id, u.username, u.profile_image_url, ");
		sb.append("if ((SELECT 1 FROM subscribe WHERE from_user_id = ? AND to_user_id = u.id), 1, 0) subscribe_state, ");
		sb.append("if ((? = u.id), 1, 0) equal_user_state ");
		sb.append("FROM user u INNER JOIN subscribe s ");
		sb.append("ON u.id = s.to_user_id ");
		sb.append("WHERE s.from_user_id = ?");
		
		//쿼리 완성
		Query query = em.createNativeQuery(sb.toString())
				.setParameter(1, principalId)
				.setParameter(2, principalId)
				.setParameter(3, pageUserId);
		
		//쿼리 실행
		JpaResultMapper resultMapper = new JpaResultMapper();
		List<SubscribeDto> list = resultMapper.list(query, SubscribeDto.class);
		
		return list;
	}
}
  • 위 방법은 QLRM 라이브러리를 사용하여 직접 쿼리를 작성하고 실행시킨 구문으로, 위와 같은 방법을 통해 조인과 스칼라가 포함된 쿼리를 실행하여 결과를 얻어낼 수 있습니다.

📝 Controller

  • 컨트롤러에서 위 함수를 호출합니다.
package com.cos.photogram.web.api;

...

@RequiredArgsConstructor
@RestController
public class UserApiController {
	
	private final SubscribeService subscribeService;

	...
	
	@GetMapping("/api/user/{pageUserId}/subscribe")
	public ResponseEntity<?> subscribeList(@PathVariable Long pageUserId, @AuthenticationPrincipal PrincipalDetails principalDetails) {
		List<SubscribeDto> subscribeDto = subscribeService.subscribeList(principalDetails.getUser().getId(), pageUserId);
		
		return new ResponseEntity<>(new CMRespDto<>(1, "구독 정보 목록 가져오기 성공", subscribeDto), HttpStatus.OK);
	}
}

📝 Javascript

  • 마지막으로 js 파일에 아래와 같은 함수를 구현해주었습니다.
// (2) 구독자 정보  모달 보기
function subscribeInfoModalOpen(pageUserId) {
	$(".modal-subscribe").css("display", "flex");

	$.ajax({
		url: `/api/user/${pageUserId}/subscribe`,
		dataType: "json"
	}).done(resp => {
		console.log(resp);
		resp.data.forEach((u) => {
			let item = getSubscribeModalItem(u);
			$("#subscribeModalList").append(item);
		});
	}).fail(error => {
		console.log(error);
	});
}

function getSubscribeModalItem(u) {
	let item = `<div class="subscribe__item" id="subscribeModalItem-${u.id}">
	<div class="subscribe__img">
		<img src="/upload/${u.profile_image_url}" onerror="this.src='/images/person.jpeg'" />
	</div>
	<div class="subscribe__text">
		<h2>${u.username}</h2>
	</div>
	<div class="subscribe__btn">`;

	if (!u.equal_user_state) {
		if (u.subscribe_state)
			item += `<button class="cta blue" onclick="toggleSubscribe(${u.id}, this)">구독취소</button>`
		else item += `<button class="cta" onclick="toggleSubscribe(${u.id}, this)">구독하기</button>`
	}
	
	item += `
	</div>
</div>`;

	return item;
}
  • 해당 함수는 구독정보 버튼을 클릭할 시 호출되는 함수로써, 전달받은 구독자 정보를 화면에 출력해줍니다. 또한 해당 모달에서 구독취소 또는 구독하기 버튼을 클릭할 시 동일하게 기능을 수행합니다.

 

GitHub - Daegwon-Kim/SpringBoot-Photogram

Contribute to Daegwon-Kim/SpringBoot-Photogram development by creating an account on GitHub.

github.com

 

저작자표시

'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글

[Photogram] 좋아요 구현하기  (0) 2022.07.15
[Photogram] 스토리 페이지  (0) 2022.07.14
[Photogram] 구독하기 - 기능 구현  (0) 2022.07.12
[Photogram] 구독하기 - 뷰 렌더링  (0) 2022.07.12
[Photogram] 프로필 페이지 - 뷰 렌더링  (0) 2022.07.11
    '🚗 Backend Toy Project/Photogram' 카테고리의 다른 글
    • [Photogram] 좋아요 구현하기
    • [Photogram] 스토리 페이지
    • [Photogram] 구독하기 - 기능 구현
    • [Photogram] 구독하기 - 뷰 렌더링
    Baeg-won
    Baeg-won

    티스토리툴바