팔로워, 팔로잉 리스트 다이어그램.drawio.png

팔로워, 팔로잉 리스트 다이어그램.drawio

FollowController

@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();
				}

FollowServiceImpl

// 팔로우 리스트
	@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;
	}

FollowDAOImpl

	// 팔로워 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);
	}

follow.xml

<!-- 팔로워 아이디 리스트 -->  
  <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>

follower.jsp

<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>