diff --git a/src/main/java/B1G4/bookmark/config/WebSocketConfig.java b/src/main/java/B1G4/bookmark/config/WebSocketConfig.java index 25d18fb..a4212bb 100644 --- a/src/main/java/B1G4/bookmark/config/WebSocketConfig.java +++ b/src/main/java/B1G4/bookmark/config/WebSocketConfig.java @@ -21,7 +21,8 @@ public void configureMessageBroker(MessageBrokerRegistry config) { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws") // WebSocket 엔드포인트 - .setAllowedOriginPatterns("*") // 모든 Origin 허용 + .setAllowedOriginPatterns("*") .withSockJS(); // SockJS Fallback 지원 } -} \ No newline at end of file +} + diff --git a/src/main/java/B1G4/bookmark/domain/ChatRoom.java b/src/main/java/B1G4/bookmark/domain/ChatRoom.java index 194f2d0..8f0e050 100644 --- a/src/main/java/B1G4/bookmark/domain/ChatRoom.java +++ b/src/main/java/B1G4/bookmark/domain/ChatRoom.java @@ -1,12 +1,11 @@ package B1G4.bookmark.domain; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @Getter +@AllArgsConstructor +@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class ChatRoom { diff --git a/src/main/java/B1G4/bookmark/service/ChatRoomService/ChatRoomServiceImpl.java b/src/main/java/B1G4/bookmark/service/ChatRoomService/ChatRoomServiceImpl.java index cb39226..5582dd2 100644 --- a/src/main/java/B1G4/bookmark/service/ChatRoomService/ChatRoomServiceImpl.java +++ b/src/main/java/B1G4/bookmark/service/ChatRoomService/ChatRoomServiceImpl.java @@ -1,5 +1,6 @@ package B1G4.bookmark.service.ChatRoomService; +import B1G4.bookmark.domain.ChatRoom; import B1G4.bookmark.domain.Member; import B1G4.bookmark.repository.ChatRoomRepository; import B1G4.bookmark.repository.MemberRepository; diff --git a/src/main/java/B1G4/bookmark/web/controller/ChatController.java b/src/main/java/B1G4/bookmark/web/controller/ChatController.java index 56fdcd8..5d50358 100644 --- a/src/main/java/B1G4/bookmark/web/controller/ChatController.java +++ b/src/main/java/B1G4/bookmark/web/controller/ChatController.java @@ -1,6 +1,7 @@ package B1G4.bookmark.web.controller; +import B1G4.bookmark.apiPayload.BaseResponse; import B1G4.bookmark.domain.Member; import B1G4.bookmark.security.handler.annotation.AuthUser; import B1G4.bookmark.service.ChatRoomService.ChatRoomServiceImpl; @@ -11,14 +12,57 @@ import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; -@Controller +@RestController @RequiredArgsConstructor public class ChatController { private final ChatRoomServiceImpl chatRoomService; + + // Swagger용 가짜 채팅방 입장 API + @Operation( + summary = "채팅방 입장", + description = "사용자가 특정 채팅방에 입장합니다. 이 경로는 WebSocket 동작을 설명하기 위해 추가된 가짜 API입니다." + + "클라이언트는 /app/chat/{chatRoomId}/join으로 메시지를 발행합니다. "+ + "서버는 /topic/chat/{chatRoomId}로 구독 중인 모든 클라이언트에게 메시지를 브로드캐스트합니다." + ) + @PostMapping("/swagger/chat/{chatRoomId}/join") + public BaseResponse joinChatRoomSwagger( + @DestinationVariable @Parameter( + description = "입장할 채팅방의 ID" + "채팅방 ID는 공간 ID와 같습니다", + required = true + ) Long chatRoomId, + @Parameter(name = "user", hidden = true) + @AuthUser Member member) { + ChatMessageDTO result = chatRoomService.handleJoinChatRoom(chatRoomId, member.getId()); + return BaseResponse.onSuccess(result); + } + + // Swagger용 가짜 메시지 전송 API + @Operation( + summary = "메시지 전송", + description = "사용자가 특정 채팅방에 메시지를 전송합니다. 이 경로는 WebSocket 동작을 설명하기 위해 추가된 가짜 API입니다." + + "클라이언트는 /app/chat/{chatRoomId}/send로 메시지를 발행합니다." + + "서버는 /topic/chat/{chatRoomId}로 구독 중인 모든 클라이언트에게 메시지를 브로드캐스트합니다." + + ) + @PostMapping("/swagger/chat/{chatRoomId}/send") + public BaseResponse sendMessageSwagger( + @DestinationVariable @Parameter( + description = "메시지를 전송할 채팅방의 ID" + "채팅방 ID는 공간ID와 같습니다", + required = true + ) Long chatRoomId, + @RequestBody @Parameter( + description = "전송할 메시지의 정보", + required = true + ) ChatMessageDTO messageDTO) { + return BaseResponse.onSuccess(chatRoomService.handleSendMessage(chatRoomId, messageDTO)); + } + // 채팅방 입장 /** * 채팅방 입장 @@ -31,15 +75,15 @@ public class ChatController { ) @MessageMapping("/chat/{chatRoomId}/join") @SendTo("/topic/chat/{chatRoomId}") - public ChatMessageDTO joinChatRoom( + public BaseResponse joinChatRoom( @DestinationVariable @Parameter( description = "입장할 채팅방의 ID", - required = true, - example = "1" + required = true ) Long chatRoomId, @Parameter(name = "user", hidden = true) @AuthUser Member member) { - return chatRoomService.handleJoinChatRoom(chatRoomId, member.getId()); + ChatMessageDTO result = chatRoomService.handleJoinChatRoom(chatRoomId, member.getId()); + return BaseResponse.onSuccess(result); } // 메시지 전송 @@ -54,7 +98,7 @@ public ChatMessageDTO joinChatRoom( ) @MessageMapping("/chat/{chatRoomId}/send") @SendTo("/topic/chat/{chatRoomId}") - public ChatMessageDTO sendMessage( + public BaseResponse sendMessage( @DestinationVariable @Parameter( description = "메시지를 전송할 채팅방의 ID", required = true, @@ -65,6 +109,6 @@ public ChatMessageDTO sendMessage( required = true ) ChatMessageDTO messageDTO) { - return chatRoomService.handleSendMessage(chatRoomId, messageDTO); + return BaseResponse.onSuccess(chatRoomService.handleSendMessage(chatRoomId, messageDTO)); } } \ No newline at end of file