728x90
0.의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-amqp'
0.Docker
rabbitmq:
image: rabbitmq:4.0-management
container_name: rabbitmq
restart: always
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
ports:
- "5672:5672" # AMQP 통신 포트
- "15672:15672" # Management UI 포트 (브라우저 접속용)
volumes:
- rabbitmq_data:/var/lib/rabbitmq
1. 설정
1-1.RabbitConfig.java
3D 모델 생성을 위한 워크플로우의 예제이다.
@Configuration
public class RabbitConfig {
// Exchange: 메시지를 적절한 큐로 배정하는 배선반 역할을 합니다.
public static final String MODEL3D_EXCHANGE = "model3d.exchange";
// Queue: 실제 메시지가 소비(Consume)되기 전까지 대기하는 저장소입니다.
public static final String MODEL3D_QUEUE = "model3d.upload.queue";
// Routing Key: Exchange가 메시지를 큐로 보낼 때 참조하는 '주소' 혹은 '태그'입니다.
public static final String MODEL3D_ROUTING_KEY = "model3d.upload";
/**
* 메시지 컨버터 설정
* - RabbitMQ는 기본적으로 byte 배열로 메시지를 전송합니다.
* - Jackson2JsonMessageConverter를 사용하면 Java 객체(DTO)를 JSON으로 자동 변환하여 주고받을 수 있습니다.
* - ObjectMapper는 Spring Boot가 관리하는 것을 주입받아 사용합니다.
*/
@Bean
public MessageConverter messageConverter(ObjectMapper objectMapper) {
return new Jackson2JsonMessageConverter(objectMapper);
}
/**
* Topic Exchange 생성
* - Topic 방식: 라우팅 키의 패턴을 보고 메시지를 배정 (예: model3d.# 등 확장 가능)
* - durable(true): RabbitMQ 서버가 재시작되어도 Exchange 설정이 유지됩니다.
* - autoDelete(false): 사용 중인 큐가 없어도 Exchange가 삭제되지 않습니다.
*/
@Bean
public TopicExchange model3dExchange() {
return new TopicExchange(MODEL3D_EXCHANGE, true, false);
}
/**
* Queue 생성
* - durable(true): RabbitMQ 서버가 재시작되어도 큐와 그 안의 메시지가 증발하지 않고 보존됩니다.
*/
@Bean
public Queue model3dQueue() {
return new Queue(MODEL3D_QUEUE, true);
}
/**
* Binding: Exchange와 Queue를 연결하는 규칙 정의
* - "model3dExchange"로 들어온 메시지 중에서
* - 라우팅 키가 "model3d.upload"인 메시지는
* - "model3dQueue"로 전달하겠다는 설정입니다.
*/
@Bean
public Binding model3dBinding(Queue model3dQueue, TopicExchange model3dExchange) {
return BindingBuilder.bind(model3dQueue)
.to(model3dExchange)
.with(MODEL3D_ROUTING_KEY);
}
}
2.메시지 DTO
메시지를 위한 DTO 클래스다.
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Model3DUploadMessage {
private String imageUrl;
private Long memberId;
private long timestamp;
}
3.Producer
메시지를 실제로 RabbitMQ에 보내는 코드
@Slf4j
@Component
@RequiredArgsConstructor
public class Model3DProducer {
private final RabbitTemplate rabbitTemplate;
/**
* 3D 모델 업로드 메시지 발송
*/
public void sendModel3DUploadMessage(String imageUrl, Long memberId) {
Model3DUploadMessage message = Model3DUploadMessage.builder()
.imageUrl(imageUrl)
.memberId(memberId)
.timestamp(System.currentTimeMillis())
.build();
log.info("3D 모델 업로드 메시지 발송: imageUrl={}, memberId={}", imageUrl, memberId);
rabbitTemplate.convertAndSend(
RabbitConfig.MODEL3D_EXCHANGE, // 어느 교환기(우체국)로 보낼지
RabbitConfig.MODEL3D_ROUTING_KEY, // 어떤 주소(라우팅 키)로 보낼지
message // 보낼 내용(메시지 객체)
);
}
}
3-1.Producer 실제 사용 모습
model3DProducer.sendModel3DUploadMessage(imageUrl, memberId);
4. 테스트용 Producer & Consumer
@Component
@RequiredArgsConstructor
public class RabbitMQTestProducer {
private final RabbitTemplate rabbitTemplate;
/**
* 테스트 메시지 발송
*/
public void sendTestMessage(String id, String content) {
RabbitMQTestMessage message = RabbitMQTestMessage.builder()
.id(id)
.content(content)
.timestamp(System.currentTimeMillis())
.build();
rabbitTemplate.convertAndSend(
RabbitMQTestConfig.TEST_EXCHANGE,
RabbitMQTestConfig.TEST_ROUTING_KEY,
message
);
}
}
@Slf4j
@Component
public class RabbitMQTestConsumer {
private final List<RabbitMQTestMessage> receivedMessages = new ArrayList<>();
@RabbitListener(queues = RabbitMQTestConfig.TEST_QUEUE)
public void consumeTestMessage(RabbitMQTestMessage message) {
log.info("메시지 수신: id={}, content={}, timestamp={}",
message.getId(), message.getContent(), message.getTimestamp());
receivedMessages.add(message);
}
/**
* 수신된 메시지 조회
*/
public List<RabbitMQTestMessage> getReceivedMessages() {
return new ArrayList<>(receivedMessages);
}
/**
* 수신된 메시지 초기화
*/
public void clearReceivedMessages() {
receivedMessages.clear();
}
/**
* 수신된 메시지 개수
*/
public int getMessageCount() {
return receivedMessages.size();
}
}
728x90
'BackEnd > SpringBoot' 카테고리의 다른 글
| [SpringBoot] 통합테스트 (0) | 2025.11.23 |
|---|---|
| [SpringBoot] 동시요청에 대해 (0) | 2025.11.22 |
| [SpringBoot] QueryDSL (0) | 2025.09.30 |