티스토리 뷰

시작

서버를 개발할 때 사용한 기술은 Springboot와 Websocket, Stomp, Redis이다. Websocket, Stomp 사용법은 스프링 공식 가이드에 친절하게 설명되어 있어 참고하였고 Redis는 단순 대화 내용을 저장하기 위한 용도로 사용하였다.

※ 글에 작성된 내용은 기본 Controller와 설정만 작성 하였습니다.(자세한 코드는 Github)

프로젝트 생성

프로젝트 생성은 Spring Initializr를 사용했다. Dependencies를 검색해서 추가하면 의존성이 추가된 프로젝트를 생성해주기 때문에 간편하다. 물론, IDEA에서 프로젝트를 생성하고 의존성을 추가해도 상관없다.

WebsocketConfiguration

package com.java.chat.configuration;

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 WebsocketConfiguration implements WebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat").setAllowedOriginPatterns("*").withSockJS();
    }

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

우선 Websocket을 사용하기위한 Config 파일을 만들어주었다. WebSocketMessageBrokerConfigurer를 상속받아 Websocket 연결 속성을 설정해 주었다.

  • addEndpoint(): 클라이언트에서 websocket에 접속하기위한 endpoint를 등록 (ex. localhost:8080/chat)
  • setApplicationDestinationPrefixes(): /app로 접근하는 메시지만 핸들러로 라우팅
  • enableSimpleBroker(): 메모리 기반 메시지 브로커가 /topic 접두사가 붙은 클라이언트로 메시지를 전달할 수 있도록 설정
    • 쉽게 이야기하면 클라이언트 A,B,C가 각각 /topic/master, /topic/sub, /topic/master를 구독하고 있을때 /topic/master로 메시지를 전송하면 클라이언트 A,C만 메시지를 받는 구조이다.

MessageController & MessageModel

@RestController
public class MessageController {
    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/send")
    public void SendToMessage(MessageModel msg){        
        simpMessagingTemplate.convertAndSend("/topic/"+msg.getTo() , msg);
    }
}

public class MessageModel {
    private String message;
    private String author;
    private String to;
    private Date timestamp;
}
  • @MessageMapping: 클라이언트에서 보내는 메시지를 매핑 ex. localhost:8080:/app/send
  • convertAndSend(): 첫번째 param에 해당하는 토픽을 구독중인 클라이언트에게 메시지를 전송
  • 나의 경우에는 각 사용자의 id를 붙여 생성된 고유 토픽을 클라이언트가 구독하고 메시지 전송시 id를 붙여 특정 클라이언트에 전송되도록 구현하였다.

참고

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함