팔로우, 언팔로우(등록 취소) 리스트 다이어그램.drawio.png

팔로우, 언팔로우(등록 취소)다이어그램.drawio

FollowController

 	// 게시판에서나 상대방 페이지에서 팔로우 팔로잉 클릭할때 추가, 삭제
	@RequestMapping(value="/follow.do", method=RequestMethod.POST)
	public String boardfollow(@RequestParam("followId") String followId,
	                          HttpSession session, Model model) throws Exception {
		
		 // 세션에서 현재 로그인 아이디 가져오기
	    MemberDomain memberDomain = (MemberDomain) session.getAttribute("member");
	    String memberId = memberDomain.getMemberId();
	    
	    // 맵에 회원 아이디와 팔로우 아이디 넣기
	    Map<String, Object> followIds = new HashMap<>();
	    followIds.put("followId", followId);
	    followIds.put("memberId", memberId);
	    
	    String checkBoardFollow = "false";
	    
	    if(followService.checkBoardFollow(followIds) != null) {
	    	checkBoardFollow = followService.checkBoardFollow(followIds);
	    }
	    
	    System.out.println("팔로우 컨트롤러에서 checkBoardFollow : " + checkBoardFollow);
	    
	    if(checkBoardFollow.equals("true")) {
	    // 언팔
	    followService.deleteFollow(followIds);	  
 	
	    }else {
	    	
	    // 팔로우
	    followService.addFollow(followIds);	    	
	    }
	    
	    model.addAttribute("checkBoardFollow", checkBoardFollow);
	    
	    // 팔로우 팔로잉 수
	    int followCount = followService.followCount(memberId);
	    int followingCount = followService.followingCount(memberId);
	    
	    session.setAttribute("followCount", followCount);
	    session.setAttribute("followingCount", followingCount);
		
		return "/mypage/follow/follower";
	}

FollowServiceImpl

// 팔로우
	@Override
	public void addFollow(Map<String, Object> followIds) throws Exception {
		followDAO.addFollow(followIds);
	}
	
	// 언팔
	@Override
	public void deleteFollow(Map<String, Object> followIds) throws Exception {
		followDAO.deleteFollow(followIds);
	}
	
	// 게시판이나 상대방 페이지에서 팔로우 여부 체크
	@Override
	public String checkBoardFollow(Map<String, Object> followIds) throws Exception {
		return followDAO.checkBoardFollow(followIds);
	}
	
	// 팔로우 카운트
		@Override
	public int followCount(String memberId) throws Exception {
		return followDAO.followCount(memberId);
	}
	
	// 팔로잉 카운트
	@Override
	public int followingCount(String memberId) throws Exception {
		return followDAO.followingCount(memberId);
	}

FollowDAOImpl

 	// 팔로우 추가
	@Override
	public void addFollow(Map<String, Object> followIds) throws DataAccessException {
		sqlSession.insert("mapper.follow.addFollow", followIds);
	}

	// 팔로우 삭제
	@Override
	public void deleteFollow(Map<String, Object> followIds) throws DataAccessException {
		sqlSession.delete("mapper.follow.deleteFollow", followIds);
	}
	
	// 팔로우 여부 체크
	@Override
	public String checkBoardFollow(Map<String, Object> followIds) throws DataAccessException {
		return sqlSession.selectOne("mapper.follow.checkBoardFollow", followIds);
	}
	
	// 팔로우 카운트
	@Override
	public int followCount(String memberId) throws DataAccessException {
		return sqlSession.selectOne("mapper.follow.followCount", memberId);
	}

	// 팔로잉 카운트
	@Override
	public int followingCount(String memberId) throws DataAccessException {
		return sqlSession.selectOne("mapper.follow.followingCount", memberId);
	}
<!-- 팔로우 추가 -->
<insert id="addFollow" parameterType="MAP">
      <![CDATA[
      BEGIN
        INSERT INTO follower(memberId, followerId)
        VALUES(#{followId}, #{memberId});
        
        INSERT INTO following(memberId, followerId)
        VALUES(#{memberId}, #{followId});
      END;
      ]]>
  </insert>

<!-- 언팔 -->
<delete id="deleteFollow" parameterType="MAP">
	<![CDATA[
      BEGIN
        DELETE FROM follower
        WHERE  memberId = #{followId} AND followerId = #{memberId};
        
        DELETE FROM following
        WHERE  memberId = #{memberId} AND followerId = #{followId};
      END;
      ]]>
</delete>

<!-- 게시판이나 상대방 페이지에서 팔로우 여부 체크 -->
<select id="checkBoardFollow" parameterType="MAP" resultType="String">
        SELECT 
        CASE 
        WHEN EXISTS (
        SELECT 0
        FROM following 
        WHERE memberId = #{memberId} 
        AND followerId = #{followId}
        ) 
        THEN 'true' 
        ELSE 'false' 
        END
        FROM dual
</select>

<!-- 팔로워 수 -->  
  <select id="followCount" parameterType="String" resultType="int">
  <![CDATA[
            SELECT COUNT(followerId)
            from follower
            where memberId = #{memberId}
        ]]>
  </select>
  
<!-- 팔로잉 수 -->  
  <select id="followingCount" parameterType="String" resultType="int">
  <![CDATA[
            SELECT COUNT(followerId)
            from following
            where memberId = #{memberId}
        ]]>
  </select>

follower.jsp

// 버튼 클릭 시
function follow(followerId) {
	
    var followId = followerId;
    
    $.ajax({
        url: '/gami/mypage/follow/follow.do',
        type: 'POST',
        data: { followId: followId },
        
        success: function() {
            alert("팔로우 성공");
            location.reload();
        },
        
        error: function() {
            alert("팔로우 실패");
        }
    });
}

<aside> 💡

팔로우 여부를 체크해서 false면 추가하고 true면 지우게 함.

추가 혹은 삭제를 진행한 후에는 팔로우, 팔로잉 카운트를 세션에 넣어 사이드바에 띄울 수 있게 함. 버튼 클릭시 말고도 로그인할때, 마이페이지에 들어갈때도 조회하여 세션에 담을 수 있게 함.

</aside>