당근마켓 채팅 구현하기 (1) 개념 공부

Dayon·2024년 1월 8일
0

1. 소켓(Socket)

소켓은 통신의 극점(EndPoint)를 의미하며, 컴퓨터 네트워크 상에서 서버와 클라이언트 간의 양방향 통신을 가능하게 하는 추상화된 인터페이스입니다. 소켓은 프로세스 간의 통신을 담당하며, 각 프로세스는 소켓을 통해 데이터를 주고받을 수 있습니다. 소켓은 IP 주소와 포트 번호로 식별되며, 프로토콜에 따라 다양한 형태로 사용될 수 있습니다. 주로 TCP 소켓과 UDP 소켓이 사용되며, TCP 소켓은 연결 지향적이고 신뢰성 있는 통신을 제공하고, UDP 소켓은 연결 없이 데이터를 전송하는 데 사용됩니다.

2.1. 웹소켓

웹소켓은 일종의 통신 프로토콜로, 웹 어플리케이션에서 클라이언트와 서버 간의 실시간 양방향 통신을 가능케 하는 기술입니다. 웹소켓은 일반적인 HTTP 통신과 달리 지속적인 연결을 유지하며, 클라이언트와 서버 간에 언제든 데이터를 주고받을 수 있습니다. 이로써 실시간 업데이트가 필요한 어플리케이션에서 유용하게 사용됩니다.

2.2. 웹소켓 사용 이유

기존의 HTTP 프로토콜은 Request/Response 기반의 Stateless protocol이기 때문에, 클라이언트가 서버에게 요청을 하고 응답을 받는 단방향 통신이 주를 이루었습니다. 이로 인해 실시간 업데이트가 어렵고, 데이터를 주기적으로 가져오기 위한 추가적인 요청이 필요했습니다. 웹소켓은 Stateful Protocol로, 한 번의 연결로 지속적인 양방향 통신을 제공하므로, 실시간으로 데이터를 주고받을 수 있습니다.

2.3. 작동원리

서버와 클라이언트 간의 웹소켓 연결은 일반적으로 HTTP 프로토콜을 통해 시작됩니다. 클라이언트가 서버에게 웹소켓 연결을 요청하면, 서버는 해당 요청을 수락하고 양쪽 간에 웹소켓 연결이 이루어집니다. 이후에는 HTTP 연결은 유지되지 않고, 대신에 웹소켓 프로토콜을 통해 지속적인 양방향 통신이 이루어집니다.

웹소켓은 클라이언트와 서버 간에 양방향 통신을 지원하는 프로토콜로, 그 작동 원리는 다음과 같습니다.

1. Handshake (핸드쉐이크)

클라이언트 요청:

클라이언트는 서버에게 웹소켓 연결을 요청하기 위해 HTTP Request를 전송합니다. 이 요청은 Upgrade 헤더와 Connection: Upgrade 헤더가 포함되어 있습니다.
예시:

GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade

서버 응답:

서버는 클라이언트의 요청을 받으면 HTTP Response를 반환합니다. 이 응답에는 Upgrade 헤더와 Connection: Upgrade 헤더가 포함되며, 그 외에도 웹소켓 버전 및 기타 정보가 전달됩니다.
예시:
makefile
Copy code
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
핸드쉐이크 완료:

핸드쉐이크가 성공하면 클라이언트와 서버 간의 연결이 웹소켓 프로토콜로 전환됩니다.
이제부터는 HTTP 프로토콜이 아닌 웹소켓 프로토콜을 사용하여 통신이 이루어집니다.

2. 데이터 전송

프레임 형식:

웹소켓은 메시지를 작은 조각인 프레임(Frame)으로 나누어 전송합니다.
프레임은 텍스트(UTF-8 인코딩) 또는 이진 데이터로 이루어질 수 있습니다.
프레임 구조:

각 프레임에는 헤더와 페이로드가 포함됩니다.
헤더에는 데이터의 종류(텍스트 또는 이진), 페이로드의 길이 등의 정보가 포함됩니다.
데이터 전송 방식:

양쪽 모두 언제든지 데이터를 보낼 수 있습니다.
클라이언트나 서버 중 어느 한쪽이 데이터를 보내면 상대방이 그에 대한 응답을 할 수 있습니다.
연결이 유지되는 동안 양방향으로 데이터를 주고받을 수 있습니다.
3. 연결 종료
클라이언트 또는 서버 종료 요청:

클라이언트 또는 서버가 연결을 종료하고자 할 때 특정한 종료 메시지를 상대방에게 전송합니다.
종료 응답:

상대방은 종료 요청을 받으면 동의하는 메시지를 응답합니다.
연결 종료:

양쪽이 동의한 경우, 연결이 종료되고 소켓이 닫힙니다.

2.4. 프로토콜

웹소켓을 사용하기 위한 프로토콜은 ws(웹소켓) 프로토콜입니다. 이 프로토콜은 비동기적으로 클라이언트와 서버 사이를 지속적 양방향 연결 스트림으로 제공하여 실시간 통신을 가능케 합니다.

3. 구현단계

Endpoint
Endpoint는 네트워크 서비스의 끝자락을 의미하며, 웹소켓에서는 Endpoint 클래스나 객체를 통해 특정 URI의 끝자락을 나타냅니다. 웹소켓을 사용하기 위해서는 Endpoint 클래스를 확장하고, onOpen(), onClose(), onError() 등의 메소드를 구현하여 연결 상태를 관리해야 합니다. Endpoint는 text, binary, pong 등의 메시지를 다룰 수 있으며, 하나의 메시지는 하나의 타입만을 갖습니다.

profile
success is within reach, allow yourself time

0개의 댓글