참고
WebSocket 테스트 도구
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
복사
따로 구현안함