본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.




패스트캠퍼스의 '9개 도메인 프로젝트로 끝내는 백엔드 웹 개발 (Java/Spring) 초격차 패키지 Online' 강의 수강 45일차!
오늘은 Websocket을 활용한 실시간 메시징 도메인 서버의 STOMP을 사용한 간단한 채팅 서비스 구현 작업을 진행하였다.
@Configuration
@EnableWebSocketMessageBroker // STOMP 기능 활성화
public class StompConfiguration implements WebSocketMessageBrokerConfigurer {
// 클라이언트가 서버에 연결할 수 있도록 엔드포인트 지정
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/stomp/chats");
}
// 메세지 브로커로서의 역할을 하기 위해서 클라이언트에서 메세지를 발행하고, 클라이언트는 브로커로부터 전달되는 메세지를 받기 위해 구독을 해야 한다.
// 그 경로들을 지정해주는 기능
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 메세지 발행 경로 (클라이언트 -> 서버로 메세지 보낼 때 사용할 prefix)
registry.setApplicationDestinationPrefixes("/pub");
// 메세지 구독 신청 경로 (서버 -> 클라이언트로 메세지 보낼 때 사용할 prefix)
registry.enableSimpleBroker("/sub");
}
}
STOMP 사용을 위한 설정 파일을 생성하였다.
WebSocketMessageBrokerConfigurer 인터페이스를 구현하여 스톰프 기능을 설정할 수 있다.
registerStompEndpoits(), configureMessageBroker()를 오버라이드하여 구현하였다.
@Slf4j
@Controller
public class StompChatController {
@MessageMapping("/chats") // 어떤 경로로 발행된 메세지를 라우팅할 것인지 지정 (설정 파일에서 설정한 prefix(/pub)는 생략)
@SendTo("/sub/chats") // 해당 경로를 구독하고 있는 모든 클라이언트에 메세지 전달
public String handleMessage(@Payload String message) {
log.info("{} Received", message);
return message;
}
}
이후, 메세지 요청을 받는 컨트롤러를 생성했다.
@MessageMapping 어노테이션을 통해 /pub/chats 경로로 발행된 메세지를 받아와 처리하고, 구독 중인 클라이언트들에게 메세지를 전달한다.

어플리케이션을 실행하여 메세지를 보내면, 위 컨트롤러에서 작성한 포맷대로 log가 출력되는 것을 확인할 수 있다.
map 등의 자료구조에 직접 세션을 저장하고, 반복문을 수행하면서 메세지를 전송해야 했던 웹소켓과 달리 stomp는 경로 지정과 컨트롤러 구현만으로 메세지 전달이 가능해서 훨씬 빠르고 편리하게 개발을 할 수 있었다.