ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 통신이 구현되었다.

     

Designed by Tistory.