Websocket의 활용처
실시간 채팅, 실시간 알림설정, 실시간 모니터링, 문서의 동시편집을 구현하는데 사용한다.
HTTP 프로토콜 vs WebSocket
windows 개발자 블로그를 참고해보면 알 수 있는데, WebSocket이 무조건 HTTP 프로토콜의 상위호환이 아닌, 각자의 장단점이 있기에 잘 보고 적절한 종속성을 사용하여야 한다.
WebSocket 기본 setting
build.gradle에
implementation 'org.springframework.boot:spring-boot-starter-websocket'
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
// 클라이언트로 메시지를 "/topic" prefix를 사용하여 전송하고,
// 클라이언트로부터 메시지를 "/app" prefix를 사용하여 수신하기 위한 메시지 브로커 설정
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic"); // 메시지 전달을 위한 브로커 활성화
config.setApplicationDestinationPrefixes("/app"); // 메시지 수신을 위한 prefix 설정
}
// SockJS 지원을 포함한 WebSocket 연결을 위한 엔드포인트 등록
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS(); // SockJS를 사용하여 WebSocket 엔드포인트 등록
}
// WebSocket 전송 속성 구성
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setSendTimeLimit(15 * 1000) // 메시지 전송 시간 제한 설정
.setSendBufferSizeLimit(512 * 1024) // 전송 버퍼 크기 제한 설정
.setMessageSizeLimit(128 * 1024); // 메시지 크기 제한 설정
}
// WebSocket 핸들러 및 인터셉터 등록
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/ws") // WebSocket 핸들러 등록
.addInterceptors(new MyHandshakeInterceptor()); // WebSocket 연결에 인터셉터 추가
}
// WebSocket 핸들러 빈 정의
@Bean
public WebSocketHandler myHandler() {
return new MyWebSocketHandler(); // WebSocket 핸들러 Bean 정의
}
// 허용된 출처를 사용하여 WebSocket 핸들러 등록
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(myHandler(), "/ws")
.setAllowedOrigins("http://localhost:8080"); // 특정 출처 허용 설정
}
// 인바운드 메시지 보안 구성
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages.simpDestMatchers("/topic/**").authenticated(); // 특정 destination에 대한 인증 필요 설정
}
// 동일 출처 정책 비활성화
@Override
protected boolean sameOriginDisabled() {
return true; // 동일 출처 정책 비활성화 설정
}
}
WebSocketHandler.java
@Component
@RequiredArgsConstructor
public class WebSocketHandler {
private final SimpMessagingTemplate messagingTemplate;
public void notifyMember(Member member) {
Long memberId = member.getId();
messagingTemplate.convertAndSendToUser(String.valueOf(memberId), "/queue/notifications", "새로운 댓글이 달렸습니다.");
}
}
WebSocket의 기본 활용 방법 - 실시간 알람 설정
조건 -> comment를 작성시에 접속중인 post 작성자에게 알림이감
CommentService.java
private final WebSocketHandler webSocketHandler;
public void createComment(Long postId, CommentRequestDto request) {
// 댓글 구현 기능
WebSocketHandler.notifyMember(post.getMember());
}
websocket.js
var socket = new SockJS('/notification');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
// /queue/notifications 를 구독
stompClient.subscribe('/user/queue/notifications', function(notification) {
var message = JSON.parse(notification.body);
console.log('알림을 받았습니다: ', message);
});
});
확장가능한 방향?
알림 타입 및 채널 관리: WebSocket 말고도 이메일이나 sms로 전송 가능할듯 하다.
알림 설정 관리: 사용자가 원하는 알림을 선택하고 관리할 수 있는 설정 기능을 추가) ex: 원하지 않는 알림 받지 않기
알림 히스토리 및 읽음 상태 관리: 사용자가 받은 알림을 확인할 수 있는 기능을 추가하여 히스토리를 관리하고, 사용자가
알림을 읽었는지 여부를 추적하기
알림 내용 개선: 알림의 내용을 더욱 구체적으로 만들어서, 예를 들어, 댓글 알림의 경우 댓글 내용이나 댓글이 달린 게시물 제목 등을 포함하여 알림을 개선하기
실시간 상호작용: 사용자가 알림을 받은 후 바로 상호작용할 수 있는 기능을 추가. 예를 들어, 댓글 알림의 경우 알림을 클릭하면 해당 댓글이 달린 게시물로 바로 이동할 수 있도록 링크를 제공
'Diary > WIL' 카테고리의 다른 글
2024-03-31 WIL (0) | 2024.03.31 |
---|---|
2024-03-24-WIL-CI/CD의 개념 (0) | 2024.03.24 |
2024-03-10 WIL (0) | 2024.03.10 |
2024-03-03 Spring Boot JPA를 사용하기 위해서 (0) | 2024.03.03 |
2024-02-25 WIL (0) | 2024.02.25 |