inflearn logo
강의

Course

Instructor

Building a Real-Time Chat Server: From Distributed Processing to Performance Optimization

Section 9 Quiz

웹소캣 stomp

Resolved

86

dhrdbs29802379

8 asked

0

raw level 말고 stomp로 개발하고 싶으면 섹션7 부분만 조금 다른게 코딩하면 될까요??

spring kotlin spring-boot websocket

Answer 2

0

Hong

안녕하세요 김옥윤님 질문 주셔서 감사합니다!!

비슷한 질문을 두개해주신거 같아서 그냥 이 글에 한번에 설명드리도록 할게요.

 

자 일단 둘다 질문주신 부분에 대해서 정답을 내리기는 너무 추상적인 질문이라고 생각이 듭니다. 특정 다르게 코딩만 한다는것이 기준이 어디까지인지, ChatWebSocketHandler만 수정하신다는게 뭔지 이거는 사실 너무 제가 어떤 기준으로 판단하고 설명을 드려야 하는지 판단하기에는 애매한거 같아요.

 

그래서 그냥 범용적으로 STOMP를 사용 했을 떄의 코드를 일부 보여드리면 좋지 않을까라는 생각을 하였습니다.

 

일반적으로 우리가 STOMP를 사용한다면, 이런 코드를 구현하시면 됩니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WssConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry ){
        registry.enableSimpleBroker("/sub");
        registry.setApplicationDestinationPrefixes("/pub");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-stomp").setAllowedOrigins("*");
    }

}
  • 엔트포인트와 prefix를 저장해줌으로써 Client와 연결 할 수 있는 통로를 지정해 줍니다.

 

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 com.example.demo.domain.chat.model.Message;
import com.example.demo.domain.chat.service.ChatService;
import com.example.demo.domain.repository.ChatRepository;
import com.example.demo.domain.repository.types.Chat;


import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.sql.Timestamp;

@RequiredArgsConstructor
@Controller
@Slf4j
public class WssControllerV1 {

    private final ChatService chatService;

    @MessageMapping("/chat/message/{from}")
    @SendTo("/sub/chat")
    public Message sendMessage(
        @DestinationVariable String from,
        Message msg
    ) { 
        return msg; 
    }
}
  • 그후 그냥 웹소켓 통신해주시면 됩니다. 들어오는 요청에 대해서 이제 어떤 경로로 또 전송을 해줄지에 대해서도 추가로 맵핑해주면 된다고 보시면 됩니다.

 

이 코드는 어디까지나 예시라고 봐주시면 될 꺼 같아요. 그래서 추가적인 미들웨어나 부수적으로 구현하고자 하는 기능은 여기에서 살을 붙이는 형태라고 봐주시면 될 꺼같습니다.

 

질문주신것처럼 당연히 다르게 작성을 해주셔야하고, 기본적으로 형태가 일부 다릅니다. 개념도 좀 다른 부분이 있어서 그 부분을 참고해주시면 좋을꺼 같아요.

 

감사합니다 :)

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 김옥윤님.

웹소켓을 STOMP 프로토콜로 사용하길 원하신다면, 기본적으로 섹션 7에서 다루고 있는 WS 핸들러와 메시지 전송 부분을 STOMP 메시지 브로커와의 통합으로 대체하면 될 것입니다. STOMP는 웹소켓 메시지의 형식과 라우팅을 표준화하여, 복잡하고 다양한 메시지 패턴을 쉽게 처리할 수 있도록 해주는 프로토콜입니다.

STOMP 프로토콜로 커스터마이징할 때 주의할 점

  1. WebSocket 콜백 설정: STOMP를 활용하기 위해서는 WebSocketStompClient를 사용하여 메시지를 전송하고 받을 수 있는 콜백을 등록해야 합니다.
  2. 메시지 브로커 설정: Spring에서는 @EnableWebSocketMessageBroker 어노테이션을 사용하여 STOMP 메시지 브로커를 설정할 수 있으며, 이 설정은 STOMP 엔드포인트를 활성화하고 메시지 브로커가 메시지를 라우팅하는 방법을 정의합니다.
  3. @SendTo와 @SubscribeMapping 사용: 실제 메시지를 브로드캐스트하거나 특정 유저에게 전송하기 위해 @SendTo@SubscribeMapping 어노테이션을 사용할 수 있습니다.

더 많은 실질적인 코딩 예제와 기존 수강생의 유사한 질문 및 답변들은 다음 링크들에서 확인하실 수 있습니다.
- Spring에서 STOMP와 웹소켓 통합 설정 기법
- STOMP 프로토콜 적용 사례 및 주의사항

김옥윤님이 전반적인 구조를 이해하신 후 STOMP로 이동한다면, 단순히 핸들러 코드만 수정하는 것이 아닌 STOMP에 맞는 메시징 패턴을 설계하는 것이 중요할 수 있습니다. 제안드린 링크들은 STOMP에 익숙하지 않은 상태에서 시작하는 데 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

패키지 구분에 대해 궁금한게 있습니다

0

7

1

스프링부트 서버 에러나요

0

17

1

코드 자료

0

24

2

2026.04에 추가된 강의 시청 불가

0

27

1

Service Create/Update Record 운용과 Delete Record 미운용의 차이 질문

0

18

1

인가 코드 발급(프론트 vs 백)

0

27

2

인텔리제이 MCP 서버 설정 관련

0

25

1

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

28

2

Sequence 관련 질문

1

32

2

Image Only Query

1

29

2

servlet과 container에 대한 질문입니다

0

24

1

프롬프트, 스킬, sub-agent

0

31

1

RepositoryTest의 패키지 위치가 domain인 이유

0

30

2

도메인 모델에서 관계와 규칙을 구분하는 방법

0

37

2

16 강의 메세지 retryCount의 의도

0

23

2

JPA Repository 질문이 있습니다!

1

33

2

service 를 interface 로 두는 이유

0

71

1

RedisMessageBroker.kt setLocalMessageHandler 관련 문의

0

56

2

빌드 파일

0

73

2

웹소켓을 이용한 채팅시스템에서 부하테스트를 어떻게 진행해야할까요?

0

262

2

엔티티는 Data Class로 작성하면 안되나요?

0

76

2

stomp websocket

0

79

1

그레이스풀 셧다운과 데몬 스레드의 관계 질문

0

95

1

api모듈에대해 문의드립니다.

0

80

2