

클라이언트가 평범한 http request를 서버로 계속 날려서 이벤트 내용을 전달받는 방식이다.가장 쉬운방법이지만 클라이언트가 계속적으로 request를 날리기때문에 클라이언트가 많아지면 서버의 부담이 급증하게 된다.
http 오버헤드가 발생한다는 단점이 있다.하지만 일정하게 갱신되는 서버 데이터의 경우 유용하게 사용할 수 있는 방식이다. (ex. 대시보드 갱신)Http Overhead 란?
정보의 신뢰성 판단을 위한, 보내지는 헤더 같은 정보 때문에 오히려 데이터량이나 처리시간이 증가하는걸 말한다.
오버헤드(overhead)가 됐다 라는 말은, 처리 시간 및 메모리등이 추가적으로 사용되는 현상을 말한다.ex) A라는 처리를 실행한다면 3초 걸린다고 했는데, 안전성을 고려하여 추가로 B라는 처리를 가미한 결과 처리시간이 10초가 걸렸다고 하자. 그러면, 이 때 오버헤드는 7초 이게 된다.
출처: https://inpa.tistory.com/608 [Inpa Dev 👨💻:티스토리]



웹소켓은 별도의 서버와 프로토콜로 통신하기 때문에 구현하는 비용이 많이 든다는 단점이 있다.
하지만 SSE는 기존 HTTP 웹 서버에서 HTTP API 만으로 동작되며 구현도 간단하기 때문에 서버와 프론트엔드 양측 모두 매우 쉽게 개발이 가능하다.
마치 라디오 처럼, 클라이언트는 데이터를 서버로 보낼수는 없고 받기만 할 수 있기 때문에 채팅방 같은 양방향 통신을 구현하기에는 한계가 발생
클라이언트에서 서버로 Request를 보내야 하므로 HTTP 오버헤드가 발생한다.
(Simple Test Oriented Messaging Protocol)
언어-중립적이다. 다양한 언어로 작성된 클라이언트와 서버간에 메시지를 교환할 수 있게 한다.
프레임 기반이다.
COMMAND
header1:value1
header2:value2
Body^@
- 명령(command): STOMP는 클라이언트와 서버 간의 통신을 위해 명령어를 사용한다. 가장 일반적인 명령어로는 CONNECT, SEND, SUBSCRIBE, UNSUBSCRIBE, BEGIN, COMMIT, ABORT, ACK, NACK 등이 있다.
- 헤더(headers): 각 명령어에는 헤더가 포함될 수 있다. 헤더는 키-값 쌍으로 이루어져 있으며, 메시지의 특정 속성을 나타낸다. 일반적인 헤더로는 destination, content-type, content-length 등이 있다.
- 메시지 본문(body): 명령어와 헤더 이후에는 선택적으로 메시지 본문이 포함될 수 있다. 메시지 본문은 일반적으로 텍스트나 이진 데이터 형태일 수 있다.

SimpAnnotationMethod (/app 으로 전송후 /topic 구독자에게 전송)
SimpleBroker(/topic 구독자들에게 바로 전송)
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 WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue","/topic"); // 메시지 브로커 설정
registry.setApplicationDestinationPrefixes("/app"); // 클라이언트에서 메시지를 보낼 때의 prefix 설정
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); // STOMP 엔드포인트 설정
}
}
enableSimpleBroker() : 내장 브로커를 사용, prefix가 붙은 메시지를 발행시 브로커가 처리
setApplicationDestinationPrefixes() : 메시지 핸들러로 라우팅되는 prefix

/app/hello 라는 destination 헤더를 가진 메시지들이 거치게 됨
/topic/greeting의 구독자들에게 전송됨 → simpleBroker로 전달됨
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS();
}
/ws : 웹소켓 핸드쉐이크를 위한 주소이다.
setAllowedOriginPatterns("*") : 이 부분은 모든 원본(Origin)의 요청을 허용하는 설정을 지정한다.
.withSockJS(): SockJS는 WebSocket을 지원하지 않는 일부 브라우저에서도 실시간 웹 소켓 통신을 가능하게 한다.
@Configuration
@EnableWebSocketMessageBroker
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry
.addEndpoint("/websocket")
.setAllowedOrigins("*");
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
}
하위 프로토콜 혹은 컨벤션을 따로 정해주지 않아도 된다.
연결 주소마다 새롭게 핸들러를 구현해주지 않아도 된다.
외부 Message Queue를 사용할 수 있다.(RabbitMQ, Kafka)
spring security를 사용할 수 있다.
간단한 프로토콜: STOMP는 간단하고 이해하기 쉬운 텍스트 기반의 프로토콜이다. 이는 개발자들이 쉽게 구현하고 사용할 수 있도록 도와준다.
다양한 언어 및 플랫폼 지원: STOMP는 여러 언어 및 플랫폼에서 구현되어 있으며, 대부분의 주요 프로그래밍 언어 및 브로커 시스템에서 지원된다.
유연성: STOMP는 다양한 메시지 지향 미들웨어나 메시징 시스템과 통합할 수 있는 유연성을 제공한다. 이를 통해 시스템 간의 통신을 단순화하고 서로 다른 시스템 간의 상호 운용성을 개선할 수 있다.
클라이언트-서버 모델: STOMP는 클라이언트-서버 모델을 따르며, 이는 클라이언트와 서버 간의 효율적인 통신을 가능하게 한다. 이 모델은 여러 클라이언트가 동일한 서버에 연결하여 메시지를 교환할 수 있도록 한다.
가볍고 효율적: STOMP는 가볍고 효율적인 프로토콜로, 적은 대역폭과 자원을 사용하여 메시지를 전송할 수 있다. 이는 네트워크 부하를 최소화하고 빠른 메시지 전송을 가능케 한다.
확장성: STOMP는 확장 가능한 프로토콜로, 복잡한 메시지 지향 미들웨어 시스템을 구축하는 데 유용하다. 필요에 따라 새로운 명령어나 헤더를 정의하여 기존의 기능을 확장할 수 있다.