본문 바로가기

🧐MY PROJECT

Openvidu Session disconnect

WebRTC를 연결하기 위해 Openvidu라는 오픈소스를 이용하였다.

촬영 방 입장 시 openvidu에 session이 연결되어 미디어 통신이 가능했는데,

방 퇴장 시, 퇴장한 유저는 session 연결이 끊긴 것처럼 보이지만

실제로는 끊기지 않아 방에 남아있는 다른 유저들에게 퇴장한 유저의 카메라와 오디오가 연결되는 이슈가 있었다.

 

해당 페이지를 나가면 자동으로 세션이 끊기는 줄 알았는데.. 찾아보니 직접 Openvidu Session 연결 해제를 해줘야 했다.

(오픈비두 세션 연결도 자동으로 되는 게 아니었는데.. 연결 해제는 왜 자동으로 되는 거라고 생각했을까..?)

 

Openvidu Docs를 찾아보니 딱 하나 있었다.

 

어떤 connection을 넣어야 하는 걸까 곰곰이 생각하다가, openvidu session 연결 로직을 되짚어보았다.

https://bamcodingbi.tistory.com/entry/Openvidu-Session-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0

 

Openvidu Session 연결하기

Openvidu란? : 웹과 모바일 환경에서 영상 통화 기능을 쉽게 추가할 수 있도록 하는 오픈소스 플랫폼 [ Openvidu Session 연결 순서 ] 1. WebRTC의 역할을 해줄 Openvidu Server 배포한다. 2. Openvidu와 통신하기 위

bamcodingbi.tistory.com

 

openvidu에 새로운 session을 생성하고, connectionProperties 객체를 빌드하여 token 발급 후 session에 연결했었는데

 

Connection 클래스를 확인해보니 token을 포함하고 있었다.

package io.openvidu.java.client;

/**
 * See {@link io.openvidu.java.client.Session#getConnections()}
 */
public class Connection {

	private String connectionId;
	private String status;
	private Long createdAt;
	private Long activeAt;
	private String location;
	private String platform;
	private String clientData;
	private ConnectionProperties connectionProperties;
	private String token;
    
        ...
}

 

그렇다면, disconnect 할 session 객체를 가져오고, 해당 session에 연결되어있는 모든 connection(유저)을 List로 반환하여

퇴장할 유저의 token 값과 일치한 connection을 찾아서 disconnect 하면 되지 않을까 하는 생각으로 시도해보았다.

 

User user = SecurityUtil.getCurrentUser();

// roomId로 방 조회
Room room = validator.existsRoom(roomId);

Session session = getSession(room.getSessionId());

// Openvidu 에서 사용자 연결 끊기
// Session.getActiveConnections()에서 반환된 목록에서 원하는 Connection 개체를 찾습니다
List<Connection> activeConnections = session.getActiveConnections();

for (Connection connection : activeConnections) {
       if (connection.getToken().equals(user.getOpenvidu_token())) {
            session.forceDisconnect(connection); // 세션에 입장한 사용자 연결 끊기
       }
}

 

결과는 성공이었다!!!!

 

 


정말 많은 삽질을 통해 느낀 점은 어떤 기능을 구현할 때에 로직을 이해하고 있어야만 그 외에 일어나는 문제에 대한 해결이 가능하다는 것이었다.

그저 '기능 구현'에만 집중하지 말고, 그 외에 보이지 않는 부분들까지 잘 이해하고 있어야겠다.

'🧐MY PROJECT' 카테고리의 다른 글

Openvidu Session 연결하기  (0) 2023.02.25