하나의 발신자가 특정 메시지를 여러 수신자에게 동시에 전송하는 방식
일반적으로 네트워크나 메시징 시스템에서 “1:N” 통신 패턴을 구현할 때 사용되며,
WebSocket 기반 채팅 애플리케이션에서는 다음과 같은 방식으로 동작함
Unicast(유니캐스트): 특정 한 대의 클라이언트(예: A → B)에만 메시지를 전송
Multicast(멀티캐스트): 미리 그룹에 가입된 일부 클라이언트들에게 메시지를 전송
Broadcast(브로드캐스트): 네트워크 상의 모든 클라이언트 또는 특정 토픽(주제)을 구독(subscribe)한 모든 클라이언트에게 메시지 전송
채팅에서는 “토픽(예: 채팅방)”을 구독한 모든 사용자가 새로운 메시지나 상태 변경 알림을 받도록 만드는 것이 브로드캐스트입니다.
Spring Boot 환경에서 STOMP 프로토콜을 사용하면, SimpMessagingTemplate
이나 @SendTo
를 통해 브로드캐스트를 쉽게 구현할 수 있습니다.
@Controller
@RequiredArgsConstructor
public class ChatWebSocketController {
private final SimpMessagingTemplate template;
// 클라이언트가 /pub/chat/rooms/{roomId}/send 로 메시지를 보내면 이 메서드가 호출됨
@MessageMapping("/chat/rooms/{roomId}/send")
public void sendMessage(@DestinationVariable Long roomId, ChatMessageSendRequest request) {
ChatMessageResponse response = chatMessageService.saveMessage(roomId, request);
// /sub/chat/rooms/{roomId}/send 토픽을 구독한 모든 클라이언트에게 브로드캐스트
template.convertAndSend("/sub/chat/rooms/" + roomId + "/send", response);
}
}
@MessageMapping("/chat/rooms/{roomId}/join")
@SendTo("/sub/chat/rooms/{roomId}/members")
public List<ChatMember> broadcastMembers(@DestinationVariable Long roomId) {
// 채팅방의 현재 활성 멤버 목록을 반환하면,
// /sub/chat/rooms/{roomId}/members 토픽을 구독한 모든 클라이언트에게 자동으로 전송됨
return chatMemberService.getActiveMembers(roomId);
}
구독(subscribe)
클라이언트(브라우저)는 STOMP 클라이언트를 통해 /sub/chat/rooms/{roomId}/…
같은 토픽을 구독
발행(publish)
메시지를 보낼 때 클라이언트가 /pub/chat/rooms/{roomId}/send
같은 엔드포인트로 요청
브로드캐스트(broadcast)
서버는 해당 토픽(/sub/chat/rooms/{roomId}/…
)에 convertAndSend()
또는 @SendTo
로 메시지를 발행
수신(receive)
토픽을 구독한 모든 클라이언트가 실시간으로 메시지나 이벤트를 수신
채팅 메시지 전송 시 모든 방 참여자에게 동시에 알림
채팅방 멤버 목록 변경(입장·퇴장) 시 실시간 갱신
공지사항, 게임 점수판, 실시간 알림 등 “여러 사용자에게 동시 전달”이 필요할 때
이처럼 브로드캐스트는 “여러 사용자에게 동일한 정보를 실시간으로 전파”해야 하는 대부분의 실시간 기능에서 핵심적인 역할을 함