Search
Duplicate
📒

[Spring WebSocket] 02-2. WebSocket 구현하기

상태
미진행
수업
Spring Netty
주제
WebSocket
4 more properties
참고

WebSocket 테스트 도구

NOTE
현재 페이지에서는 Simple WebSocket Clinet를 사용했다.

PostMan

Simple WebSocket Client

Spring WebSocket

NOTE
Spring boot에서 웹소켓을 연동해보자!
대충 결과화면임

의존성

implementation 'org.springframework.boot:spring-boot-starter-websocket'
Groovy
복사

웹소켓 메시지 스펙

@Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Message { private String type; private String sender; private String receiver; private Object data; public void setSender(String sender) { this.sender = sender; } public void newConnect(){ this.type = "new"; } public void closeConnect(){ this.type = "close"; } }
Java
복사

JSON 변환(ObjectMapper)

public class Utils { private static final ObjectMapper objectMapper = new ObjectMapper(); private Utils() { } public static Message getObject(final String message) throws Exception { return objectMapper.readValue(message, Message.class); } public static String getString(final Message message) throws Exception { return objectMapper.writeValueAsString(message); } }
Java
복사
JSON → Java, Java → JSON

WebSocketConfiguration

NOTE
Spring boot에서 웹소켓을 연동해보자!
@Configuration @RequiredArgsConstructor @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry .addHandler(signalingSocketHandler(), "/room") .setAllowedOrigins("*"); } @Bean public WebSocketHandler signalingSocketHandler(){ return new WebSocketHandler(); } }
Java
복사
1.
웹소켓 서버를 사용하도록 정의한다 → @EnableWebScoket
2.
웹소켓 서버엔드포인트로 정한다 → url:port/room
3.
클라이언트에서 웹소켓 서버에 요청시 모든 요청 수락(CORS) → setAllowdOrigins(”*”)
4.
WebScoketHandler 클래스를 웹소켓 핸들러로 정의한다.

WebSocketHandler

NOTE
웹소켓 핸들러는 소켓의 통신에 관련된 함수들을 작성할 수 있다!
@Component @Log4j2 public class WebSocketHandler extends TextWebSocketHandler { private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>(); // 웹 소켓 연결 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception {} // 양방향 데이터 통신 @Override protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception {} // 소켓 연결 종료 @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {} // 소켓 통신 에러 @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {} }
Java
복사

WebSocket 최초연결 - afterConnectionEstablished

NOTE
웹소켓에 접속하면 발생하는 함수다!
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
Java
복사
최초 연결 시 MAP자료구조에 session을 저장해준다.
// 웹 소켓 연결 @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 1. session 저장 String sessionId = session.getId(); sessions.put(sessionId, session); // 2. message 설정 Message message = Message.builder().sender(sessionId).receiver("all").build(); message.newConnect(); // 3. 접속해 있는 모든 사용자에 알림(본인제외) sessions.values().forEach(s -> { try{ if(!s.getId().equals(sessionId)){ s.sendMessage(new TextMessage(Utils.getString(message))); } }catch (Exception e){ } }); }
Java
복사

WebSocket 데이터 통신 - handleTextMessage

NOTE
웹소켓에서 데이터 통신 시 구현한다.
@Override protected void handleTextMessage(WebSocketSession session, TextMessage textMessage) throws Exception { String sessionId = session.getId(); Message message = Utils.getObject(textMessage.getPayload()); message.setSender(session.getId()); // 2. 접속해 있는 모든 사용자에 채팅보냄 sessions.values().forEach(s -> { try{ if(!s.getId().equals(sessionId)){ s.sendMessage(new TextMessage(Utils.getString(message))); } }catch (Exception e){ } }); if(receiver != null && receiver.isOpen()){ receiver.sendMessage(new TextMessage(Utils.getString(message))); } }
Java
복사
1.

WebSocket 연결 종료 - afterConnectionClosed

NOTE
웹소켓에 접속해제 하면 발생한다.
@Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { // 1. session 제거 String sessionId = session.getId(); sessions.remove(sessionId); // 2. message 설정 final Message message = new Message(); message.closeConnect(); message.setSender(sessionId); // 3. 접속해 있는 모든 사용자에 알림(본인제외) sessions.values().forEach(s -> { try{ if(!s.getId().equals(sessionId)){ s.sendMessage(new TextMessage(Utils.getString(message))); } }catch (Exception e){ } }); }
Java
복사
1.

WebSocket 예외 발생 - handleTransportError

NOTE
웹소켓에서 에러 발생시 동작한다.
@Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { super.handleTransportError(session, exception); }
Java
복사
따로 구현안함