11package com .mbtips .common .handler ;
22
3+ import com .fasterxml .jackson .core .JsonProcessingException ;
34import com .fasterxml .jackson .databind .ObjectMapper ;
4- import com .mbtips .common .constant .Constant ;
55import com .mbtips .common .enums .WebSocketMessageType ;
66import com .mbtips .common .exception .CustomException ;
77import com .mbtips .domain .openChat .exception .OpenChatException ;
8- import com .mbtips .openChat .application .dto .OpenChatDto ;
98import com .mbtips .openChat .application .dto .OpenChatMessageDto ;
109import com .mbtips .openChat .application .service .OpenChatMessageService ;
1110import lombok .RequiredArgsConstructor ;
@@ -55,11 +54,11 @@ public void afterConnectionEstablished(WebSocketSession session) throws IOExcept
5554 long openChatId = Long .parseLong (queryParamMap .get (OPEN_CHAT_ID ));
5655 if (this .checkNickname (openChatId , queryParamMap .get (NICKNAME ))) {
5756 OpenChatMessageDto openChatMessageDto = OpenChatMessageDto .builder ()
58- .type (WebSocketMessageType .DUPLICATE_NICKNAME )
57+ .type (WebSocketMessageType .ERROR )
5958 .message (OpenChatException .DUPLICATED_NICKNAME .getMessage ())
6059 .openChatId (openChatId )
6160 .build ();
62- session . sendMessage ( new TextMessage ( objectMapper . writeValueAsString ( openChatMessageDto )) );
61+ broadcast ( Set . of ( session ), openChatMessageDto );
6362 throw new CustomException (OpenChatException .DUPLICATED_NICKNAME );
6463 }
6564
@@ -70,6 +69,12 @@ public void afterConnectionEstablished(WebSocketSession session) throws IOExcept
7069 session .getAttributes ().put (entry .getKey (), entry .getValue ());
7170 }
7271 webSocketSessionMap .computeIfAbsent (openChatId , k -> new HashSet <>()).add (session );
72+ OpenChatMessageDto enterNotice = OpenChatMessageDto .builder ()
73+ .type (WebSocketMessageType .NOTICE )
74+ .message (session .getAttributes ().get (NICKNAME ) + "님이 들어왔습니다." )
75+ .openChatId (openChatId )
76+ .build ();
77+ broadcast (webSocketSessionMap .get (openChatId ), enterNotice );
7378 }
7479
7580 @ Override
@@ -115,6 +120,12 @@ public void afterConnectionClosed(WebSocketSession session, CloseStatus status)
115120 throw new CustomException (OpenChatException .NOT_FOUND_OPEN_CHAT );
116121 }
117122 webSocketSessions .removeIf (webSocketSession -> webSocketSession .getId ().equals (session .getId ()));
123+ OpenChatMessageDto leaveNotice = OpenChatMessageDto .builder ()
124+ .type (WebSocketMessageType .NOTICE )
125+ .message (session .getAttributes ().get (NICKNAME ) + "님이 나가셨습니다." )
126+ .openChatId (openChatId )
127+ .build ();
128+ broadcast (webSocketSessions , leaveNotice );
118129 }
119130
120131 private Map <String , String > parseQueryParam (String query ) {
@@ -143,4 +154,16 @@ private boolean checkNickname(long openChatId, String nickname) {
143154 .equals (nickname )
144155 );
145156 }
157+
158+ private void broadcast (Set <WebSocketSession > sessions , OpenChatMessageDto openChatMessageDto ) throws JsonProcessingException {
159+ String messagePayload = objectMapper .writeValueAsString (openChatMessageDto );
160+ sessions .forEach (session -> {
161+ try {
162+ session .sendMessage (new TextMessage (messagePayload ));
163+ } catch (IOException e ) {
164+ log .error ("메세지 전송에 실패했습니다. {}" , messagePayload );
165+ throw new RuntimeException (e );
166+ }
167+ });
168+ }
146169}
0 commit comments