배경

평소에 맥북, 아이패드, 아이폰 등의 애플 기기를 애용하기 때문에 기기 사이의 강력한 동기화 가능에 익숙해져 있었다. 예를 들면, 맥북에서 메모를 하면 아이폰에서도 볼 수 있고, 문자가 오면 맥북이나 아이패드에서도 확인할 수 있는 것이다.

또 하나 유용하게 사용하는 것은 Universal Clipboard라는 기능이다. 이 기능은 기기 사이의 클립보드를 공유하는 것인데, 한 기기에서 복사한 것을 다른 기기에서 붙여넣기 할 수 있는 것이다.

다만 애플 제품끼리만 가능하다는 것이 단점이다. 최근에 맥북과 함께 윈도우를 사용할 일이 있어서 많이 불편했다. 매번 메신저 어플을 통해 전송하는 과정이 번거로웠고 일회성 데이터가 메신저에 기록이 남는 것도 마음에 들지 않았다.

이 문제를 해결하기 위해 네트워크를 공부하면서 배웠던 TCP를 사용하기로 했다.

원리

왜 TCP를 선택했나

  1. 양방향 통신을 지원한다. → 복사한 내용을 서로 전달할 수 있다.
  2. 신뢰성 있는 데이터 전송을 지원하고 데이터의 전송 순서를 보장한다. → 하나의 컴퓨터에서 복사한 내용이 다른 컴퓨터에서도 동일할 것임을 기대할 수 있다.

문제점은 없나

  1. 1대1 통신을 지원하기 때문에 2개의 기기에서만 동작할 수 있다. → 서버를 도입하면 N개의 기기 사이에서도 클립보드를 공유할 수 있다.
  2. 전송 속도가 UDP에 비해 상대적으로 느리다. → 실제 사용해본 결과 큰 영향은 없었다.

TCP로 어떻게 할 것인가

클립보드를 공유하고 싶은 기기를 클라이언트라고 하자. 클라이언트들은 클라이언트와 통신하는 것이 아니라 서버를 통해 복사한 내용을 전달하고 받는다.

서버는 모든 클라이언트와 1대1 통신을 한다. 이때 복사한 내용을 전달 받으면 나머지 클라이언트들에게 전달하는 역할을 한다.

여기서 한 가지 고려해보면 좋을 것은 복사한 내용을 어떻게 보낼지에 대한 것이다. 가장 간단한 방법은 문자열 그대로 전송하는 것이다. 보안이 중요하다면 암호화를 통해 메시지를 숨기고 서명을 통해 변조를 감지할 수 있을 것이다.

복사한 내용을 HTTP 메시지에 담아서 보내는 것은 어떨까? HTTP는 단방향 통신 프로토콜이므로 적절하지 않다고 생각했다.

구현

Server.java