
@RequestMapping("/followerList.do")
public String followerList(HttpSession session, Model model) {
// 세션에서 현재 로그인 아이디 가져오기
MemberDomain memberDomain = (MemberDomain) session.getAttribute("member");
String memberId = memberDomain.getMemberId();
// 맵 생성
Map<String, Object> followId = new HashMap<>();
// 멤버 아이디 넣기
followId.put("memberId", memberId);
try {
// checkFollow 팔로우 체크, followList 명단
if(followService.followList(followId) != null) {
Map<String, Object> followLists = followService.followList(followId);
model.addAttribute("followLists", followLists);
System.out.println("followLists 어떤 식으로 들어 오니?" + followLists);
}
} catch (Exception e) {
e.printStackTrace();
}
return "/mypage/follow/follower";
}
// 팔로잉 리스트
@RequestMapping("/followingList.do")
public String followingList(HttpSession session, Model model) {
// 세션에서 현재 로그인 아이디 가져오기
MemberDomain memberDomain = (MemberDomain) session.getAttribute("member");
String memberId = memberDomain.getMemberId();
// 맵 생성
Map<String, Object> followId = new HashMap<>();
// 멤버 아이디 넣기
followId.put("memberId", memberId);
try {
List<MemberDomain> followLists = followService.followingList(followId);
model.addAttribute("followLists", followLists);
System.out.println("followLists 어떤 식으로 들어 오니?" + followLists);
} catch (Exception e) {
e.printStackTrace();
}
// 팔로우 리스트
@Override
public Map<String, Object> followList(Map<String, Object> followIds) throws Exception {
System.out.println("followIds" + followIds);
// 해당 회원의 팔로워 아이디 리스트
List<String> followerIdList = followDAO.followerIdList(followIds);
// 회원의 팔로워 아이디 리스트의 정보
List<MemberDomain> followerList = followDAO.followerList(followIds);
// 맵 만들어서 팔로우 id 리스트와 맴버 id 담기
Map<String, Object> followIdListMap = new HashMap<>();
String memberId = (String) followIds.get("memberId");
followIdListMap.put("followerIdList", followerIdList);
followIdListMap.put("memberId", memberId);
// 해당 맴버 회원의 팔로윙 목록을 조회
// 팔로윙 목록에 팔로우한 회원이 없다면 false(팔로우 버튼 활성화 핑크색) 있다면 true(팔로잉 버튼으로 회색)
if(followerIdList != null && !followerIdList.isEmpty()) {
List<Map<String, String>> checkFollows = followDAO.checkFollow(followIdListMap);
System.out.println(checkFollows);
Map<String, Object> followLists = new HashMap<>();
followLists.put("checkFollow", checkFollows);
followLists.put("followerList", followerList);
return followLists;
}else {
return new HashMap<>();
}
}
// 팔로잉 조회
@Override
public List<MemberDomain> followingList(Map<String, Object> followIds) throws Exception {
// 회원의 팔로워 아이디 리스트의 정보
List<MemberDomain> followerList = followDAO.followingList(followIds);
return followerList;
}
// 팔로워 id 리스트 조회
@Override
public List<String> followerIdList(Map<String, Object> followIds) throws DataAccessException {
return sqlSession.selectList("mapper.follow.followerIdList", followIds);
}
// 팔로워 리스트 조회
@Override
public List<MemberDomain> followerList(Map<String, Object> followIds) throws DataAccessException {
return sqlSession.selectList("mapper.follow.followerList", followIds);
}
// 해당 맴버 회원의 팔로윙 목록을 조회
// 팔로윙 목록에 팔로우한 회원이 없다면 false(팔로우 버튼 활성화 핑크색) 있다면 true(팔로잉 버튼으로 회색)
@Override
public List<Map<String, String>> checkFollow(Map<String, Object> followIdListMap) throws DataAccessException {
return sqlSession.selectList("mapper.follow.checkFollow", followIdListMap);
}
// 팔로잉 id 리스트 조회
@Override
public List<String> followingIdList(Map<String, Object> followIds) throws DataAccessException {
return sqlSession.selectList("mapper.follow.followingIdList", followIds);
}
// 팔로윙 리스트 조회
@Override
public List<MemberDomain> followingList(Map<String, Object> followIds) throws DataAccessException {
return sqlSession.selectList("mapper.follow.followingList", followIds);
}
<!-- 팔로워 아이디 리스트 -->
<select id="followerIdList" parameterType="MAP" resultType="String">
<![CDATA[
SELECT followerId
from follower
where memberId = #{memberId}
order by followerUpdated DESC
]]>
</select>
<!-- 팔로잉 아이디 리스트 -->
<select id="followingIdList" parameterType="MAP" resultType="String">
<![CDATA[
SELECT followerId
from following
where memberId = #{memberId}
order by followerUpdated DESC
]]>
</select>
<!-- 팔로워 리스트 정보 -->
<select id="followerList" parameterType="MAP" resultMap="followResult">
SELECT m.memberId, m.memberNickName, m.memberImage
FROM follower f
JOIN member m ON f.followerId = m.memberId
WHERE f.memberId = #{memberId}
ORDER BY f.followerUpdated DESC
</select>
<!-- 팔로잉 리스트 정보 -->
<select id="followingList" parameterType="MAP" resultMap="followResult">
SELECT m.memberId, m.memberNickName, m.memberImage
FROM following f
JOIN member m ON f.followerId = m.memberId
WHERE f.memberId = #{memberId}
ORDER BY f.followerUpdated DESC
</select>
<!-- 팔로잉 여부 체크 -->
<select id="checkFollow" parameterType="MAP" resultType="java.util.HashMap">
<foreach item="followerId" collection="followerIdList" separator="UNION ALL">
SELECT
#{followerId} AS followerId,
CASE
WHEN EXISTS (
SELECT 0
FROM following
WHERE memberId = #{memberId}
AND followerId = #{followerId}
)
THEN 'true'
ELSE 'false'
END AS checkFollow
FROM dual
</foreach>
</select>
<div id="followerBox">
<p style="text-align: left; margin-left:3px; font-weight: bold;">팔로워</p>
<c:if test="${!empty followLists}">
<div id="followerList">
<c:forEach var="follower" items="${followLists.followerList}">
<c:set var="isFollowing" value="false" />
<c:forEach var="check" items="${followLists.checkFollow}">
<c:if test="${check.FOLLOWERID == follower.memberId}">
<c:set var="isFollowing" value="${check.CHECKFOLLOW}" />
</c:if>
</c:forEach>
<div class="followerItem">
<!-- 프로필 사진 -->
<c:if test="${follower.memberImage == null}">
<a id="yourPage" onclick="yourPage('${follower.memberId}')">
<img src="${contextPath}/resources/image/mypage.png" class="profileImage" style="margin-top:4px;"/>
</a>
</c:if>
<c:if test="${follower.memberImage != null}">
<a id="yourPage" onclick="yourPage('${follower.memberId}')">
<img src="/memberProfileImage/${follower.memberId}/${follower.memberImage}" class="profileImage" style="margin-top:4px;"/>
</a>
</c:if>
<a id="yourPage" onclick="yourPage('${follower.memberId}')">
<p class="nickname">${follower.memberNickname}</p> <!-- 닉네임 -->
</a>
<form id="yourPageForm" action="${contextPath}/mypage/myhome/yourPageMyHomeList.do" method="POST">
<input class="yourId" name="yourId" type="hidden" value=""/>
</form>
<div class="buttonContainer">
<c:if test="${isFollowing}">
<button id="nofollowButton" onclick="follow('${follower.memberId}')">팔로잉</button> <!-- 팔로우 중 -->
</c:if>
<c:if test="${!isFollowing}">
<button id="followButton" onclick="follow('${follower.memberId}')">팔로우</button> <!-- 팔로우 안 함 -->
</c:if>
</div>
</div>
</c:forEach>
</div>
</c:if>
<c:if test="${empty followLists}">
팔로워가 없습니다.
</c:if>
</div>
<aside> 💡
// 해당 맴버 회원의 팔로윙 목록을 조회 // 팔로윙 목록에 팔로우한 회원이 없다면 false(팔로우 버튼 활성화 핑크색) 있다면 true(팔로잉 버튼으로 회색) @Override public List<Map<String, String>> checkFollow(Map<String, Object> followIdListMap) throws DataAccessException { return sqlSession.selectList("mapper.follow.checkFollow", followIdListMap); }
<!-- 팔로잉 여부 체크 --> <select id="checkFollow" parameterType="MAP" resultType="java.util.HashMap"> <foreach item="followerId" collection="followerIdList" separator="UNION ALL"> SELECT #{followerId} AS followerId, CASE WHEN EXISTS ( SELECT 0 FROM following WHERE memberId = #{memberId} AND followerId = #{followerId} ) THEN 'true' ELSE 'false' END AS checkFollow FROM dual </foreach> </select>
도메인 없이도 객체안에 객체를 잘 배치하면 다른 값을 여러개를 받아 올수 있음. 위와 같은 경우에는 #{followerId} AS followerId, THEN 'true', ELSE 'false' 트루, 펄스 값을 받아오는데 어떤 아이디의 값인지 알기 위해서 id도 같이 뽑아서 가져옴.
그럼 리스트안에 맵의 형태로 {아이디:아이디값, 팔로잉여부:여부값}을 아이디별로 리스트의 형태로 받아오게 된다.(아래 참고)
{checkFollow=[{FOLLOWERID=gami, CHECKFOLLOW=false}]
</aside>
<aside> 💡
화면단에서는 받은 리스트를 jstl을 이용하여 변수로 선언해 회원 정보 리스트와 여부값 리스트를 포문에서 돌려 아이디가 같을경우 isFollowing에 값을 담아주고 해당 값을 이용하여 조건에 따른 버튼색을 달리함.
<c:forEach var="check" items="${followLists.checkFollow}">
<c:if test="${check.FOLLOWERID == follower.memberId}">
<c:set var="isFollowing" value="${check.CHECKFOLLOW}" />
</c:if>
</c:forEach>
</aside>