알버트의 개발하는 블로그

[Spring] 스프링 부트를 이용한 웹소켓 채팅프로그램 본문

웹개발/Spring

[Spring] 스프링 부트를 이용한 웹소켓 채팅프로그램

알버트 2022. 3. 16. 17:21

웹소켓을 이용한 채팅프로그램을 어떻게 구현할까 하다가 스프링 부트 환경에서 자바와 html, js을 구성하여 구현해 보았다.

 

 

1.제일 먼저 해야할 것은 스프링부트의 build.gradle에 웹소켓 dependencies를 추가하는 것이다.

build.gradle의 dependencies 파트는 아래와 같다.

 

dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   implementation 'org.springframework.boot:spring-boot-starter-websocket'
   compileOnly 'org.projectlombok:lombok'
   developmentOnly 'org.springframework.boot:spring-boot-devtools'
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation('org.springframework.boot:spring-boot-starter-test') {
      exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
   }
}

 

 

 

 

2.gradle에 추가한 뒤에 refresh gradle을 하면 웹소켓 관련 클래스들을 사용할 수 있다.

그 다음, 웹소켓을 핸들링하기 위해서 WebSocketHandler 파일을 만들어 준다.

WebSocketHandler는 TextWebSocketHandler를 상속받아 메소드를 오버라이드한다.

WebSocketHandler.java 소스 코드는 아래와 같다.

 

package com.chatting.Handler;
import lombok.extern.slf4j.Slf4j;
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;
 
@Slf4j
@Component
public class WebSocketHandler extends TextWebSocketHandler {
    private List<WebSocketSession> sessions = new ArrayList<>();
 
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        log.info("접속 : {}",  session);
    }
 
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
       log.info("메세지 전송 = {} : {}",session,message.getPayload());
        for(WebSocketSession sess : sessions){
            TextMessage msg = new TextMessage(message.getPayload());
            sess.sendMessage(msg);
        }
    }
 
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
       log.info("퇴장 : {}",  session);
    }
}

 

 

 

 

3. 웹소켓핸들러를 사용하기 위해서 WebSocketConfig 파일도 구성해 주어야 한다.

WebSocketConfig.java의 소스코드는 아래와 같다.

 

package com.chatting.Config;
import com.chatting.Handler.WebSocketHandler;
import lombok.RequiredArgsConstructor;
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
@EnableWebSocket
@RequiredArgsConstructor
public class WebSocketConfig implements WebSocketConfigurer {
    private final WebSocketHandler webSocketHandler = new WebSocketHandler();
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler,"/chat");
    }
}

 

 

 

4.그리고 Controller 클래스를 추가하여 준다. 채팅 프로그램이기에 ChatController.java로 지었다.

 

package com.chatting.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
 
@Controller
public class ChatController {
 
    @GetMapping("/")
    public String chat(){
        return "chat";
    }
}

 

 

이와 같이 구성한 뒤에, ChattingApplication을 스프링부트 어플로 실행하여 주면, 웹소켓을 이용한 채팅방을 구현할 수 있다.

이처럼 웹소켓은 쌍방향 통신이 가능하기에 아주 유용한 스킬이라고 할 수 있다.

하지만, 웹소켓을 사용하기 위해서 여러 가지 제약 조건이 뒤따른다.

웹소켓을 사용하여 프로그램을 구현하기 전에 현재 프로젝트에서 충분히 구현이 가능한지 따져보는 것이 무엇보다 중요할 것이다.