[RabbitMQ] 메시지 속성에 대하여
들어가기 전
이번 포스팅에서는 RabbitMQ에서 메시지를 발행할 때 설정할 수 있는 메시지 속성에 대해서 알아보겠습니다.
메시지 속성
RabbitMQ에서 설정할 수 있는 메시지 속성은 아래와 같습니다.
| 속성 | 유형 | 사용처 | 명시된 내용 |
| content-type | 짧은 문자열 | 애플리케이션 | MIME Types를 사용해 메시지 본문의 유형을 지정하는데 사용 |
| content-encoding | 짧은 문자열 | 애플리케이션 | 메시지 본문이 zlib, deflate, 또는 Base64와 같은 특별한 방법으로 인코딩되는지 지정하는데 사용 |
| app-id | 짧은 문자열 | 애플리케이션 | 메시지를 발행하는 애플리케이션을 정의할때 사용 |
| correlation-id | 짧은 문자열 | 애플리케이션 | 메시지가 다른 메시지 혹은 고유하게 식별 가능한 항목을 참조하고 있는 경우, correlation-id를 이용해 메시지가 참조하는 내용을 나타내는데 사용 |
| delivery-mode | octet | RabbitMQ | 1은 RabbitMQ가 메시지를 메모리에 보관, 2는 디스크에 기록 |
| expiration | 짧은 문자열 | RabbitMQ | 메시지 만료되는 시기를 나타내는데 사용하는 텍스트 문자열의 유닉스 시간 값 |
| headers | 테이블 | 양쪽 모두 | 메시지에 대한 추가적인 메타데이터를 첨부하는데 사용할 수 있는 자유 형식 키/값 테이블이고 원하는 경우 RabbitMQ가 이 값을 기반으로 라우팅 할 수 있음 |
| message-id | 짧은 문자열 | 애플리케이션 | 애플리케이션이 메시지를 식별하는데 사용할 수 있는 UUID와 같은 고유 식별자 |
| priority | octet | RabbitMQ | 큐에서 메시지의 우선순위를 지정하는 속성 |
| timestamp | timestamp | 애플리케이션 | 메시지 작성 시점을 나타내는데 사용하는 유닉스 시간 값 |
| type | 짧은 문자열 | 애플리케이션 | 애플리케이션이 메시지 유형 또는 페이로드를 설명하는데 사용할 수 있는 텍스트 문자열 |
| user-id | 짧은 문자열 | 양쪽 모두 | RabbitMQ가 연결된 사용자에 대해 유효성을 검사하고 일치하지 않는 메시지를 삭제하는 자유 형식 문자열 |
이와 같은 메시지에 여러 가지 속성을 지정할 수 있습니다.
콘텐츠 헤더 프레임에 메시지 속성은 Basic.Properties 데이터 구조로 사전에 정의한 값이 있는 집합입니다.
위 항목들에 대해서 아래에서 자세히 다뤄보겠습니다.
Content-Type
메시지에 본문 형식에 대한 설명이 포함되지 않을 경우 암묵적으로 사용되고 있는 메시지의 포맷 또는 내용을 사용하여 애플리케이션에서 오류가 발생할 가능성이 높습니다.
메시지에 대한 설명이 포함되어 있다면 소비자 애플리케이션을 작성할 때 메시지의 본문을 디코딩하는 방법을 메시지에서 직접 확인할 수 있습니다.
메시지에 대한 설명을 보내기 위해 Basic.Properties 데이터 구조에 있는 content-type을 사용할 수 있습니다.
content-type 속성은 Http 스펙에 있는 content-type의 다양한 값처럼 메시지 본문의 MIME 유형을 전달합니다.
예를 들어 많이 사용하는 JSON으로 직렬화한 데이터를 보내는 경우 content-type을 application/json으로 설정하면 소비자 애플리케이션을 작성할 때 메시지 수신 시에 메시지 유형을 검사하고 올바르게 디코딩하도록 처리할 수 있습니다.
Content-Encoding
content-encoding은 압축 여부를 자동 처리하는 기능이 아니라, 메시지 바디의 인코딩 방식을 표시하기 위한 메타 정보이다.
소비자가 이를 참고하여 메시지 본문을 적절하게 디코딩할 수 있습니다.
message-id
AMQP 스펙에서 message-id 속성은 애플리케이션 용도로 지정이 되어있습니다.
이 의미는 애플리케이션에서 원하는 용도로 사용할 수 있음을 뜻합니다.
최대 255바이트의 UTF-8로 인코딩 된 값을 가지며 Basic.Properties 데이터 구조에 포함된 메타데이터로 저장됩니다.
message-id 속성은 메시지가 느슨하게 결합된 시스템의 다양한 구성요소를 통과할 때마다 메시지를 고유하게 식별될 수 있도록 헤더 성격의 메타 데이터로 전달됩니다.
주문이나 결제와 같은 요청을 추적하고 구분하는 용도로 활용할 수 있다.
correlation-id
correlation-id는 message-id 속성과 동일하게 애플리케이션 용도로 지정되어 있습니다.
현재 메시지와 관련된 메시지의 message-id를 값으로 지정해 다른 메시지에 대한 응답임을 표시할 때 사용할 수 있습니다.
또는 트랜잭션 ID나 메시지가 참조하는 다른 데이터를 전달하는 데 사용할 수 있습니다.
timestamp
timestamp 속성은 correlation-id와 message-id처럼 애플리케이션 용도로 지정이 되어있습니다.
유닉스 시간을 초로 나타내는 정수로 전송됩니다.
예를 들어 2026년 1월 18일 자정은 11768662000으로 표시됩니다.
정수값으로 인코딩 된 값은 메시지에서 8바이트 공간만 차지합니다.
주의할 점은 시간대 정보가 없으므로 UTC 혹은 다른 일관된 시간대를 설정해서 사용하는 것이 좋습니다.
나중에 시간대를 기준으로 표준화하면 지리적으로 분산된 RabbitMQ 서버로 메시지가 이동해 향후에 발생할 수 있는 문제를 방지할 수 있습니다.
timestamp는 애플리케이션에서 사용할 필요 없더라도 RabbitMQ를 통한 메시지 흐름에서 예상치 못한 동작을 진단할 때 유용하고 메시지 생성 시점을 기록하여 메시지 발행할 때 성능을 측정할 수 있습니다.
expiration
expiration 속성은 RabbitMQ에서 메시지의 생존 시간(TTL, Time-To-Live)을 지정하는 데 사용됩니다.
해당 값은 메시지가 큐에 삽입된 시점을 기준으로, 얼마 동안(milliseconds) 유효한지를 나타내는 문자열 값입니다.
expiration의 타입은 AMQP 0-9-1 기준 shortstr이며, 실제 값은 "60000"과 같이 밀리초 단위의 숫자를 문자열 형태로 설정합니다.
이 속성은 절대적인 만료 시각(Unix timestamp)을 의미하지 않으며 ISO-8601 형식이나 Unix time 값은 지원되지 않습니다..
메시지가 큐에 도착했을 때 TTL이 만료된 경우 해당 메시지는 큐에 저장되지 않거나 즉시 만료 처리됩니다.
메시지 TTL(expiration)은 브로커 구현에 따라 동작 세부 사항이 다를 수 있으므로, 다른 AMQP 브로커를 사용할 경우 사전 검증이 필요합니다.
delivery-mode
delivery-mode 속성은 소비자에게 전달하기 전에 메시지를 메모리에 저장할지, 디스크에 저장할지 여부를 지정하는 데 사용하고 1바이트의 공간을 차지합니다.
메시지를 메모리에 저장하는 경우는 1, 디스크에 저장하는 경우에는 2로 설정을 합니다.
1로 설정된 경우는 비지속성 메시지, 2로 설정된 경우는 지속성 메시지를 의미합니다.
메시지를 디스크에 저장하면 RabbitMQ 재시작하더라도 메시지가 소비될 때까지 큐에 남아있게 됩니다.
메모리 I/O는 디스크 I/O보다 빠르기 때문에 1로 설정하면 빠르게 메시지를 발행할 수 있습니다.
상황에 맞게 delivery-mode 속성을 사용하여 메시지를 처리하는 것이 중요합니다.
메시지 유실로 인해 비즈니스가 위험에 빠지지 않는 상황이라면 1로 설정하고 그렇지 않은 경우에는 2로 설정하여 메시지를 처리하도록 설정하는 것이 좋습니다.
디스크에 메시지를 저장하는 일은 메시지 브로커가 중단된 경우에도 메시지가 손실되지 않습니다.
대신 잠재적인 성능 문제나 확장 문제가 초래할 수 있습니다.
app-id
app-id 속성은 최대 255자의 짧은 UTF-8 문자열 형태이고 소비자 애플리케이션에서 메시지를 처리하기 전에 유효성 검증하는 용도로 활용됩니다.
애플리케이션이 API 중심으로 설계돼 버전관리가 필요한 경우 app-id를 사용해 생성된 메시지와 함께 특정 버전 API와 버전을 전달할 수 있습니다.
메시지를 처리하기 전 app-id를 검사해서 알 수 없거나 지원하지 않는 출처의 메시지인 경우 애플리케이션에서 메시지를 삭제할 수 있습니다.
큐에 대기하고 있는 메시지 중에서 문제가 발생하면 출처를 추적할 때 사용하면 쉽게 추적할 수 있습니다.
user-id
user-id 속성은 app-id처럼 소비자 애플리케이션에서 메시지를 처리하기 전에 유효성 검증하는 용도로 활용됩니다.
RabbitMQ는 메시지를 발행하는 사용자에 대해 user-id 속성 값으로 발행된 모든 메시지를 검사하고 두 값이 일치하지 않으면 메시지가 거부됩니다.
사용자 인증 경우에는 로그인한 사용자를 식별하기 위해 user-id 속성을 사용하는 것을 권장하지 않습니다.
type
type 속성은 메시지의 논리적인 종류나 의미를 나타내기 위한 애플리케이션 전용 메타데이터입니다.
브로커는 해당 값을 해석하지 않으며 소비자 애플리케이션이 메시지를 처리하기 전에 이벤트 유형, 명령 종류, 또는 메시지 스키마를 식별하는 용도로 활용할 수 있습니다.
이를 통해 하나의 큐나 익스체인지에서 전달되는 다양한 종류의 메시지를 type 값에 따라 분기 처리할 수 있습니다.
headers
headers 속성은 임의의 사용자 정의 키와 값을 가지는 테이블입니다.
키는 최대 255자의 길이를 갖는 ASCII 또는 유니코드 문자열을 설정할 수 있습니다.
다른 속성들과 달리 원하는 모든 데이터를 headers 테이블에 추가할 수 있습니다.
RabbitMQ는 라우팅 키를 사용하는 대신 헤더 테이블에 채원진 값 기반으로 메시지를 라우팅 할 수도 있습니다.
reply-to
reply-to 속성은 애플리케이션 용도로 지정이 되어있습니다.
메시지를 처리한 소비자가 응답 메시지를 전송해야 할 큐 이름을 지정하는 데 사용됩니다.
주로 RPC 패턴에서 사용되며 요청자는 reply-to에 응답 큐를 지정하고 correlation-id를 함께 설정하여 요청–응답 메시지를 매칭합니다.
priority
priority 속성의 값은 메시지의 우선순위 지정에 사용하고 0 ~ 9까지의 값을 갖는 정수로 정의합니다.
priority가 9인 메시지가 발행하고 난 뒤 0인 메시지가 발행되면 새로 연결된 소비자 애플리케이션은 priority가 0인 메시지를 먼저 받게 됩니다.
즉 숫자가 작을수록 우선순위가 높습니다.
지금까지 메시지를 발행할 때 설정할 수 있는 속성에 대해서 알아보았습니다.
아래에서 Java를 활용해서 어떻게 속성을 설정하는지에 대해서 알아보겠습니다.
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.time.Instant;
import java.util.Date;
import java.util.concurrent.TimeoutException;
public class MessageProperties {
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
channel.basicPublish("exchangeName", "routingKey",
new BasicProperties(
"contentType",
"contentEncoding",
null,
1,
0,
"correlationId",
"repltTo",
"expiration",
"messageId",
Date.from(Instant.now()),
"type",
"userId",
"appId",
"clusterId"
),
new byte[]{}
);
}
}
channel.basicPublish를 통해 메시지를 발행할 때 메서드 프레임, 콘텐츠 헤더, 바디 프레임을 구성하여 발행합니다.
이때 첫 번째, 두 번째 인자인 익스체인지이름과 라우팅 키는 메서드 프레임에 속하고, new BasicProperties 부분은 콘텐츠 헤더에 포함됩니다.
그리고 new btye []{} 부분은 바디 프레임에 속합니다.
아래에 정의된 BasicProperties 생성자를 통해 메시지 발행 시 사용할 메시지 속성(Properties)을 설정할 수 있습니다.
이 생성자로 생성된 BasicProperties 객체는 channel.basicPublish 호출 시 전달되어 AMQP 메시지의 콘텐츠 헤더 프레임에 포함됩니다.

'RabbitMQ' 카테고리의 다른 글
| [RabbitMQ] 익스체인지, 큐 생성 및 연결하는 방법과 메시지 발행 및 소비하는 과정 (0) | 2026.01.13 |
|---|---|
| [RabbitMQ] AMQP 프레임 유형 (0) | 2026.01.11 |
| [RabbitMQ] RabbitMQ 기능과 장점 (0) | 2026.01.05 |
댓글
이 글 공유하기
다른 글
-
[RabbitMQ] 익스체인지, 큐 생성 및 연결하는 방법과 메시지 발행 및 소비하는 과정
[RabbitMQ] 익스체인지, 큐 생성 및 연결하는 방법과 메시지 발행 및 소비하는 과정
2026.01.13 -
[RabbitMQ] AMQP 프레임 유형
[RabbitMQ] AMQP 프레임 유형
2026.01.11 -
[RabbitMQ] RabbitMQ 기능과 장점
[RabbitMQ] RabbitMQ 기능과 장점
2026.01.05