https://github.com/Nanum-BE/ChatService/tree/main
GitHub - Nanum-BE/ChatService
Contribute to Nanum-BE/ChatService development by creating an account on GitHub.
github.com
목차
서론
이번 과정에서는 Spring, MySQL, STOMP, External Broker를 이용해 채팅 애플리케이션을 구현할 것이다.
하지만 아직 제대로 된 정의가 안된 상태에서 무작정 시작한다면 이해하기 어려울 수 있다.
과거 프로젝트에서 WebFlux, Redis, 그리고 WebSocket을 이용하여 채팅 애플리케이션을 개발한 경험이 있다. 그러나 그 당시에는 시간과 처음 다뤄보는 주제로 인해 기본 개념을 충분히 확인하지 못하고, 작동만 되면 넘어갔는 식으로 진행하였다. 그래서 길을 헤맸었던 적이 있다.
그러므로 채팅 애플리케이션을 개발하기 전 필수적으로 알아야 하는 지식들이 있다. 이번 기회를 통해 최소한의 지식을 학습하고자 한다.
Socket
소켓
- 위키백과에서는 다음과 같이 설명한다.
- 소켓은 특정한 파이프의 끝, 파이프 이음쇠 또는 위생 기구를 수용하기 위해 확장한 것으로, 또 다른 파이프의 끝이나 파이프 이음쇠를 가리킨다. 또한 소켓(socket)은 통신선 또는 전기선, 전구 따위를 끼워 넣어 연결선과 접속하게 하는 연결 기구를 가리킨다.
즉, 각각의 기구 사이에 연결선을 의미하는 말인 것 같다. 그럼 네트워크에서는 소켓을 뭐라고 정의할까?
네트워크 소켓
- 네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하고 있으므로 대부분의 네트워크 소켓은 인터넷 소켓이다. 네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
처음 위키백과를 읽었을 때, 프로세스 간 통신?, 인터넷 소켓? 헷갈리는 용어가 보인다. 하나씩 살펴보자.
프로세스 간 통신
- 프로세스 간 통신(Inter-Process Communication, IPC)이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다라고 설명한다.
- 즉, 서로 독립되어 있는 프로세스들을 통신을 하기위해 IPC을 제공하게 한다.
- IPC에는 다양한 종류가 있다. IPC 주요 방식으로 소켓, 메시지 큐, 신호, 파일 등이 있다.
인터넷 소켓
인터넷 소켓은 크게 두 개의 타입으로 분류할 수 있다.
- 사용자 데이터그램 프로토콜(User Datagram Protocal, UDP)
- UDP의 전송 방식은 서비스의 신뢰성이 낮고, 데이터그램 도착 순서가 바뀌거나, 중복되거나, 누락될 수 있으므로 일반적으로 오류의 검사와 수정이 필요 없는 애플리케이션에서 수행할 것으로 가정한다.
- UDP를 사용하는 네트워크 애플리케이션에는 도메인 이름 서비스(DNS), 온라인 게임 등이 있다.
- 전송 제어 프로토콜(Transmission Control Protocal, TCP)
- TCP는 근거리 통신망이나 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간에 일련의 데이터를 안정적으로, 순서대로, 에러 없이 교환할 수 있게 한다.
- UDP와 TCP 비교
- TCP는 데이터를 주고받을 양단간에 먼저 연결을 설정하고 설정된 연결을 통해 양방향으로 데이터를 전송하지만, UDP는 연결을 설정하지 않고 수신자가 데이터를 받을 준비를 확인하는 단계를 거치지 않고 단방향으로 정보를 전송한다.
- 계층: TCP와 UDP는 전송 계층(Transport Layer)에 위치한다.
- 신뢰성: TCP는 메시지 수신을 확인하지만 UDP는 수신자가 메시지를 수신했는지 확인할 수 없다.
- 순서 정렬: TCP에서는 메시지가 보내진 순서를 보장하기 위해 재조립하지만 UDP는 메시지 도착 순서를 예측할 수 없다.
- 부하: UDP는 TCP보다 속도가 일반적으로 빠르고 오버헤드가 적다.
즉, 네트워크를 이용해 데이터를 송수신하는 프로세스들은 인터넷 소켓을 거쳐야 한다.
위와 같이 애플리케이션 계층에 존재하는 프로세스들은 데이터를 송수신하기 위해 프로세스 간 통신의 종착점인 소켓을 거쳐 전송 계층(TCP 또는 UDP)으로 전달함으로써 데이터를 송수신할 수 있게 한다.
HTTP
그럼 우리가 주로 사용하고 있는 HTTP는 뭘까?
- HTTP(HyperText Transfer Protocal)는 클라이언트와 서버 사이에 이루어지는 요청/응답(request/response) 프로토콜이다.
- 예를 들면, 클라이언트인 웹 브라우저가 HTTP를 통해서 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다.
HTTP 특징
Stateless
- 상태를 저장하지 않는다.(Stateless)
- 동일한 연결 상에서 연속하여 전달된 두 개의 요청 사인에는 연결고리가 없다.
HTTP와 연결
- 연결은 전송 계층에서 제어되므로 근본적으로 HTTP 영역 밖이다.
- HTTP는 연결될 수 있도록 하는 근본적인 전송 프로콜을 요구하지 않는다. 다만 신뢰할 수 있거나 메시지 손실이 없는 연결을 요구한다.
- HTTP는 연결이 필수는 아니지만 연결 기반인 TCP 표준에 의존한다.
Connectionless
- HTTP는 전송 후 연결을 끊는 Connectionless 한 특성이 있다.
- 클라이언트의 요청 & 서버의 응답 이후에는 연결을 종료한다.
- 연결을 계속 새로 맺어야 하므로 일정 시간 동안 동일한 TCP 연결을 할 수 있는 Persistent Connection을 사용하며 여러 개의 Http Reqeust를 처리한다.
단방향
- 클라이언트가 요청을 보내는 경우에는 서버가 응답하는 단방향 서비스이다.
- 그러므로 클라이언트가 요청을 보내기 전까지는 서버는 어떠한 데이터를 전송하지 않는다.
질문
인터넷에서 무수히 나오는 HTTP 통신과 소켓 통신 차이점으로 소켓은 양방향, HTTP는 단방향으로 소개한다.
그럼 HTTP 통신은 소켓 통신과 다른 것일까?
결론부터 말하자면 HTTP 통신은 소켓 통신 중의 하나이다.
TCP 통신 과정
HTTP 통신이 소켓 통신 중 하나인 것을 알려면 TCP 통신 과정을 알아야 한다.
TCP 통신 과정은 크게 세 가지 흐름으로 구분한다.
- 연결 생성 (Connection establishment)
- 자료 전송 (Data transfer)
- 연결 종료 (Connection termination)
연결 생성
- 연결을 생성하기 위해, 3-way handshake 연결 과정을 진행한다.
- SYN: 클라이언트가 서버에게 SYN 메시지를 보낸다.
- SYN/ACK: 서버가 클라이언트에게 SYN-ACK 메시지로 응답한다.
- ACK: 클라이언트가 서버에게 ACK 메시지를 보낸다.
연결 종료
- 연결을 종료하기 위해, 4-way handshake 종료 과정을 진행한다.
TCP 통신은 이 3-way handshake와 4-way handshake 과정을 거친다.
HTTP 통신은 이 TCP 통신 기반에서 자료를 전송하는 부분만 맡는다.
즉, HTTP 통신을 하기 위해서는 OSI 7 계층에서 TCP가 사용되고 있는 계층인 Transport Layer(4 계층)에서 3-way handshake을 통해 연결을 생성하고 Application Layer(7 계층)에서 HTTP 기반으로 자료 전송을 하고 다시 Transport Layer(4 계층)에서 4-way-handshake로 연결 종료하는 과정을 거치게 된다.
그러므로 HTTP 통신은 TCP 기반에서 동작하고 있기 때문에 소켓 통신의 중 하나라고 말할 수 있다.
질문
이제 HTTP는 애플리케이션 계층에서 이루어지는 클라이언트-서버 프로토콜이고 단방향 서비스라는 걸 알게 되었다.
그렇다면 양방향으로 데이터를 주고받기 위해서는 어떻게 해야 할까?
실시간 스트리밍 방식
양방향으로 데이터를 주고 받기 위해 다양한 시도들이 있었다.
대표적으로 Polling과 Streaming 등이 있다.
Polling
- 클라이언트가 특정 데이터를 일정한 간격(예: 5초마다)으로 요청하면 서버는 필요한 데이터를 포함한 일반적인 응답으로 되돌려주는 프로세스로 정의한다.
- 하지만 클라이언트가 정기적으로 데이터를 업데이트해야 하는 상황에서는 적합하지 않을 수 있다.
- 상대방이 메시지를 보낼 때 즉각적으로 메시지를 받아야 하는데, x초 간격으로 설정되어 있기 때문에 메시지의 즉시 받을 수 없고 메시지가 지연되는 느낌이 들 수 도 있다.
Streaming
- 클라이언트가 처음에 서버로 http 요청을 보낸다.
- 서버에서 클라이언트로 이벤트로 전달할 때, 해당 요청을 끊지 않고 메시지를 보내기를 반복하는 방식이다.
한계
둘 다 Header가 불필요하게 크다는 단점이 있다.
또한 Connection의 처리 방식이 관리하기 어려움이 있다.
이러한 한계점 때문에 다른 대안이 제시되었다.
WebSocket
- WebSocket은 RFC 6455 명세서에 정의된 프로토콜이며 서버와 브라우저 간 연결을 유지한 상태로 데이터를 교환하는 방식이다.
- 일반 소켓(TCP 기반 소켓)처럼 양방향에 실시간 통신이 가능한다는 점에서 공통점을 가지고 있지만, 웹 소켓은 기본적으로 애플리케이션 계층에서 작동하고 일반 소켓은 트랜스포트 계층에서 작동하는 점에서 다르다.
- WebSocket을 위한 별도의 포트는 없으며 포트 80, 443(http: 80, https: 443)을 사용하도록 설계되었다. 그렇기에 WebSocket 프로토콜이 HTTP 프로토콜을 대처하는 개념이 아니라 HTTP 프로토콜을 상호보완하는 개념으로 알 수 있다.
WebSocket 동작 과정
WebSocket 동작 과정은 크게 네 가지 흐름으로 구분한다.
- 핸드셰이크(HandShake)
- 연결 설정(Connection Establishment)
- 자료 전송(Data Transfer)
- 연결 종료(Connection Closure)
핸드셰이크(Handshake)
- 클라이언트가 웹 소켓 연결을 시작하려면 먼저 서버와의 핸드셰이크를 수행해야 한다.
- 클라이언트가 서버에게 웹 소켓 연결을 요청하면, 서버는 특별한 HTTP 요청을 통해 이를 수락한다.
- 이 요청은 "Upgrade" 헤더를 포함하고 있어 웹 소켓 연결임을 나타낸다.
연결 설정(Connection Establishment)
- 핸드셰이크가 완료되면, 클라이언트와 서버는 양방향 연결이 설정된다. 이제부터 양쪽에서 데이터를 주고받을 수 있다.
자료 전송(Data Transfer)
- 연결이 설정된 이후에는 양측에서 데이터를 주고받을 수 있다.
- 클라이언트나 서버는 언제든지 웹 소켓을 통해 데이터를 보낼 수 있다.
- 이 데이터는 바이너리 또는 텍스트 형식을 전송할 수 있다.
연결 종료(Connection Closure)
- 클라이언트 또는 서버가 연결을 종료하고자 할 때, 양측은 연결을 닫는 프레임을 보내게 된다.
- 연결을 닫힌 후에는 더 이상 데이터를 주고받을 수 없다.
하지만 양방향을 할 수 있는 좋은 장점에도 불구하고 단점들이 존재한다.
단점
구버전 제공 X
- 초록색과 회색 같은 경우에는 WebSocket 프로토콜을 지원하는 브라우저 버전이고, 빨간색 같은 경우 WebSocket 프로토콜을 제공하지 않는다. 그러므로 엄청 옛날 컴퓨터일 경우에는 주의할 필요가 있다.
메시지의 처리에 대한 표준화된 프로토콜 X
- WebSocket은 실시간 양방향 통신을 가능하게 하는 기술이지만, 웹 애플리케이션에서 메시지의 전송, 구독 및 처리에 대한 표준화된 프로토콜이 없다.
- 이 때문에 복잡한 실시간 기능을 구현하려면 여러 가지 추가적인 로직이 필요하다.
질문
위와 같은 단점들을 해결할 수 없을까?
Socket.io & SockJS
첫 번째 단점으로 웹 소켓을 지원하지 않는 브라우저가 있다고 하였다. Socket.io와 SocketJS 라이브러리를 이용해 해결할 수 있다.
- WebSocket을 지원하지 않는 브라우저라면 일반 HTTP 스펙을 이용해서 WebSocket 나오기 전 방식인 Polling이나 Streaming 방식으로 실시간 통신을 지원할 수 있다.
- 주로 Node진영에서 Socket.io를 활용하고 자바 진영에서는 SockJS를 이용한다.
STOMP
두 번째 단점으로 WebSocket은 웹 애플리케이션에서 메시지의 전송, 구독 및 처리에 대한 표준화된 프로토콜이 없다. 이 문제를 해결하고 보다 쉽게 WebSocket을 사용하기 위해 STOMP(Simple Text Oriented Messaging Protocal)을 사용할 수 있다.
- 메시지 전송을 효율적으로 하기 위한 프로토콜이다.
- STOMP 프로토콜은 WebSocket 위에서 동작하는 프로토콜로써 클라이언트와 서버가 전송할 메시지의 유형, 형식, 내용들을 정의하는 메커니즘이다.
STOMP는 다음과 같은 특징을 가지고 있다.
STOMP 특징
간단한 프로토콜
- STOMP 프로토콜은 매우 간단한 텍스트 기반 프로토콜로, 이해하고 사용하기 쉽다.
- 복잡한 구현 없이도 웹 소켓을 사용하여 메시지를 주고받을 수 있다.
메시지 지향 프로토콜
- STOMP는 메시지 지향 프로토콜로, 메시지를 주고받는 데에 초점을 두고 있다.
- 이는 메시지를 발행하고, 메시지를 구독하고, 메시지를 처리하는 기능을 제공하여 효과적인 메시징 시스템을 구현할 수 있게 해 준다.
상호 운용성
- STOMP 프로토콜은 다양한 언어와 플랫폼 간에 상호 운용성을 제공한다.
- Java, Python, JavaScript 등 다양한 언어로 구현된 라이브러리를 사용하여 상호 운용이 가능하다.
오류 처리 및 헤더 지원
- STOMP는 에러 처리 기능과 메시지 헤더를 지원하므로, 클라이언트와 서버 간의 효율적인 통신을 할 수 있다.
- 예를 들어, 메시지에 대한 헤더를 사용하여 메시지의 속성을 지정할 수 있다.(권한 설정도 가능)
이러한 STOMP의 특징들은 복잡한 웹 소켓 통신을 관리하고 이해하기 쉽게 만들어주며, 다양한 플랫폼과 언어 간의 상호 운영성을 강화한다.
Next Step
이제 채팅 애플리케이션을 구현하기 전 필수적으로 알아야 할 지식들을 학습하였다. 다음 Step에서는 STOMP을 본격적으로 다루고 Spring을 이용해 간단히 구현하고 POSTMAN으로 간단히 테스트할 것이다.
참고
https://ko.wikipedia.org/wiki/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC_%EC%86%8C%EC%BC%93
네트워크 소켓 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 네트워크 소켓(network socket)은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하
ko.wikipedia.org
사용자 데이터그램 프로토콜 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. UDP은 여기로 연결됩니다. 다른 뜻에 대해서는 UDP (동음이의) 문서를 참고하십시오. 사용자 데이터그램 프로토콜(User Datagram Protocol, UDP)은 인터넷 프로토콜 스위
ko.wikipedia.org
전송 제어 프로토콜 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 전송 제어 프로토콜(Transmission Control Protocol, TCP, 문화어: 전송조종규약)은 인터넷 프로토콜 스위트(IP)의 핵심 프로토콜 중 하나로, IP와 함께 TCP/IP라는 명칭으로
ko.wikipedia.org
https://bnzn2426.tistory.com/52?category=770232
[네트워크] 소켓 프로그래밍 개요
소켓이란 소켓은 논리적으로 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 이 말이 무슨 말이냐면, 네트워크를 이용해 데이터를 송수신 하고 싶은 프로그램들은 소켓을 거쳐야
bnzn2426.tistory.com
https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EA%B0%84_%ED%86%B5%EC%8B%A0
프로세스 간 통신 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 프로세스 간 네트워크 통신을 통해 인터넷 상의 수많은 개인용 컴퓨터를 연결하는 그리드 컴퓨팅 시스템을 보여주는 예. 프로세스 간 통신(Inter-Process Communicatio
ko.wikipedia.org
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview
HTTP 개요 - HTTP | MDN
HTTP는 HTML 문서와 같은 리소스들을 가져올 수 있도록 해주는 프로토콜입니다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이기도 합니다. 클라이언트-서버
developer.mozilla.org
HTTP 통신과 TCP 통신 그리고 웹 소켓에 대한 기본 개념 정리
HTTP 통신과 TCP통신의 개념 HTTP 프로그래밍과 소켓 프로그래밍 HTTP,HTTPS 통신에서 양방향 통신을 위한 웹 소켓의 개념
sooolog.dev
https://www.geeksforgeeks.org/polling-and-streaming-concept-scenarios/
Polling and Streaming - Concept & Scenarios - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'백엔드' 카테고리의 다른 글
채팅 애플리케이션 (2) - STOMP (0) | 2023.10.29 |
---|