diff --git a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java index 6dd8e1f8..00f65333 100644 --- a/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java +++ b/src/main/java/org/cotato/csquiz/common/websocket/WebSocketHandler.java @@ -38,17 +38,24 @@ public class WebSocketHandler extends TextWebSocketHandler { private static final String MEMBER_ID_KEY = "memberId"; private static final String EDUCATION_ID_KEY = "educationId"; private static final String ROLE_KEY = "role"; + private static final CloseStatus ATTEMPT_NEW_CONNECTION = new CloseStatus(4001, "new connection request"); private final ObjectMapper objectMapper = new ObjectMapper(); private final QuizRepository quizRepository; @Override - public void afterConnectionEstablished(WebSocketSession session) { + public void afterConnectionEstablished(WebSocketSession session) throws IOException { String memberId = findAttributeByToken(session, MEMBER_ID_KEY); Long educationId = Long.parseLong(findAttributeByToken(session, EDUCATION_ID_KEY)); String role = findAttributeByToken(session, ROLE_KEY); MemberRole memberRole = MemberRole.fromKey(role); - addMemberToSession(memberId, session); + if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) { + handleSessionReplacement(memberId, CLIENTS); + CLIENTS.put(memberId, session); + } else { + handleSessionReplacement(memberId, MANAGERS); + MANAGERS.put(memberId, session); + } if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, memberRole)) { sendCurrentOpenQuiz(educationId, session); @@ -57,6 +64,14 @@ public void afterConnectionEstablished(WebSocketSession session) { log.info("[세션 연결] {}, 연결된 세션: {}", memberId, session.getId()); } + private void handleSessionReplacement(String memberId, ConcurrentHashMap managers) + throws IOException { + if (managers.containsKey(memberId)) { + managers.get(memberId).close(ATTEMPT_NEW_CONNECTION); + managers.remove(memberId); + } + } + private void sendCurrentOpenQuiz(Long educationId, WebSocketSession session) { Optional maybeQuiz = quizRepository.findByStatusAndEducationId(QuizStatus.QUIZ_ON, educationId); @@ -147,19 +162,6 @@ public void stopAllQuiz(Long educationId) { } } - private void addMemberToSession(String memberId, WebSocketSession session) { - String roleAttribute = findAttributeByToken(session, ROLE_KEY); - MemberRole role = MemberRole.fromKey(roleAttribute); - - if (MemberRoleGroup.hasRole(MemberRoleGroup.CLIENTS, role)) { - CLIENTS.put(memberId, session); - log.info("[부원 연결] : {} , 세션 ID : {}" , memberId, session.getId()); - } else { - MANAGERS.put(memberId, session); - log.info("[관리자 연결] : {} , 세션 ID : {}" , memberId, session.getId()); - } - } - private String findAttributeByToken(WebSocketSession session, String key) { return session.getAttributes().get(key).toString(); }