Spring Boot WebSocket (3) - 내 서비스에 STOMP + WebSocket 적용하기

2021. 9. 13. 19:55·스프링/스프링부트 WebSocket 적용기

1. 클라이언트와는 SockJS로 연결해서 통신한다.

2. WebSocket + STOMP 를 사용한다

 

[목적]

클라이언트가 보내주는 이벤트를 같은 방을 구독하고 있는 팀원들에게 뿌려준다.

 

WebSocketConfig

@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws-swoomi")
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /*
         Subscribe
         [/sub/comm/room/ + {roomId}]
         */
        registry.enableSimpleBroker("/sub");

        /*
         Message Publish
         1. [/pub/comm/message/]
         2. [/pub/comm/item/]
         */
        registry.setApplicationDestinationPrefixes("/pub");
    }
}

 

먼저 소켓을 /ws-swoomi를 엔드포인트로 핸드쉐이크를 통해 커넥션을 갖게한다.

 

MsgController

    /***
     * publish [pub/comm/message/{teamId}]
     */
    @MessageMapping("/comm/message/{teamId}")
    @SendTo("/sub/comm/room/{teamId}")
    public Message message(@DestinationVariable String teamId,
                           Message message) {
        return message;
    }

    /*
    publish [pub/comm/item/{teamId}]
     */
    @MessageMapping("/comm/item/{teamId}")
    @SendTo("/sub/comm/item/{teamId}")
    public ItemMessage message(@DestinationVariable String teamId,
                               ItemMessage itemMessage) {

        log.info("Item Message : " + itemMessage.toString());

        if (championInfoRepo.findBySummonerName(itemMessage.getSummonerName()).isEmpty()) {
            championInfoService.calculateAndSaveChampionInfo(itemMessage.getSummonerName(), 1);
        }

        for (String itemName : itemMessage.getItemNames()) {
            ItemPurchaseOneDto itemDto = ItemPurchaseOneDto.builder()
                    .matchTeamCode(teamId)
                    .itemName(itemName)
                    .summonerName(itemMessage.getSummonerName())
                    .championName(itemMessage.getChampionName())
                    .build();

            if (itemMessage.getMethod().equals("DELETE") && itemMessage.getType().equals("ITEM")) {
                itemPurchaseService.deletePurchaseItem(itemDto);
            } else {
                itemPurchaseService.setPurchaseItem(itemDto);
            }
        }

        return itemMessage;
    }

방 동기화를 위해 필요한 정보별로 소켓 통신을 하게된다.

 

@MessageMapping으로 요청이 들어오면 @SendTo로 들어온 요청(메세지)를 전부 브로드캐스팅 하게된다. 이때 프론트에서 동일 방 인원들에 대해 Subscribe를 걸어놓는다.

 

백엔드에서는 브로드캐스팅 하기전에 필요한 로직을 중간에 수행하면 된다.

반응형
저작자표시 (새창열림)

'스프링 > 스프링부트 WebSocket 적용기' 카테고리의 다른 글

Spring Boot WebSocket (2) - 웹소켓 이해하기 _ STOMP로 채팅 고도화 하기  (0) 2021.09.04
Spring Boot WebSocket (1) - 웹소켓 이해하기 _ 채팅 구현  (2) 2021.09.01
'스프링/스프링부트 WebSocket 적용기' 카테고리의 다른 글
  • Spring Boot WebSocket (2) - 웹소켓 이해하기 _ STOMP로 채팅 고도화 하기
  • Spring Boot WebSocket (1) - 웹소켓 이해하기 _ 채팅 구현
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    마우스
    mx master s3 for mac
    부다페스트
    키보드 손목 받침대
    동유럽
    크로아티아
    레이저
    류블라냐
    마우스 패드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
Spring Boot WebSocket (3) - 내 서비스에 STOMP + WebSocket 적용하기
상단으로

티스토리툴바