Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/main/java/B1G4/bookmark/config/WebSocketConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 지원
}
}
}

7 changes: 3 additions & 4 deletions src/main/java/B1G4/bookmark/domain/ChatRoom.java
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
60 changes: 52 additions & 8 deletions src/main/java/B1G4/bookmark/web/controller/ChatController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<ChatMessageDTO> 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<ChatMessageDTO> 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));
}

// 채팅방 입장
/**
* 채팅방 입장
Expand All @@ -31,15 +75,15 @@ public class ChatController {
)
@MessageMapping("/chat/{chatRoomId}/join")
@SendTo("/topic/chat/{chatRoomId}")
public ChatMessageDTO joinChatRoom(
public BaseResponse<ChatMessageDTO> 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);
}

// 메시지 전송
Expand All @@ -54,7 +98,7 @@ public ChatMessageDTO joinChatRoom(
)
@MessageMapping("/chat/{chatRoomId}/send")
@SendTo("/topic/chat/{chatRoomId}")
public ChatMessageDTO sendMessage(
public BaseResponse<ChatMessageDTO> sendMessage(
@DestinationVariable @Parameter(
description = "메시지를 전송할 채팅방의 ID",
required = true,
Expand All @@ -65,6 +109,6 @@ public ChatMessageDTO sendMessage(
required = true
)
ChatMessageDTO messageDTO) {
return chatRoomService.handleSendMessage(chatRoomId, messageDTO);
return BaseResponse.onSuccess(chatRoomService.handleSendMessage(chatRoomId, messageDTO));
}
}
Loading