From 7dc8743518d7423ef4946efecb97d3e83d3b5f8b Mon Sep 17 00:00:00 2001 From: ooni Date: Tue, 4 Feb 2025 19:09:18 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Feature(#4)=20:=20WebSocket=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=9A=94=EC=B2=AD=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EC=96=91=EC=8B=9D=20=EC=9E=91=EC=84=B1,=20MessageType=20?= =?UTF-8?q?=EC=A7=80=EC=A0=95,=20Game=EC=AA=BD=20Feign=20API=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/MessageType.java | 8 ++++++++ .../controller/NotificationController.java | 8 ++++---- .../controller/client/GameServiceClient.java | 2 +- .../controller/dto/request/WebSocketMessageReq.java | 9 +++++++++ ...cketMessageResponse.java => WebSocketMessageRes.java} | 3 ++- .../domain/service/NotificationService.java | 6 ++---- .../domain/service/NotificationServiceImpl.java | 7 +++---- 7 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java rename src/main/java/urdego/io/urdego_notification_service/controller/dto/response/{WebSocketMessageResponse.java => WebSocketMessageRes.java} (76%) diff --git a/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java b/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java new file mode 100644 index 0000000..0255d4c --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java @@ -0,0 +1,8 @@ +package urdego.io.urdego_notification_service.common.enums; + +public enum MessageType { + PLAYER_JOINED, + PLAYER_REMOVED, + PLAYER_READY, + CONTENT_SELECTED +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java index b7e16f6..5bf1dc9 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageResponse; +import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; import urdego.io.urdego_notification_service.domain.entity.Notification; import urdego.io.urdego_notification_service.domain.service.NotificationService; @@ -24,10 +24,10 @@ public class NotificationController { private final NotificationService notificationService; @PostMapping("/send") - @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = WebSocketMessageResponse.class))) + @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = WebSocketMessageRes.class))) @Operation(summary = "게임초대 알림 전송",description = "userId로 게임초대 알림 전송") - public ResponseEntity> sendNotification(@RequestBody NotificationRequest request) { - WebSocketMessageResponse response = notificationService.publishNotification(request); + public ResponseEntity> sendNotification(@RequestBody NotificationRequest request) { + WebSocketMessageRes response = notificationService.publishNotification(request); return ResponseEntity.ok().body(response); } diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java index 5da744f..608aac4 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java @@ -8,7 +8,7 @@ import urdego.io.urdego_notification_service.controller.dto.request.PlayerReq; import urdego.io.urdego_notification_service.controller.dto.response.RoomPlayersRes; -@FeignClient(name = "game-service", url = "${feign.client.config.service.url}") +@FeignClient(name = "game-service") public interface GameServiceClient { @PostMapping("/player/invite") ResponseEntity invitePlayer(@RequestBody PlayerReq request); diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java new file mode 100644 index 0000000..241dc19 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java @@ -0,0 +1,9 @@ +package urdego.io.urdego_notification_service.controller.dto.request; + +import urdego.io.urdego_notification_service.common.enums.MessageType; + +public record WebSocketMessageReq( + MessageType messageType, + T payload +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageResponse.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java similarity index 76% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageResponse.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java index 45a51a2..04682d2 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageResponse.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java @@ -7,6 +7,7 @@ @Getter @AllArgsConstructor @NoArgsConstructor -public class WebSocketMessageResponse { +public class WebSocketMessageRes { + private String messageType; private T data; } diff --git a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java index 798adff..0a5eae1 100644 --- a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java +++ b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java @@ -1,9 +1,7 @@ package urdego.io.urdego_notification_service.domain.service; -import org.springframework.stereotype.Service; import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.NotificationResponse; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageResponse; +import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; import urdego.io.urdego_notification_service.domain.entity.Notification; import java.util.List; @@ -11,7 +9,7 @@ public interface NotificationService { //메세지 발행 - public WebSocketMessageResponse publishNotification(NotificationRequest notificationRequest); + public WebSocketMessageRes publishNotification(NotificationRequest notificationRequest); //사용자 별 메세지 확인 List getUserNotifications(Long userId); diff --git a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java index e769135..61b95f9 100644 --- a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java +++ b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java @@ -6,8 +6,7 @@ import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.NotificationResponse; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageResponse; +import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; import urdego.io.urdego_notification_service.domain.entity.Notification; import java.util.List; @@ -23,11 +22,11 @@ public class NotificationServiceImpl implements NotificationService { private static final long EXPIRATION_TIME = 3; @Override - public WebSocketMessageResponse publishNotification(NotificationRequest request) { + public WebSocketMessageRes publishNotification(NotificationRequest request) { Notification notification = Notification.of(request); //프로토콜 감싸기 - WebSocketMessageResponse message = new WebSocketMessageResponse<>(notification); + WebSocketMessageRes message = new WebSocketMessageRes<>(notification); simpMessagingTemplate.convertAndSend("/urdego/sub/notifications/" + notification.getTargetId(), message); log.info("Published notification : senderId {}, targetId {} " , notification.getSenderId(), notification.getTargetId()); From fe8da69fafdad62535069b3ecb896a4207fa5a37 Mon Sep 17 00:00:00 2001 From: ooni Date: Tue, 4 Feb 2025 19:10:09 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Feature(#4)=20:=20Reflection=20API=20?= =?UTF-8?q?=ED=99=9C=EC=9A=A9=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EB=A7=A4=ED=95=91,=20Socket=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20MessageType=20=EB=84=A3=EC=96=B4?= =?UTF-8?q?=EC=84=9C=20=EC=9D=BC=EA=B4=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NotificationSocketController.java | 53 +++++++++++-------- .../controller/util/ReflectionUtil.java | 33 ++++++++++++ 2 files changed, 63 insertions(+), 23 deletions(-) create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/util/ReflectionUtil.java diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java index 50345fa..004418b 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java @@ -1,14 +1,19 @@ package urdego.io.urdego_notification_service.controller; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Controller; +import urdego.io.urdego_notification_service.common.enums.MessageType; import urdego.io.urdego_notification_service.controller.client.GameServiceClient; import urdego.io.urdego_notification_service.controller.dto.request.ContentSelectReq; import urdego.io.urdego_notification_service.controller.dto.request.PlayerReq; -import urdego.io.urdego_notification_service.controller.dto.response.RoomPlayersRes; +import urdego.io.urdego_notification_service.controller.dto.request.WebSocketMessageReq; +import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; +import urdego.io.urdego_notification_service.controller.util.ReflectionUtil; +@Slf4j @Controller @RequiredArgsConstructor public class NotificationSocketController { @@ -16,31 +21,33 @@ public class NotificationSocketController { private final GameServiceClient gameServiceClient; private final SimpMessagingTemplate messagingTemplate; - // 플레이어 참여 - @MessageMapping("/room/player/invite") - public void invitePlayer(PlayerReq request) { - RoomPlayersRes response = gameServiceClient.invitePlayer(request).getBody(); - messagingTemplate.convertAndSend("/urdego/sub/" + response.roomId(), response); + @MessageMapping("/room/event") + public void handleRoomEvent(WebSocketMessageReq request) { + Object response = null; + switch (request.messageType()) { + case PLAYER_JOINED -> response = gameServiceClient.invitePlayer((PlayerReq) request.payload()).getBody(); + case PLAYER_REMOVED -> response = gameServiceClient.removePlayer((PlayerReq) request.payload()).getBody(); + case PLAYER_READY -> response = gameServiceClient.readyPlayer((PlayerReq) request.payload()).getBody(); + case CONTENT_SELECTED -> response = gameServiceClient.selectContent((ContentSelectReq) request.payload()).getBody(); + } + sendMessage(response, request.messageType()); } - // 플레이어 삭제 - @MessageMapping("/room/player/remove") - public void removePlayer(PlayerReq request) { - RoomPlayersRes response = gameServiceClient.removePlayer(request).getBody(); - messagingTemplate.convertAndSend("/urdego/sub/" + response.roomId(), response); - } - // 플레이어 준비 - @MessageMapping("/room/player/ready") - public void readyPlayer(PlayerReq request) { - RoomPlayersRes response = gameServiceClient.readyPlayer(request).getBody(); - messagingTemplate.convertAndSend("/urdego/sub/" + response.roomId(), response); - } - // 컨텐츠 선택 - @MessageMapping("/room/select-content") - public void selectContent(ContentSelectReq request) { - gameServiceClient.selectContent(request); + private void sendMessage(T response, MessageType messageType) { + if (response == null) { + log.info("빈 응답이므로 기본 메시지를 전송합니다."); + return; + } + try { + String roomId = ReflectionUtil.getRoomIdFromResponse(response); + messagingTemplate.convertAndSend( + "/urdego/sub/" + roomId, + new WebSocketMessageRes<>(messageType.name(), response) + ); + } catch (IllegalArgumentException e) { + log.error("roomId 조회 실패: {}", e.getMessage()); + } } - } diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/util/ReflectionUtil.java b/src/main/java/urdego/io/urdego_notification_service/controller/util/ReflectionUtil.java new file mode 100644 index 0000000..e408912 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/util/ReflectionUtil.java @@ -0,0 +1,33 @@ +package urdego.io.urdego_notification_service.controller.util; + +import org.springframework.stereotype.Component; + +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Component +public class ReflectionUtil { + private static final Map, Method> methodCache = new ConcurrentHashMap<>(); + + public static String getRoomIdFromResponse(Object response) { + if (response == null) { + throw new IllegalArgumentException("응답 객체가 null입니다."); + } + + try { + Method method = methodCache.computeIfAbsent(response.getClass(), clazz -> { + try { + return clazz.getMethod("roomId"); + } catch (NoSuchMethodException e) { + throw new IllegalArgumentException("roomId를 찾을 수 없는 응답 타입: " + clazz.getSimpleName(), e); + } + }); + + return (String) method.invoke(response); + + } catch (Exception e) { + throw new IllegalArgumentException("roomId 호출 실패: " + response.getClass().getSimpleName(), e); + } + } +} From ab358e66002205a5ed0010d1e7db1a37aa9e8528 Mon Sep 17 00:00:00 2001 From: ooni Date: Tue, 4 Feb 2025 20:33:07 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Feature(#4)=20:=20Game=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?Feign=20=EB=B0=8F=20Socket=20=EC=9E=91=EC=84=B1,=20dto=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EA=B0=9C=EC=84=A0,=20Notification=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=ED=83=80=EC=9E=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/MessageType.java | 14 ++++++++- .../controller/NotificationController.java | 10 +++--- .../NotificationSocketController.java | 25 +++++++++++---- .../controller/client/GameServiceClient.java | 31 ++++++++++++++----- ...tMessageReq.java => WebSocketMessage.java} | 4 +-- .../dto/request/game/AnswerReq.java | 9 ++++++ .../dto/request/game/QuestionReq.java | 7 +++++ .../controller/dto/request/game/ScoreReq.java | 7 +++++ .../NotificationRequest.java | 2 +- .../request/{ => room}/ContentSelectReq.java | 2 +- .../dto/request/{ => room}/PlayerReq.java | 2 +- .../dto/response/WebSocketMessageRes.java | 13 -------- .../dto/response/game/AnswerRes.java | 9 ++++++ .../dto/response/game/GameEndRes.java | 14 +++++++++ .../dto/response/game/QuestionRes.java | 14 +++++++++ .../dto/response/game/ScoreRes.java | 10 ++++++ .../NotificationResponse.java | 2 +- .../response/{ => room}/RoomPlayersRes.java | 2 +- .../domain/entity/Notification.java | 2 +- .../domain/service/NotificationService.java | 6 ++-- .../service/NotificationServiceImpl.java | 9 +++--- 21 files changed, 147 insertions(+), 47 deletions(-) rename src/main/java/urdego/io/urdego_notification_service/controller/dto/{request/WebSocketMessageReq.java => WebSocketMessage.java} (54%) create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/AnswerReq.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/QuestionReq.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/ScoreReq.java rename src/main/java/urdego/io/urdego_notification_service/controller/dto/request/{ => notification}/NotificationRequest.java (98%) rename src/main/java/urdego/io/urdego_notification_service/controller/dto/request/{ => room}/ContentSelectReq.java (94%) rename src/main/java/urdego/io/urdego_notification_service/controller/dto/request/{ => room}/PlayerReq.java (93%) delete mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/AnswerRes.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/GameEndRes.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/QuestionRes.java create mode 100644 src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/ScoreRes.java rename src/main/java/urdego/io/urdego_notification_service/controller/dto/response/{ => notification}/NotificationResponse.java (94%) rename src/main/java/urdego/io/urdego_notification_service/controller/dto/response/{ => room}/RoomPlayersRes.java (96%) diff --git a/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java b/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java index 0255d4c..7350103 100644 --- a/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java +++ b/src/main/java/urdego/io/urdego_notification_service/common/enums/MessageType.java @@ -1,8 +1,20 @@ package urdego.io.urdego_notification_service.common.enums; public enum MessageType { + // 알림 + NOTIFICATION, + // 대기방 PLAYER_JOINED, PLAYER_REMOVED, PLAYER_READY, - CONTENT_SELECTED + CONTENT_SELECTED, + // 게임 + SCORE_UPDATED, + GAME_ENDED, + // 라운드 진행 + QUESTION_GIVEN, + ANSWER_SUBMITTED + + + } diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java index 5bf1dc9..e5f280f 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationController.java @@ -11,8 +11,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; +import urdego.io.urdego_notification_service.controller.dto.request.notification.NotificationRequest; +import urdego.io.urdego_notification_service.controller.dto.WebSocketMessage; import urdego.io.urdego_notification_service.domain.entity.Notification; import urdego.io.urdego_notification_service.domain.service.NotificationService; @@ -24,10 +24,10 @@ public class NotificationController { private final NotificationService notificationService; @PostMapping("/send") - @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = WebSocketMessageRes.class))) + @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation = WebSocketMessage.class))) @Operation(summary = "게임초대 알림 전송",description = "userId로 게임초대 알림 전송") - public ResponseEntity> sendNotification(@RequestBody NotificationRequest request) { - WebSocketMessageRes response = notificationService.publishNotification(request); + public ResponseEntity> sendNotification(@RequestBody NotificationRequest request) { + WebSocketMessage response = notificationService.publishNotification(request); return ResponseEntity.ok().body(response); } diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java index 004418b..490772a 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/NotificationSocketController.java @@ -7,10 +7,12 @@ import org.springframework.stereotype.Controller; import urdego.io.urdego_notification_service.common.enums.MessageType; import urdego.io.urdego_notification_service.controller.client.GameServiceClient; -import urdego.io.urdego_notification_service.controller.dto.request.ContentSelectReq; -import urdego.io.urdego_notification_service.controller.dto.request.PlayerReq; -import urdego.io.urdego_notification_service.controller.dto.request.WebSocketMessageReq; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; +import urdego.io.urdego_notification_service.controller.dto.WebSocketMessage; +import urdego.io.urdego_notification_service.controller.dto.request.game.AnswerReq; +import urdego.io.urdego_notification_service.controller.dto.request.game.QuestionReq; +import urdego.io.urdego_notification_service.controller.dto.request.game.ScoreReq; +import urdego.io.urdego_notification_service.controller.dto.request.room.ContentSelectReq; +import urdego.io.urdego_notification_service.controller.dto.request.room.PlayerReq; import urdego.io.urdego_notification_service.controller.util.ReflectionUtil; @Slf4j @@ -22,7 +24,7 @@ public class NotificationSocketController { private final SimpMessagingTemplate messagingTemplate; @MessageMapping("/room/event") - public void handleRoomEvent(WebSocketMessageReq request) { + public void handleRoomEvent(WebSocketMessage request) { Object response = null; switch (request.messageType()) { case PLAYER_JOINED -> response = gameServiceClient.invitePlayer((PlayerReq) request.payload()).getBody(); @@ -33,7 +35,18 @@ public void handleRoomEvent(WebSocketMessageReq request) { sendMessage(response, request.messageType()); } + @MessageMapping("/game/event") + public void handleGameEvent(WebSocketMessage request) { + Object response = null; + switch (request.messageType()) { + case SCORE_UPDATED -> response = gameServiceClient.giveScores((ScoreReq) request.payload()).getBody(); + case GAME_ENDED -> response = gameServiceClient.endGame((String) request.payload()).getBody(); + case QUESTION_GIVEN -> response = gameServiceClient.giveQuestion((QuestionReq) request.payload()).getBody(); + case ANSWER_SUBMITTED -> response = gameServiceClient.submitAnswer((AnswerReq) request.payload()).getBody(); + } + sendMessage(response, request.messageType()); + } private void sendMessage(T response, MessageType messageType) { if (response == null) { @@ -44,7 +57,7 @@ private void sendMessage(T response, MessageType messageType) { String roomId = ReflectionUtil.getRoomIdFromResponse(response); messagingTemplate.convertAndSend( "/urdego/sub/" + roomId, - new WebSocketMessageRes<>(messageType.name(), response) + new WebSocketMessage<>(messageType, response) ); } catch (IllegalArgumentException e) { log.error("roomId 조회 실패: {}", e.getMessage()); diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java index 608aac4..f9f473a 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java @@ -4,23 +4,40 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import urdego.io.urdego_notification_service.controller.dto.request.ContentSelectReq; -import urdego.io.urdego_notification_service.controller.dto.request.PlayerReq; -import urdego.io.urdego_notification_service.controller.dto.response.RoomPlayersRes; +import urdego.io.urdego_notification_service.controller.dto.request.game.AnswerReq; +import urdego.io.urdego_notification_service.controller.dto.request.game.QuestionReq; +import urdego.io.urdego_notification_service.controller.dto.request.game.ScoreReq; +import urdego.io.urdego_notification_service.controller.dto.request.room.ContentSelectReq; +import urdego.io.urdego_notification_service.controller.dto.request.room.PlayerReq; +import urdego.io.urdego_notification_service.controller.dto.response.game.AnswerRes; +import urdego.io.urdego_notification_service.controller.dto.response.game.GameEndRes; +import urdego.io.urdego_notification_service.controller.dto.response.game.QuestionRes; +import urdego.io.urdego_notification_service.controller.dto.response.game.ScoreRes; +import urdego.io.urdego_notification_service.controller.dto.response.room.RoomPlayersRes; @FeignClient(name = "game-service") public interface GameServiceClient { - @PostMapping("/player/invite") + @PostMapping("/api/game-service/room/player/invite") ResponseEntity invitePlayer(@RequestBody PlayerReq request); - @PostMapping("/player/remove") + @PostMapping("/api/game-service/room/player/remove") ResponseEntity removePlayer(@RequestBody PlayerReq request); - @PostMapping("/player/ready") + @PostMapping("/api/game-service/room/player/ready") ResponseEntity readyPlayer(@RequestBody PlayerReq request); - @PostMapping("/select-content") + @PostMapping("/api/game-service/room/select-content") ResponseEntity selectContent(@RequestBody ContentSelectReq request); + @PostMapping("/api/game-service/game/score") + ResponseEntity giveScores(@RequestBody ScoreReq request); + @PostMapping("/api/game-service/game/end") + ResponseEntity endGame(@RequestBody String gameId); + + @PostMapping("/api/game-service/round/question") + ResponseEntity giveQuestion(@RequestBody QuestionReq request); + + @PostMapping("/api/game-service/round/answer") + ResponseEntity submitAnswer(@RequestBody AnswerReq request); } diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/WebSocketMessage.java similarity index 54% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/WebSocketMessage.java index 241dc19..2ee2b7e 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/WebSocketMessageReq.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/WebSocketMessage.java @@ -1,8 +1,8 @@ -package urdego.io.urdego_notification_service.controller.dto.request; +package urdego.io.urdego_notification_service.controller.dto; import urdego.io.urdego_notification_service.common.enums.MessageType; -public record WebSocketMessageReq( +public record WebSocketMessage( MessageType messageType, T payload ) { diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/AnswerReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/AnswerReq.java new file mode 100644 index 0000000..9072ff5 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/AnswerReq.java @@ -0,0 +1,9 @@ +package urdego.io.urdego_notification_service.controller.dto.request.game; + +public record AnswerReq( + String questionId, + String userId, + double latitude, + double longitude +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/QuestionReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/QuestionReq.java new file mode 100644 index 0000000..726be1f --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/QuestionReq.java @@ -0,0 +1,7 @@ +package urdego.io.urdego_notification_service.controller.dto.request.game; + +public record QuestionReq( + String roomId, + int roundNum +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/ScoreReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/ScoreReq.java new file mode 100644 index 0000000..4524bc5 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/game/ScoreReq.java @@ -0,0 +1,7 @@ +package urdego.io.urdego_notification_service.controller.dto.request.game; + +public record ScoreReq( + String gameId, + int roundNum +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/NotificationRequest.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/notification/NotificationRequest.java similarity index 98% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/request/NotificationRequest.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/request/notification/NotificationRequest.java index e75152c..72d989d 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/NotificationRequest.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/notification/NotificationRequest.java @@ -1,4 +1,4 @@ -package urdego.io.urdego_notification_service.controller.dto.request; +package urdego.io.urdego_notification_service.controller.dto.request.notification; import lombok.Builder; import urdego.io.urdego_notification_service.domain.entity.Notification; diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/ContentSelectReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/ContentSelectReq.java similarity index 94% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/request/ContentSelectReq.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/ContentSelectReq.java index afdfebd..1de42b8 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/ContentSelectReq.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/ContentSelectReq.java @@ -1,4 +1,4 @@ -package urdego.io.urdego_notification_service.controller.dto.request; +package urdego.io.urdego_notification_service.controller.dto.request.room; import java.util.List; diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/PlayerReq.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/PlayerReq.java similarity index 93% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/request/PlayerReq.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/PlayerReq.java index 14d4242..66bc645 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/PlayerReq.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/request/room/PlayerReq.java @@ -1,4 +1,4 @@ -package urdego.io.urdego_notification_service.controller.dto.request; +package urdego.io.urdego_notification_service.controller.dto.request.room; public record PlayerReq( String roomId, diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java deleted file mode 100644 index 04682d2..0000000 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/WebSocketMessageRes.java +++ /dev/null @@ -1,13 +0,0 @@ -package urdego.io.urdego_notification_service.controller.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@AllArgsConstructor -@NoArgsConstructor -public class WebSocketMessageRes { - private String messageType; - private T data; -} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/AnswerRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/AnswerRes.java new file mode 100644 index 0000000..3b41239 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/AnswerRes.java @@ -0,0 +1,9 @@ +package urdego.io.urdego_notification_service.controller.dto.response.game; + +public record AnswerRes( + String questionId, + String userId, + double latitude, + double longitude +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/GameEndRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/GameEndRes.java new file mode 100644 index 0000000..7346b16 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/GameEndRes.java @@ -0,0 +1,14 @@ +package urdego.io.urdego_notification_service.controller.dto.response.game; + +import urdego.io.urdego_notification_service.common.enums.Status; + +import java.util.Map; + +public record GameEndRes( + String gameId, + String roomId, + Status status, + Map totalScores, + Map exp +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/QuestionRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/QuestionRes.java new file mode 100644 index 0000000..c9f6690 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/QuestionRes.java @@ -0,0 +1,14 @@ +package urdego.io.urdego_notification_service.controller.dto.response.game; + +import java.util.List; + +public record QuestionRes( + String questionId, + String roomId, + int roundNum, + double latitude, + double longitude, + String hint, + List contents +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/ScoreRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/ScoreRes.java new file mode 100644 index 0000000..8d89ab8 --- /dev/null +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/game/ScoreRes.java @@ -0,0 +1,10 @@ +package urdego.io.urdego_notification_service.controller.dto.response.game; + +import java.util.Map; + +public record ScoreRes( + String roomId, + Map> roundScores, + Map totalScores +) { +} diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/NotificationResponse.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/notification/NotificationResponse.java similarity index 94% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/response/NotificationResponse.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/response/notification/NotificationResponse.java index 13642f7..17fb14b 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/NotificationResponse.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/notification/NotificationResponse.java @@ -1,4 +1,4 @@ -package urdego.io.urdego_notification_service.controller.dto.response; +package urdego.io.urdego_notification_service.controller.dto.response.notification; import java.util.UUID; diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/RoomPlayersRes.java b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/room/RoomPlayersRes.java similarity index 96% rename from src/main/java/urdego/io/urdego_notification_service/controller/dto/response/RoomPlayersRes.java rename to src/main/java/urdego/io/urdego_notification_service/controller/dto/response/room/RoomPlayersRes.java index 7a7379a..5e850f9 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/RoomPlayersRes.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/dto/response/room/RoomPlayersRes.java @@ -1,4 +1,4 @@ -package urdego.io.urdego_notification_service.controller.dto.response; +package urdego.io.urdego_notification_service.controller.dto.response.room; import urdego.io.urdego_notification_service.common.enums.Status; diff --git a/src/main/java/urdego/io/urdego_notification_service/domain/entity/Notification.java b/src/main/java/urdego/io/urdego_notification_service/domain/entity/Notification.java index 09060c1..52eaf74 100644 --- a/src/main/java/urdego/io/urdego_notification_service/domain/entity/Notification.java +++ b/src/main/java/urdego/io/urdego_notification_service/domain/entity/Notification.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; import urdego.io.urdego_notification_service.common.enums.Action; -import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; +import urdego.io.urdego_notification_service.controller.dto.request.notification.NotificationRequest; import java.io.Serializable; import java.time.LocalDateTime; diff --git a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java index 0a5eae1..c23fd20 100644 --- a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java +++ b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationService.java @@ -1,7 +1,7 @@ package urdego.io.urdego_notification_service.domain.service; -import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; +import urdego.io.urdego_notification_service.controller.dto.request.notification.NotificationRequest; +import urdego.io.urdego_notification_service.controller.dto.WebSocketMessage; import urdego.io.urdego_notification_service.domain.entity.Notification; import java.util.List; @@ -9,7 +9,7 @@ public interface NotificationService { //메세지 발행 - public WebSocketMessageRes publishNotification(NotificationRequest notificationRequest); + public WebSocketMessage publishNotification(NotificationRequest notificationRequest); //사용자 별 메세지 확인 List getUserNotifications(Long userId); diff --git a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java index 61b95f9..08c450e 100644 --- a/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java +++ b/src/main/java/urdego/io/urdego_notification_service/domain/service/NotificationServiceImpl.java @@ -5,8 +5,9 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; -import urdego.io.urdego_notification_service.controller.dto.request.NotificationRequest; -import urdego.io.urdego_notification_service.controller.dto.response.WebSocketMessageRes; +import urdego.io.urdego_notification_service.common.enums.MessageType; +import urdego.io.urdego_notification_service.controller.dto.request.notification.NotificationRequest; +import urdego.io.urdego_notification_service.controller.dto.WebSocketMessage; import urdego.io.urdego_notification_service.domain.entity.Notification; import java.util.List; @@ -22,11 +23,11 @@ public class NotificationServiceImpl implements NotificationService { private static final long EXPIRATION_TIME = 3; @Override - public WebSocketMessageRes publishNotification(NotificationRequest request) { + public WebSocketMessage publishNotification(NotificationRequest request) { Notification notification = Notification.of(request); //프로토콜 감싸기 - WebSocketMessageRes message = new WebSocketMessageRes<>(notification); + WebSocketMessage message = new WebSocketMessage<>(MessageType.NOTIFICATION, notification); simpMessagingTemplate.convertAndSend("/urdego/sub/notifications/" + notification.getTargetId(), message); log.info("Published notification : senderId {}, targetId {} " , notification.getSenderId(), notification.getTargetId()); From 9ccd5a7e3aa5b9dbea5e7ff8f8ff5c5b74c68507 Mon Sep 17 00:00:00 2001 From: ooni Date: Wed, 5 Feb 2025 14:36:07 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Refactor(#4)=20:=20Feign=EC=AA=BD=20Request?= =?UTF-8?q?Mapping=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/client/GameServiceClient.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java index f9f473a..5d6098b 100644 --- a/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java +++ b/src/main/java/urdego/io/urdego_notification_service/controller/client/GameServiceClient.java @@ -4,6 +4,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import urdego.io.urdego_notification_service.controller.dto.request.game.AnswerReq; import urdego.io.urdego_notification_service.controller.dto.request.game.QuestionReq; import urdego.io.urdego_notification_service.controller.dto.request.game.ScoreReq; @@ -16,28 +17,29 @@ import urdego.io.urdego_notification_service.controller.dto.response.room.RoomPlayersRes; @FeignClient(name = "game-service") +@RequestMapping("/api/game-service") public interface GameServiceClient { - @PostMapping("/api/game-service/room/player/invite") + @PostMapping("/room/player/invite") ResponseEntity invitePlayer(@RequestBody PlayerReq request); - @PostMapping("/api/game-service/room/player/remove") + @PostMapping("/room/player/remove") ResponseEntity removePlayer(@RequestBody PlayerReq request); - @PostMapping("/api/game-service/room/player/ready") + @PostMapping("/room/player/ready") ResponseEntity readyPlayer(@RequestBody PlayerReq request); - @PostMapping("/api/game-service/room/select-content") + @PostMapping("/room/select-content") ResponseEntity selectContent(@RequestBody ContentSelectReq request); - @PostMapping("/api/game-service/game/score") + @PostMapping("/game/score") ResponseEntity giveScores(@RequestBody ScoreReq request); - @PostMapping("/api/game-service/game/end") + @PostMapping("/game/end") ResponseEntity endGame(@RequestBody String gameId); - @PostMapping("/api/game-service/round/question") + @PostMapping("/round/question") ResponseEntity giveQuestion(@RequestBody QuestionReq request); - @PostMapping("/api/game-service/round/answer") + @PostMapping("/round/answer") ResponseEntity submitAnswer(@RequestBody AnswerReq request); }