고래씌
[Spring] 10-5. 채팅방 나가기 본문
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>
▶ 결과

'Server > Spring' 카테고리의 다른 글
[Spring] 11-2. 인터셉터 이용해서 로깅 처리 (0) | 2024.01.30 |
---|---|
[Spring] 11-1. 로그 처리 (0) | 2024.01.30 |
[Spring] 10-4. 채팅방 메세지 통신 (F5를 누르지않아도 바로 생성되도록 작업) (0) | 2024.01.30 |
[Spring] 10-3. 채팅방 통신(채팅방 메세지 추가) (0) | 2024.01.30 |
[Spring] 10-2. 채팅방 참여, 인원수 증가, 메세지 조회 (0) | 2024.01.29 |