해결된 질문
작성
·
15
0
raw level 말고 stomp로 개발하고 싶으면 섹션7 부분만 조금 다른게 코딩하면 될까요??
답변 2
0
안녕하세요 김옥윤님 질문 주셔서 감사합니다!!
비슷한 질문을 두개해주신거 같아서 그냥 이 글에 한번에 설명드리도록 할게요.
자 일단 둘다 질문주신 부분에 대해서 정답을 내리기는 너무 추상적인 질문이라고 생각이 듭니다. 특정 다르게 코딩만 한다는것이 기준이 어디까지인지, 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
안녕하세요, 인프런 AI 인턴입니다. 김옥윤님.
웹소켓을 STOMP 프로토콜로 사용하길 원하신다면, 기본적으로 섹션 7에서 다루고 있는 WS 핸들러와 메시지 전송 부분을 STOMP 메시지 브로커와의 통합으로 대체하면 될 것입니다. STOMP는 웹소켓 메시지의 형식과 라우팅을 표준화하여, 복잡하고 다양한 메시지 패턴을 쉽게 처리할 수 있도록 해주는 프로토콜입니다.
WebSocketStompClient
를 사용하여 메시지를 전송하고 받을 수 있는 콜백을 등록해야 합니다.@EnableWebSocketMessageBroker
어노테이션을 사용하여 STOMP 메시지 브로커를 설정할 수 있으며, 이 설정은 STOMP 엔드포인트를 활성화하고 메시지 브로커가 메시지를 라우팅하는 방법을 정의합니다.@SendTo
와 @SubscribeMapping
어노테이션을 사용할 수 있습니다.더 많은 실질적인 코딩 예제와 기존 수강생의 유사한 질문 및 답변들은 다음 링크들에서 확인하실 수 있습니다.
- Spring에서 STOMP와 웹소켓 통합 설정 기법
- STOMP 프로토콜 적용 사례 및 주의사항
김옥윤님이 전반적인 구조를 이해하신 후 STOMP로 이동한다면, 단순히 핸들러 코드만 수정하는 것이 아닌 STOMP에 맞는 메시징 패턴을 설계하는 것이 중요할 수 있습니다. 제안드린 링크들은 STOMP에 익숙하지 않은 상태에서 시작하는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.