프로젝트/WebRTC써보기

Spring Boot, Vanilla JS, WebRTC를 활용한 실시간 영상공유 (백코드)

2023. 1. 16. 04:22
글 목차


728x90

(목차) https://okane-on-cliff.tistory.com/257

1. 디렉터리 구조

눈 여겨 볼것은

1. SocketHandler

2. SocketConfigurer

3. ssafykey.p12, application.properties

4. pom.xml

이다.

 

2. pom.xml

그냥 의존성으로 (1) 스프링 웹, (2) 데브 툴, (3) 웹소켓 추가하면 된다.

 

3. ssafykey.p12, application.properties

이건 배포때 설명할 예정

 

4. SocketConfigurer

package rtc;

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
public class SocketConfigurer implements WebSocketConfigurer {
	@Override
	public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
		registry.addHandler(new SocketHandler(), "/socket").setAllowedOrigins("*");
	}
}

@Configuration이 달려 있는 스프링 설정클래스다.

@EnableWebSocket을 통해 웹소켓을 사용한다는 것을 알려준다.

/socket은 context-path 뒤에 붙어서 소켓연결을 위한 url이 된다. 후에 자바스크립트에서 이를 호출하여 소켓연결을 한다.

SocketHandler 객체를 생성하여 Bean으로 등록하는 것 같다. 이건 확실하지 않다. 설정파일내에서 @Bean을 통해 컴포넌트를 만드는것과 비슷한 양상인것 같아 추측하는것 뿐이다.

 

5. SocketHandler

package rtc;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Component
public class SocketHandler extends TextWebSocketHandler {

	List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();
	
	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		sessions.add(session);
	}

	@Override
	protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
		for (WebSocketSession webSocketSession : sessions) {
			if (webSocketSession.isOpen() && !session.getId().equals(webSocketSession.getId())) {
				webSocketSession.sendMessage(message);
			}
		}
	}

}

만들어진 Bean이 어떻게 동작하는지 TextWebSocketHandler를 이용해 재정의 했다.

세션 연결이 있을 때 마다 리스트에 웹소켓 세션들을 저장하고

메세지가 올때마다 열려있는 세션에 메세지를 전달하는 동작을 정의했다.

 

6. 정리

시그널링 서버는 소켓핸들러 인스턴스를 하나 가지고 있다. 클라이언트들은 이 소켓핸들러와 통신하며 세션을 등록하고 다른 세션들과 소켓통신을 한다. 이게 다다.

728x90
Spring Boot, Vanilla JS, WebRTC를 활용한 실시간 영상공유 (백코드)