고래씌

[Spring] 10-5. 채팅방 나가기 본문

Server/Spring

[Spring] 10-5. 채팅방 나가기

고래씌 2024. 1. 30. 12:29

1. 채팅방 나가기

 
▶ chat.js

// 채팅방 나가기
let exitBtn = document.querySelector("#exit-btn");
exitBtn.onclick = function() {
    location.href = `${contextPath}/chat/chatRoom/${chatRoomNo}/exit`;
}

 
 
▶ ChatController.java
 
☞ 채팅방 나가기 → 만약 채팅방에 마지막으로 나간 인원이 본인이라면 채팅방 삭제처리

//	채팅방 나가기
	@GetMapping("/chatRoom/{chatRoomNo}/exit")
	public String exitChatRoom(
			@ModelAttribute("loginUser") Member loginUser,
			@PathVariable("chatRoomNo") int chatRoomNo,
			ChatRoomJoin join,
			RedirectAttributes ra
			) {
		
		// DELETE FROM CHAT_ROOM_JOIN WHERE CHAT_ROOM_NO = ? AND USER_NO = ?
		join.setChatRoomNo(chatRoomNo);
		join.setUserNo(loginUser.getUserNo());
		
		// 채팅방 나가기 → 만약 채팅방에 마지막으로 나간 인원이 본인이라면 채팅방 삭제처리
		
		chatService.exitChatRoom(join);
		ra.addFlashAttribute("alertMsg", "채팅방을 나갔습니다.");
		
		
		return "redirect:/chat/chatRoomList";  // 채팅방 목록으로 리다이렉트 시킴
	}

 
 
▶ ChatService.java

void exitChatRoom(ChatRoomJoin join);

 
 
▶ ChatServiceImpl.java

//	채팅방 나가기
	@Transactional(rollbackFor = Exception.class)   // 어떠한 예외가 발생했을때 rollback을 시키겠다!
	@Override
	public void exitChatRoom(ChatRoomJoin join) {
		// 1) 채팅방 나가기 → CHAT_ROOM_JOIN 테이블에서 DELETE문 수행
		int result = dao.exitChatRoom(join);
		
		// 2) 현재 채팅방 인원이 0명인 경우 → CHAT_ROOM 테이블에서 STATUS 값 업데이트
		if(result > 0) {
			
			// 현재 채팅방 인원이 몇명인지 확인
			int cnt = dao.countChatRoomMember(join);
			
			// 내가 마지막으로 나간 경우 → CHAT_ROOM 테이블에서 STATUS값을 변경 (UPDATE)
			if(cnt == 0) {
				result = dao.closeChatRoom(join);
			}
		}
	}

 
 
▶ ChatDao.java
 
- 채팅방 나가기

	public int exitChatRoom(ChatRoomJoin join) {
		return sqlSession.delete("chatMapper.exitChatRoom", join);
	}

 
 
- 채팅방 인원수 확인

	public int countChatRoomMember(ChatRoomJoin join) {
		return sqlSession.selectOne("chatMapper.countChatRoomMember", join);
	}

 
 
- 모두 나가면 채팅방 삭제

	public int closeChatRoom(ChatRoomJoin join) {
		return sqlSession.update("chatMapper.closeChatRoom", join);
	}

 
 
▶ chat-mapper.xml
 
- 채팅방 나가기

	<!-- 채팅방 나가기 -->
	<delete id="exitChatRoom" parameterType="chatRoomJoin">
		DELETE FROM CHAT_ROOM_JOIN
		WHERE 
			USER_NO = #{userNo} AND CHAT_ROOM_NO = #{chatRoomNo}
	</delete>

 
 
- 채팅방 인원수 확인

	<!-- 채팅방 인원수 확인 -->
	<select id="countChatRoomMember" parameterType="chatRoomJoin" resultType="int">
		SELECT
			COUNT(*)
		FROM CHAT_ROOM_JOIN
		WHERE CHAT_ROOM_NO = #{chatRoomNo}
	</select>

 
 
- 모두 나가면 채팅방 삭제

	<!-- 채팅방 인원이 0일 경우 채팅방 삭제 -->
	<update id="closeChatRoom" parameterType="chatRoomJoin">
		UPDATE CHAT_ROOM
		   SET STATUS = 'N'
		 WHERE CHAT_ROOM_NO = #{chatRoomNo}
	</update>

 
 
 
▶ 결과