[Spring Boot] STOMP 로 웹소켓 연동 시 일반 Controller로 요청 받고 원하는 채팅방에 메시지 보낼 수 있는 방법
웹소켓 연동에서 STOMP를 사용할 때, 일반적으로 클라이언트의 메시지를 받기 위한 컨트롤러를 작성합니다. 이 컨트롤러는 `@MessageMapping` 애노테이션을 사용하여 클라이언트에서 보낸 메시지를 받습니다. 그리고 `SimpMessagingTemplate`를 사용하여 원하는 채팅방에 메시지를 보낼 수 있습니다.
예를 들어, 아래와 같이 구현할 수 있습니다:
```java
@Controller
public class ChatController {
private final SimpMessagingTemplate messagingTemplate;
@Autowired
public ChatController(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@MessageMapping("/chat")
public void receiveMessage(ChatMessage message) {
// 메시지를 받는 로직
sendMessageToChatRoom(message.getChatRoomId(), message);
}
public void sendMessageToChatRoom(String chatRoomId, ChatMessage message) {
// 원하는 채팅방에 메시지를 보내는 로직
this.messagingTemplate.convertAndSend("/topic/chatroom/" + chatRoomId, message);
}
}
```
위 코드에서 `ChatMessage`는 채팅 메시지와 관련된 정보를 담는 클래스입니다. `chatRoomId`는 메시지를 보낼 채팅방의 ID를 나타냅니다.
`@MessageMapping("/chat")` 애노테이션이 붙은 `receiveMessage` 메소드는 클라이언트가 `/app/chat` 주소로 메시지를 보내면 호출됩니다.
`sendMessageToChatRoom` 메소드는 `SimpMessagingTemplate`의 `convertAndSend` 메소드를 사용하여 특정 채팅방으로 메시지를 보냅니다. 이 때, `"/topic/chatroom/" + chatRoomId`는 메시지를 보낼 주소를 나타냅니다.
이렇게 하면 일반 컨트롤러를 사용하여 클라이언트의 메시지를 받고, 원하는 채팅방에 메시지를 보낼 수 있습니다.
-----------------
@PostMappding으로 받고 sendMessageToChatRoom 을 호출 할 수는 없을 까?
-----------------
네, `@PostMapping`을 사용하여 HTTP 요청을 받고 웹소켓을 통해 메시지를 보낼 수 있습니다. 이 경우에는 일반적인 HTTP 요청을 처리하는 방식과 동일하게 `@PostMapping` 애노테이션을 사용하면 되며, 메시지를 보낼 때 `SimpMessagingTemplate`를 사용합니다.
다음은 이를 구현한 예시입니다:
```java
@RestController
public class ChatController {
private final SimpMessagingTemplate messagingTemplate;
@Autowired
public ChatController(SimpMessagingTemplate messagingTemplate) {
this.messagingTemplate = messagingTemplate;
}
@PostMapping("/chat")
public void sendMessage(ChatMessage message) {
// 원하는 채팅방에 메시지를 보내는 로직
this.messagingTemplate.convertAndSend("/topic/chatroom/" + message.getChatRoomId(), message);
}
}
```
위 코드에서 `ChatMessage`는 채팅 메시지와 관련된 정보를 담는 클래스입니다. `chatRoomId`는 메시지를 보낼 채팅방의 ID를 나타냅니다.
`@PostMapping("/chat")` 애노테이션이 붙은 `sendMessage` 메소드는 클라이언트가 `/chat` 주소로 HTTP POST 요청을 보내면 호출됩니다. 이 메소드는 클라이언트로부터 받은 메시지를 원하는 채팅방으로 보냅니다.
이렇게 하면 `@PostMapping`을 사용하여 클라이언트의 요청을 받고, 웹소켓을 통해 원하는 채팅방에 메시지를 보낼 수 있습니다.