티스토리 뷰

카테고리 없음

AmqpTemplate 소개

행복[HappY] 2025. 3. 10. 11:56

AmqpTemplate 개요

AmqpTemplate은 Spring AMQP에서 제공하는 메시징 인터페이스로, AMQP(Advanced Message Queuing Protocol)를 기반으로 한 메시지 큐 시스템에서 메시지를 송수신하는 기능을 제공합니다.
주로 RabbitMQ와 함께 사용되며, 메시지 전송과 수신을 추상화하여 쉽게 사용할 수 있도록 도와줍니다.

 

 

 

1. AmqpTemplate의 역할

AmqpTemplate은 Spring에서 AMQP 메시지 브로커와 상호작용하기 위한 핵심 인터페이스입니다.
이를 구현한 주요 클래스는 RabbitTemplate이며, RabbitTemplate을 통해 RabbitMQ와의 메시징을 쉽게 수행할 수 있습니다.

1) 주요 기능

  • 메시지 전송 (convertAndSend)
  • 메시지 수신 (receive / receiveAndConvert)
  • 익스체인지와 큐를 지정하여 메시지 전송
  • RPC 스타일의 요청-응답 메시징 지원

 

 

 

2. AmqpTemplate 설정 및 사용 방법

1) 의존성 추가

Spring Boot에서 AmqpTemplate을 사용하려면 spring-boot-starter-amqp를 추가해야 합니다.

Gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-amqp'
}

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

 

2) RabbitMQ 설정 (application.yml)

RabbitMQ 서버와 연결하기 위해 설정을 추가해야 합니다.

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

 

3) AmqpTemplate을 사용한 메시지 전송 (Producer)

AmqpTemplate을 사용하면 메시지를 큐에 쉽게 전송할 수 있습니다.
Spring Boot에서는 RabbitTemplate이 AmqpTemplate을 구현하고 있으므로, RabbitTemplate을 빈으로 주입하여 사용할 수 있습니다.

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;

@Service
public class MessageProducer {
    private final AmqpTemplate amqpTemplate;

    public MessageProducer(AmqpTemplate amqpTemplate) {
        this.amqpTemplate = amqpTemplate;
    }

    public void sendMessage(String queueName, String message) {
        amqpTemplate.convertAndSend(queueName, message);
        System.out.println("Sent: " + message);
    }
}

설명

  • convertAndSend(queueName, message): 지정한 큐로 메시지를 전송합니다.
  • AmqpTemplate 인터페이스를 통해 메시지 전송이 가능하지만, 실제로는 RabbitTemplate이 이를 구현하여 동작합니다.

 

4) AmqpTemplate을 사용한 메시지 수신 (Consumer)

RabbitMQ에서 메시지를 받아 처리하려면 @RabbitListener를 사용할 수 있습니다.

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

@Service
public class MessageConsumer {

    @RabbitListener(queues = "myQueue")
    public void receiveMessage(String message) {
        System.out.println("Received: " + message);
    }
}

설명

  • @RabbitListener(queues = "myQueue"): myQueue에서 메시지를 수신하면 receiveMessage()가 호출됩니다.

 

 

 

3. 익스체인지(Exchange)와 함께 사용하기

RabbitMQ는 메시지를 직접 큐에 넣을 수도 있지만, 보통 익스체인지(Exchange)를 통해 메시지를 라우팅합니다.
익스체인지를 사용하면 메시지를 여러 개의 큐에 전달하거나, 특정 조건에 맞는 큐로만 전달할 수 있습니다.

 

1) 익스체인지와 큐 설정

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue myQueue() {
        return new Queue("myQueue", true);
    }

    @Bean
    public DirectExchange myExchange() {
        return new DirectExchange("myExchange");
    }

    @Bean
    public Binding binding(Queue myQueue, DirectExchange myExchange) {
        return BindingBuilder.bind(myQueue).to(myExchange).with("routingKey");
    }
}

설명

  • Queue("myQueue", true): Durable 큐 생성 (재시작해도 유지됨)
  • DirectExchange("myExchange"): Direct 익스체인지 생성
  • Binding: 큐와 익스체인지를 routingKey를 기준으로 바인딩

 

2) 익스체인지로 메시지 전송하기

RabbitMQ의 익스체인지로 메시지를 보내려면 convertAndSend(익스체인지, 라우팅 키, 메시지)를 사용합니다.

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.stereotype.Service;

@Service
public class ExchangeProducer {
    private final AmqpTemplate amqpTemplate;

    public ExchangeProducer(AmqpTemplate amqpTemplate) {
        this.amqpTemplate = amqpTemplate;
    }

    public void sendMessage() {
        String message = "Hello RabbitMQ via Exchange";
        amqpTemplate.convertAndSend("myExchange", "routingKey", message);
        System.out.println("Sent: " + message);
    }
}

 

 

 

4. AmqpTemplate 주요 메서드

메서드 설명

convertAndSend(String queue, Object message) 지정한 큐로 메시지를 전송
convertAndSend(String exchange, String routingKey, Object message) 익스체인지를 통해 메시지 전송
receive(String queueName) 지정한 큐에서 메시지를 동기적으로 수신 (null 가능)
receiveAndConvert(String queueName) 메시지를 변환하여 동기적으로 수신
convertSendAndReceive(String exchange, String routingKey, Object message) RPC 스타일 요청-응답 방식 지원

 

 

 

5. AmqpTemplate과 RabbitTemplate 차이점

AmqpTemplate은 Spring AMQP의 추상 인터페이스이며, 이를 구현한 클래스가 RabbitTemplate입니다.
즉, RabbitTemplate는 AmqpTemplate의 구현체이며, RabbitMQ에 특화된 추가 기능을 제공합니다.

비교 항목 AmqpTemplate RabbitTemplate

유형 인터페이스 구현체
메시지 전송 O O
메시지 변환 O O (Jackson 등 JSON 변환 지원)
요청-응답 패턴 O O (더 강력한 기능 제공)
RabbitMQ 전용 기능 X O (ConfirmCallback, ReturnCallback 등)

RabbitMQ를 사용할 때는 RabbitTemplate을 사용하는 것이 일반적이며, Spring Boot에서는 자동으로 빈을 등록해주므로 바로 사용할 수 있습니다.

 

 

 

6. 정리

  • AmqpTemplate은 Spring AMQP에서 메시지를 송수신하는 인터페이스입니다.
  • RabbitTemplate은 AmqpTemplate을 구현한 RabbitMQ 전용 클래스입니다.
  • convertAndSend()를 사용하여 메시지를 전송하고, receive()를 사용하여 메시지를 받을 수 있습니다.
  • RabbitMQ의 익스체인지와 큐를 활용하여 메시지를 라우팅할 수 있습니다.
  • spring-boot-starter-amqp를 사용하면 RabbitTemplate을 자동으로 빈으로 등록하여 편리하게 사용할 수 있습니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함