구독 정보를 눌렀을 때,
다음과 같이 해당 페이지의 유저가 누굴 구독했는지에 대한 정보가 나온다.
(현재, 인스타그램은 팔로워와 팔로잉을 분리해놓았다.)
여기서 받아올 데이터는 유저의 프로필이미지, 유저의 이름, 구독여부 정보이다.
여기서 구독여부는 로그인한 사람이 해당 유저를 구독했는지에 대한 정보이다.
즉, 위에 나오는 유저리스트는 페이지 주인 유저가 구독한 유저(fromUserId)가 필요하지만,
모달 내부에서 구독, 구독취소 버튼의 활성화는 로그인한 유저가 구독한 유저의 정보(toUserId)이다.
그리고 만약 ssar이 로그인 하여 cos의 프로필페이지로 이동했을 때, ssar이 cos를 구독하고 있더라도
구독하기, 구독취소하기 버튼은 활성화 되어 있을 필요가 없다.
이미 구독정보 모달에 들어가기 전, 프로필 페이지에서 구현되어 있기 때문이다.
[ SubscribeDto.java ]
package com.GStagram.web.dto.subscribe;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SubscribeDto {
// 로그인한 유저가 모달에서 확인할 유저의 ID
private Integer id;
// 로그인한 유저가 모달에서 확인할 유저의 이름
private String username;
// 로그인한 유저가 모달에서 확인할 유저의 프로필이미지
private String profileImageUrl;
// 로그인한 유저가 모달에서 확인한 유저를 구독했는지에 대한 여부
private Integer subscribeState;
// 로그인한 유저가 모달에서 확인한 유저가 본인 스스로인지에 대한 여부
private Integer equalUserState;
}
이러한 단순하지 않은 여러 데이터를 받기 위해선 쿼리를 이용하는 것이 편하다.
예시
> ssar이 cos 프로필페이지에서 구독정보를 보는 쿼리
ssar이 cos의 페이지에서 확인할 수 있어야 하는 정보는 cos가 ssar과 love를 구독하고 있다는 사실이다.
cos(fromUserId)가 1,3(toUserId)를 구독하고 있는 것을 볼 수 있다.
SELECT * FROM subscribe WHERE fromUserId = 2;
SELECT *
FROM user u INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
여기서 필요한 데이터인 userid, username, profileImageUrl을 뽑아낸다.
SELECT u.id, u.username, u.profileImageUrl
FROM user u INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
이 데이터에서는 ssar이 cos 프로필 페이지로 가서 구독정보를 확인해보니
cos가 구독한 유저가 ssar과 love라는 것을 알 수 있다.
추가로 우리가 필요한 데이터는 ssar이 love를 구독했는지에 대한 데이터이다.
스칼라 서브쿼리를 사용해서 뽑아낼 수 있다.
SELECT u.id, u.username, u.profileImageUrl,
(SELECT TRUE FROM subscribe
WHERE fromUserId = 1 AND toUserId = u.id) subscribeState
FROM user u INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
결과를 보면 ssar은 스스로의 ID인 ssar은 null이 뜨고, 구독 중인 love를 대상으로는 1이 뜨게 되었다.
추가로 필요한 데이터는 모달에 뜬 유저정보가 로그인한 유저와 동일 유저인지 판단하는 쿼리이다.
SELECT u.id, u.username, u.profileImageUrl,
if((SELECT 1 FROM subscribe
WHERE fromUserId = 1 AND toUserId = u.id),1,0) subscribeState,
if((1=u.id),1,0) equalUserState
FROM user u INNER JOIN subscribe s
ON u.id = s.toUserId
WHERE s.fromUserId = 2;
이제 ssar이 누구를 구독했는지, 모달창에 뜬 유적 본인인지 확인할 수 있게 되었다.