• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (89)
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (24)
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (3)
        • File (4)
        • Resource (3)
      • Server - Client (17)
        • GUI 채팅 (1)
      • MySQL (4)
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (20)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 왜 메시지 규칙이 필요한가
      2026년 06월 23일
      • 소쩍소쩍이
      • 작성자
      • 2026.06.23.:49

      메시지 규칙과 프로토콜

      채팅 프로그램에 기능이 하나씩 더해지면 서버는 메시지의 의미를 구분해야 한다.

      사람은 문장을 보고 의미를 추측할 수 있지만, 프로그램은 명확한 규칙이 없으면 메시지가 일반 채팅인지, 명령어인지 판단하기 어렵다.

      네트워크 프로그램에서 이런 규칙을 프로토콜이라고 부른다.

       

      단순 문자열의 한계

      지금까지의 구조에서는 사용자가 채팅으로 "exit"라는 단어를 보내고 싶어도 서버는 이 값을 종료 명령으로 처리해 버린다.

      즉, 사용자가 채팅 내용으로 exit를 보냈더라도 서버는 그것을 일반 메시지가 아니라 명령으로 받아들인다.

       

      문제점
      단순 문자열 방식은 메시지의 종류와 내용을 구분하기 어렵다.
      그래서 "exit"처럼 특정 단어가 채팅인지 명령어인지 판단하기 애매해진다.

       

      메시지 규칙이란?

      메시지 규칙은 서버와 클라이언트가 서로 약속한 데이터 형식이다.

      예를 들어 모든 메시지에 type을 넣어 메시지의 종류를 구분할 수 있다.

      모든 메시지는 type을 가진다
      일반 채팅은 type이 "chat"이다
      입장 알림은 type이 "join"이다
      퇴장 알림은 type이 "leave"이다
      귓속말은 type이 "whisper"이다
      오류 메시지는 type이 "error"이다

       

      이러한 규칙을 정하면 서버는 메시지 내용을 추측하지 않고 type을 보고 처리할 수 있다.

      type이 "chat" → 전체 채팅으로 전달
      type이 "whisper" → 특정 사용자에게만 전달
      type이 "error" → 오류 메시지로 표시
      type이 "leave" → 연결 종료 처리

       

      exit를 채팅으로 보내는 경우

      사용자가 채팅 내용으로 exit를 보내고 싶다면 아래처럼 메시지 종류를 함께 보내면 된다.

      {"type": "chat", "content": "exit"}

      type이 chat이므로 서버는 이 메시지를 종료 명령이 아니라 일반 채팅으로 처리한다.

       

      프로토콜이라는 말 이해하기

      프로토콜은 서버와 클라이언트가 메시지를 어떤 모양으로 주고받을지 정한 약속이다.

      채팅 프로젝트에서 프로토콜은 아래와 같은 항목으로 구성할 수 있다.

       

      질문 항목 예시
      이 메시지는 어떤 종류인가? type chat, join, leave, whisper, error
      누가 보냈는가? sender user1
      누구에게 보내는가? target user2, all
      실제 내용은 무엇인가? content 안녕하세요

       

      비유와 비교로 차이 확인하기

      편지봉투 비유

      단순 문자열은 봉투 없이 종이쪽지만 던지는 것과 비슷하다. 내용이 복잡해질수록 받는 쪽이 의미를 해석하기 어려워진다.

      규칙 있는 메시지 방식은 봉투에 수신자, 종류, 발신자를 적어 보내는 것과 같다. 서버는 봉투에 적힌 정보를 보고 메시지를 어떻게 처리할지 결정할 수 있다.

       

      비유 방식 서버 처리
      봉투 없는 쪽지 단순 문자열 내용을 읽어 의미를 추측해야 함
      봉투 있는 편지 규칙 있는 메시지 봉투(type)만 보고 처리 방법 결정

       

      단순 문자열 방식과 규칙 있는 방식 비교

      구분 단순 문자열 방식 규칙 있는 메시지 방식
      예시 "안녕하세요" {"type": "chat", "content": "안녕하세요"}
      서버 처리 문자열 내용을 직접 비교 type 항목을 먼저 확인
      기능 추가 if문이 계속 늘어남 type 하나 추가로 처리
      "exit" 채팅 종료 명령으로 처리됨 type이 "chat"이면 채팅으로 처리
      최종 프로젝트 적합성 낮음 높음

       

      실제 서비스에서의 예

      실제 서비스도 메시지 종류를 구분하기 위한 규칙을 사용한다.

       

      서비스 메시지 규칙 예시
      카카오톡 일반 메시지, 이모티콘, 파일, 읽음 확인이 서로 다른 type으로 구분됨
      유튜브 라이브 채팅 일반 채팅, 슈퍼챗, 멤버 메시지가 type으로 구분되어 화면에 다르게 표시됨
      온라인 게임 이동, 공격, 채팅, 아이템 사용이 각각 다른 패킷 구조로 전달됨

       

      메시지 구조 판단 기준 정리

      메시지에 들어갈 수 있는 기본 정보는 다음과 같다.

       

      항목 의미 예시
      type 메시지 종류 chat, join, leave, error, whisper
      sender 보낸 사람 user1
      target 받는 사람 user2, all
      content 실제 메시지 내용 안녕하세요

       

      모든 메시지가 항상 모든 항목을 가져야 하는 것은 아니다.

      전체 채팅은 target이 필요하지 않을 수 있지만, 귓속말은 누구에게 보낼지 알아야 하기 때문에 target이 필요하다.

       

      메시지 종류별 필요한 정보

      메시지 종류 필요한 항목 설명
      일반 채팅 type, sender, content 모두에게 전달할 메시지
      입장 알림 type, sender 누가 들어왔는지 알림
      퇴장 알림 type, sender 누가 나갔는지 알림
      귓속말 type, sender, target, content 특정 사용자에게만 전달
      오류 메시지 type, content 잘못된 요청이나 실패 이유 전달
      파일 전송 type, sender, filename, size 파일 정보 전달

       

      귓속말 예시로 보는 차이

      비교 단순 문자열 규칙 있는 구조
      귓속말 표현 "/w user2 안녕하세요" {"type": "whisper", "target": "user2", "content": "안녕하세요"}
      서버 처리 message.startswith("/w") message["type"] == "whisper"
      띄어쓰기 오류 오류 발생 가능 영향 없음
      명령어 추가 if문 추가 type 항목 하나 추가

       

      정리
      프로토콜은 서버와 클라이언트가 메시지를 어떤 형식으로 주고받을지 정한 약속이다.

      단순 문자열 방식은 기능이 늘어날수록 구분이 어려워지지만, type을 가진 규칙 있는 메시지 구조를 사용하면 서버가 메시지 종류를 명확하게 판단할 수 있다.

      최종 채팅 프로젝트에서는 chat, join, leave, whisper, error 같은 type을 기준으로 메시지를 처리하는 구조가 필요하다.

      'Server - Client' 카테고리의 다른 글

      패킷 경계란?  (0) 2026.06.25
      JSON 기반 메시지 타입 설계  (0) 2026.06.23
      전체 채팅 브로드캐스팅  (0) 2026.06.23
      접속자 목록 관리  (0) 2026.06.23
      스레드로 클라이언트 처리  (0) 2026.06.23
      다음글
      다음 글이 없습니다.
      이전글
      이전 글이 없습니다.
      댓글
    조회된 결과가 없습니다.
    스킨 업데이트 안내
    현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
    ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바