반응형
개념정리
웹소켓(WebSocket)으로 채팅기능 구현하기
1. 웹소켓으로 채팅기능 구현
1-1. 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
1-2. WebSocket Handler
소켓통신은 서버와 클라이언트가 1:N의 관계를 맺는다. 즉, 하나의 서버에 다수 클라이언트가 접속할 수 있다. 따라서 서버는 다수의 클라이언트가 보낸 메세지를 처리할 핸들러가 필요하다. 텍스트 기반의 채팅을 구현해볼 것 이므로 'TextWebSocketHandler'를 상속받아서 작성한다. Client로부터 받은 메세지를 Log출력하고 클라이언트에게 환영하는 메세지를 보내는 역할을 한다.
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.util.ArrayList;
import java.util.List;
@Component
@Log4j2
public class ChatHandler extends TextWebSocketHandler {
private static List<WebSocketSession> list = new ArrayList<>();
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
log.info("payload : " + payload);
for(WebSocketSession sess: list) {
sess.sendMessage(message);
}
}
/* Client가 접속 시 호출되는 메서드 */
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
list.add(session);
log.info(session + " 클라이언트 접속");
}
/* Client가 접속 해제 시 호출되는 메서드드 */
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
log.info(session + " 클라이언트 접속 해제");
list.remove(session);
}
}
1-3. WebSocket Config
핸들러를 이용해 WebSocket을 활성화하기 위해 Config를 작성해야한다.
@EnableWebSocket 어노테이션을 사용해 WebSocket을 활성화 한 후,
WebSocket에 접속하기 위한 Endpoint는 /chat으로 설정하고,
도메인이 다른 서버에서도 접속 가능하도록 CORS : setAllowedOrigins("*"); 를 추가해준다.
이제 클라이언트가 ws://localhost:8080/chat으로 커넥션을 연결하고 메세지 통신을 할 수 있다.
import lombok.RequiredArgsConstructor;
import org.gorany.community.handler.ChatHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@RequiredArgsConstructor
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final ChatHandler chatHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler, "ws/chat").setAllowedOrigins("*");
}
}
1-4. ChatController
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
@Log4j2
public class ChatController {
@GetMapping("/chat")
public String chatGET(){
log.info("@ChatController, chat GET()");
return "chat";
}
}
2. 웹소캣으로만 채팅기능을 구현했을 때 문제점
- 웹소캣만을 이용해 채팅기능을 구현을 했을 때 채팅방은 하나뿐이다. -> STOMP 이용 해야함
- 웹소켓을 지원하지 않는 브라우저에서는 동작하지 않음 -> SockJS(spring), Socket.io(node.js)를 이용 해야함
반응형
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
Spring에서 Redis Sorted set으로 인기검색어 순위 나타내기 (4) | 2022.01.15 |
---|---|
SpringBoot기반 Redis Cache (0) | 2022.01.13 |
OOP의 상속 / Implements와 Extends (0) | 2021.12.17 |
Spring Boot에서 CORS 방법 (0) | 2021.12.13 |
Spring Security (0) | 2021.12.11 |