소켓 통신 과정

키요·2025년 8월 15일

공부

목록 보기
2/33

소켓 통신 과정, 식당 비유로 완벽하게 이해하기 👨‍🍳

안녕하세요! 복잡하게만 느껴지는 소켓 통신 과정을 일상적인 '식당' 비유를 통해 쉽고 명확하게 정리해 보았습니다.

이 글을 읽고 나면, 서버와 클라이언트가 어떻게 연결되고 데이터를 주고받는지 전체 흐름을 완벽하게 이해하실 수 있을 겁니다.


1. 식당 개업 (서버 준비)

📢 간판 달기 (bind())

  • 설명: 식당 주인이 가게의 상호명과 주소(IP)를 정하고, 손님이 들어올 문(포트)을 지정해 간판을 답니다.
  • 역할: 서버가 클라이언트가 찾아올 주소를 설정하는 과정입니다.

🛎️ 안내원 배치 (listen())

  • 설명: 문 앞에 손님을 맞이할 안내원(리스닝 소켓)을 배치합니다. 이 안내원은 음식을 만들거나 서빙하지 않고, 오직 손님이 오는지를 지켜보는 역할만 합니다.
  • 역할: 서버의 리스닝 소켓은 이렇게 연결 요청만을 기다립니다.

2. 손님 입장 (클라이언트 연결)

🚶‍♀️ 식당 찾아오기 (connect())

  • 설명: 손님(클라이언트)이 간판에 적힌 주소를 보고 식당에 찾아와 "안녕하세요~" 하고 인사를 건넵니다.
  • 역할: 클라이언트가 서버에 연결을 시도하는 과정입니다.

🪑 자리 안내 (accept())

  • 설명: 안내원은 손님을 보고 자리가 비어있으면 "어서 오세요, 이쪽으로 앉으세요"라고 응대하며 손님을 위한 전용 테이블을 마련합니다.
  • 역할: 서버의 accept() 함수가 호출되어 새로운 전용 소켓이 만들어지는 과정입니다. 이 전용 소켓이 실제 클라이언트와의 통신을 담당하게 됩니다.

3. 주문 및 서빙 (데이터 통신)

🧑‍🍳 담당 웨이터 배정 (전용 소켓)

  • 설명: 안내원은 손님을 담당 웨이터(전용 소켓)에게 인계하고, 자신은 다음 손님을 맞이하러 문으로 돌아갑니다.
  • 역할: 이제 전용 웨이터(전용 소켓)가 클라이언트와 1:1로 소통하며 주문을 받거나 음식을 서빙합니다.

📝 쟁반과 메모장 준비 (I/O 스트림)

  • 설명: 담당 웨이터는 손님의 주문을 받을 메모장(입력 스트림)과 음식을 서빙할 쟁반(출력 스트림)을 준비합니다.
  • 역할: I/O 스트림은 데이터를 담아 옮기는 통로입니다. InputStream은 데이터를 읽어 들이고, OutputStream은 데이터를 내보내는 역할을 합니다.

🧑‍💻 주문/서빙 (read() / write())

  • 설명: 손님이 메모장에 주문(데이터)을 적으면 웨이터가 주방으로 전달하고, 주방에서 만든 음식(데이터)을 쟁반에 담아 손님에게 전달합니다.
  • 역할: read()write() 함수를 사용해 데이터를 주고받는 과정입니다. read()는 데이터를 읽고, write()는 데이터를 쓰는 행위에 비유할 수 있습니다.

4. 동시 손님 처리 (동시성 기술)

🏃 스레드 풀 (Thread Pool)

  • 설명: 식당에 손님이 너무 많아지면, 여러 명의 웨이터(스레드)를 고용해 각 손님을 전담하게 합니다.
  • 특징: 여러 작업자가 서로 다른 작업을 동시에 처리하여 효율을 높이는 방식입니다. 마치 여러 웨이터가 각자 다른 손님을 응대하는 것과 같습니다.

⚡ 이벤트 루프 (Event Loop)

  • 설명: 베테랑 웨이터 한 명(단일 스레드)이 여러 테이블을 왔다 갔다 하며 모든 손님을 응대합니다. 주문을 주방에 넘겨놓고 기다리지 않고, 다른 일을 처리하며 효율적으로 일합니다.
  • 특징: 한 명의 작업자가 여러 일을 빠르게 번갈아 처리하는 비동기 방식입니다. 작업을 완료할 때까지 기다리지 않고, 다음 작업을 먼저 처리하며 이벤트 발생 시 해당 작업을 다시 처리합니다.

5. 식사 종료 (연결 종료)

👋 계산 및 퇴장 (close())

  • 설명: 손님이 식사를 마치고 계산한 뒤 식당 문을 나갑니다.
  • 역할: 클라이언트와 서버가 통신을 마친 후 close() 함수를 호출하여 연결을 끊는 과정입니다. 자원(소켓)을 반납하여 다른 클라이언트가 사용할 수 있도록 합니다.

6. 웹 소켓(WebSocket)과의 관계

우리가 배운 소켓 통신은 웹 소켓을 이해하는 데 훌륭한 기초가 됩니다. 웹 소켓은 클라이언트와 서버 사이에 한 번 연결된 통로를 끊지 않고 계속 유지하며 양방향 통신을 가능하게 하는 기술입니다. 이를 통해 실시간 채팅, 알림 등과 같은 서비스를 구현할 수 있습니다. HTTP는 요청-응답 방식이라 매번 연결을 맺고 끊지만, 웹 소켓은 한번 연결하면 지속적으로 통신하는 것이 가장 큰 차이점이죠!


이 비유를 통해 소켓 통신이 더는 어렵지 않게 느껴지시길 바랍니다! 궁금한 점이 있다면 언제든지 댓글로 물어봐 주세요.

profile
운도 실력

0개의 댓글