How(Home Workout) 프로젝트에서 주 핵심 기능은 실시간 운동 라이브 기능입니다.
실시간 운동 라이브 기능을 어떻게 만들 지는 다음과 같이 생각했습니다.
실시간 운동 라이브 기능의 흐름도는 다음과 같이 생각했습니다.
![]() | ![]() | ![]() |
---|---|---|
![]() | ![]() | ![]() |
같은 라이브 방에 참여한 사용자들이 실시간으로 같은 운동 동작을 공유해야하기 때문에 양방향 통신을 할 수 있는 socket 통신을 이용하게 되었습니다.
http 통신과 socket 통신을 간단히 설명하면
http 통신은 매번 연결을 맺고, 끊는 비 연결성의 특징을 가지고 있습니다.
그래서 서버는 요청을 받아야 응답을 하는 구조입니다.
socket 통신은 한번 연결하면 그 연결을 유지합니다. (연결 지향)
그래서 서버는 꼭 요청을 받지 않아도 클라이언트에게 데이터를 전송할 수 있습니다. 즉, 양방향 통신이 가능합니다.
그래서 socket을 이용해 다음과 같은 로직으로 기능을 구현하기로 했습니다.
저는 Spring boot를 사용하고 있었기 때문에 socket 기술 중 WebSocket과 SockJS 2개 중 하나를 사용할 수 있었습니다. 그 중 SockJS를 사용해 구현하기로 하였습니다. 그 이유는 다음과 같은 특징 때문이었습니다.
또한 데이터를 주고받는 기술로 stomp를 사용했습니다.
SockJS만 사용해도 텍스트 데이터를 전송하는 데에 아무런 문제가 없습니다.
하지만 저희가 구현해야 하는 기능 특성 상, 라이브 방마다 참여자의 구분이 필요하고, 넘겨주는 데이터의 종류가 많기 때문에 효율적인 메세지 관리가 필요했습니다.
또한, 화상 서비스를 제공해야 하기 때문에 프론트에서 webRTC를 사용해야 했습니다.
webRTC로 클라이언트 간 데이터를 주고받기 위해서는 signaling 서버와 turn 서버가 필요했고, stomp가 signaling 서버 역할을 대신했습니다.
그렇기에 stomp를 선택하게 되었습니다.
다음 포스팅에서 이 기술들을 구체적으로 어떻게 사용했는지 올리도록 하겠습니다.
후에 포스팅에서 stomp에 대한 자세한 설명도 올릴 예정입니다.