-
Spring boot 와 websoket 을 이용한 간단 채팅 서버BackEnd/간단 프로젝트 2021. 7. 5. 22:38
- Spring 에서 제공하는 Websocket을 이용하여 채팅 서버를 구현하도록 한다.
채팅서버는 socket 통신을 하는 서버가 필요하다.
보통 http 통신은 client 의 요청이 있을 때 서버가 응답한 후 연결을 종료하는 단방향 통신이다.
socket 통신은 Server 와 Client 가 지속적으로 연결을 유지하고 양방향으로 통신을 하는 방식이다.
WebSocket
양방향 통신을 제공하기 위해 개발된 프로토콜, 일반 socket 통신과 달리 HTTP 80 Port 를 이용하고 방화벽에 제약이 없다. 접속까지는 HTTP 프로토콜을 이용하고 그 이후의 통신은 자체적인 Websocket 프로토콜로 통신한다.
Spring initializr 로 프로젝트 생성
build.gradle
plugins { id 'org.springframework.boot' version '2.5.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'com.clone' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-websocket' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() }
Application 설정
@SpringBootApplication public class KakaoApplication { public static void main(String[] args) { SpringApplication.run(KakaoApplication.class, args); } }
Websocket Handler 작성
websocket 통신은 서버와 클라이언트가 1:N 으로 관계를 맺는다. 따라서 한 서버에 여러 클라이언트가 접속 할 수 있으며, 서버에는 여러 클라이언트가 발송한 메시지를 받아 처리해줄 Handler의 작성이 필요하다.
다음과 같이 TextWebSocketHandler 를 상속받아 Handler를 작성한다.
Client로부터 받은 메시지를 콘솔에 출력하고 Client로 환영 메시지를 보내는 역할을 한다.
@Slf4j @Component public class WebSocketChatHandler extends TextWebSocketHandler { private final static Logger LOG = Logger.getGlobal(); @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); LOG.info("payload" + payload); TextMessage textMessage = new TextMessage("Welcome chatting server~ ^^"); session.sendMessage(textMessage); } }
Websocket Config 작성
방금전 만든 handler 를 이용하여 Websocket을 활성화 하기 위한 Config 파일을 작성한다.
@EnableWebSocket을 선언하여 Websocket을 활성화한다.
Websocket에 접속하기 위한 endpoint는 /ws/chat으로 설정하고 도메인이 다른 서버에서도 접속 가능하도록 CORS 설정을 추가해준다.
@RequiredArgsConstructor @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { private final WebSocketHandler webSocketHandler; public WebSocketConfig(WebSocketHandler webSocketHandler) { this.webSocketHandler = webSocketHandler; } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketHandler, "/ws/chat").setAllowedOrigins("*"); } }
Websocket 테스트
테스트를 위한 클라이언트 대신 Chrome 웹스토어에서 다음을 설치하고 실행한다.
Spring Boot 서버를 구동 후 설치한 확장프로그램 Simple WebSocket Client 를 실행하고
ws://localhost:8080/ws/chat 를 입력후 Open 을 누른다.
Websocket의 경우 별개의 프로토콜이므로 http 가 아닌 ws로 시작하는 주소체계를 갖는다.
연결 상황에서 Request 에 메시지를 입력하고 Send 를 누르면 Message Log 에 client 의 request 와 server 의 response 가 찍힌다.
이렇게 간단한 Websocket 을 통한 client - server 통신이 구현되었다.