1. CONNECT
기능: 클라이언트가 서버와 연결을 요청할 때 사용하는 STOMP 프레임입니다.
주요 헤더:
accept-version: 클라이언트가 지원하는 STOMP 버전(예: 1.0, 1.1, 1.2 등).
host: 클라이언트가 연결하려는 대상 호스트 정보를 명시.
설명: 클라이언트는 이 프레임을 통해 자신이 지원하는 STOMP 버전과 연결할 호스트 정보를 서버에 알립니다. 서버는 이를 참고하여 연결 가능 여부를 판단합니다.
2. CONNECTED
기능: 서버가 클라이언트의 연결 요청을 수락했음을 알리는 응답 프레임입니다.
주요 헤더:
version: 서버가 지원하는 STOMP 버전.
설명: 서버는 클라이언트의 요청을 승인한 후 이 프레임을 반환하며, 서버와 클라이언트 간의 연결이 성공적으로 이루어졌음을 알립니다.
3. SUBSCRIBE
기능: 클라이언트가 특정 주제를 구독할 때 사용하는 프레임입니다.
주요 헤더:
id: 구독을 식별하기 위한 고유 ID.
destination: 클라이언트가 구독하려는 주제(예: /topic/chatroom/1).
설명: 클라이언트는 이 프레임을 통해 특정 주제를 구독할 수 있으며, 이후 해당 주제에 발행되는 메시지를 수신하게 됩니다.
4. UNSUBSCRIBE
기능: 클라이언트가 특정 주제에 대한 구독을 취소할 때 사용하는 프레임입니다.
주요 헤더:
id: 구독 식별 ID(구독 당시 SUBSCRIBE에서 설정한 ID).
설명: 구독 ID를 기반으로 클라이언트는 더 이상 해당 주제의 메시지를 수신하지 않도록 구독을 취소할 수 있습니다.
5. SEND
기능: 클라이언트가 특정 주제로 메시지를 전송할 때 사용하는 프레임입니다.
주요 헤더:
destination: 메시지를 보낼 대상 주제.
설명: 클라이언트는 이 프레임을 통해 특정 주제에 메시지를 발행하며, 이를 구독 중인 모든 클라이언트가 메시지를 수신하게 됩니다.
6. MESSAGE
기능: 서버가 클라이언트에게 메시지를 전달할 때 사용하는 프레임입니다.
주요 헤더:
subscription: 메시지를 수신한 구독 ID.
message-id: 서버가 메시지를 식별하기 위해 부여한 고유 ID.
destination: 메시지가 발행된 주제.
설명: 서버는 이 프레임을 통해 특정 주제에 발행된 메시지를 해당 주제를 구독 중인 클라이언트들에게 전달합니다.
7. ACK/NACK
기능: 클라이언트가 메시지 수신 상태를 서버에 알리기 위해 사용하는 응답 프레임입니다.
주요 헤더:
id: 확인 또는 거부할 메시지의 고유 ID(주로 message-id).
설명:
ACK: 클라이언트가 메시지를 정상적으로 수신했음을 서버에 알립니다.
NACK: 클라이언트가 메시지 수신이나 처리를 실패했음을 서버에 알립니다.
추가 설명: 메시지의 안정성을 보장하기 위해 서버는 ACK/NACK 응답을 통해 메시지 처리를 추적합니다.
8. DISCONNECT
기능: 클라이언트가 서버와의 연결을 종료할 때 사용하는 프레임입니다.
주요 헤더: 특별히 지정된 헤더는 없음.
설명: 클라이언트는 이 프레임을 보내 서버와의 연결을 정상적으로 종료할 수 있습니다. 연결 종료 후 리소스가 해제됩니다.
그러면 1대1 채팅에서는 STOMP 포멧이 어떻게 이루어지나요?
1. 클라이언트에서 서버로 메세지 전송(SEND)
클라이언트가 1대1 채팅에서 메시지를 보낼 때는 SEND 프레임과 함께 JSON 형식의 메시지를 전달합니다.
{
"senderId": "user1",
"receiverId": "user2",
"message": "아쎄이... 기열!",
"timestamp": "2024-11-29T12:30:00Z"
}
필드 설명:
- senderId: 메시지를 보낸 사용자 ID.
- receiverId: 메시지를 받을 사용자 ID.
- message: 실제 메시지 내용.
- timestamp: 메시지가 전송된 시간.
STOMP SEND 프레임 예시
SEND
destination:/app/chat/room/1
content-type:application/json
{
"senderId": "user1",
"receiverId": "user2",
"message": "아쎄이... 기합!",
"timestamp": "2024-11-29T12:30:00Z"
}
2. 서버에서 클라이언트로 메시지 전달 (MESSAGE)
서버는 구독된 클라이언트에게 메시지를 전달할 때 MESSAGE 프레임과 JSON 데이터를 사용합니다.
{
"chatRoomId": "room1",
"senderId": "user1",
"message": "니가 선택한 해병대다! 악으로 깡으로 버텨라!",
"timestamp": "2024-11-29T12:30:00Z"
}
필드 설명:
- chatRoomId: 1대1 채팅방의 ID.
- senderId: 메시지를 보낸 사용자 ID.
- message: 전달된 메시지 내용.
- timestamp: 메시지가 전달된 시간.
STOMP MESSAGE 프레임 예시
MESSAGE
subscription:sub-0
message-id:001
destination:/user/queue/chat
{
"chatRoomId": "room1",
"senderId": "user2",
"message": "누구세용?",
"timestamp": "2024-11-29T12:30:00Z"
}
4. 구독 요청 (SUBSCRIBE)
1대1 채팅에서 클라이언트는 특정 사용자와의 채팅 메시지를 구독합니다.
STOMP SUBSCRIBE 프레임 예시
SUBSCRIBE
id:sub-0
destination:/user/queue/chat
destination: 구독하려는 메시지 큐의 경로. 일반적으로 /user/queue/chat 형태로, 클라이언트별 큐를 사용합니다.
포맷 요약
1. 데이터 포맷: JSON 사용.
2. 전송 구조:
- 클라이언트 → 서버: SEND + JSON 데이터.
- 서버 → 클라이언트: MESSAGE + JSON 데이터.
3. 필수 필드:
- senderId, receiverId, message, timestamp.
- 채팅방 ID가 필요한 경우 chatRoomId 추가.
이 방식은 직관적이고, 클라이언트-서버 간 메시지 송수신의 확장성을 제공합니다.