본문 바로가기

Study Information Technology

Spring Boot와 RabbitMQ를 활용한 메시징 시스템 구현

728x90
반응형

Spring Boot와 RabbitMQ를 활용한 메시징 시스템 구현

Overview

Spring Boot와 RabbitMQ를 사용하여 메시징 시스템을 구현하는 것은 비동기 통신을 통해 애플리케이션의 다양한 구성 요소 간에 데이터와 이벤트를 전송할 수 있게 해줍니다. 이러한 아키텍처는 마이크로서비스 환경에서 특히 유용하며, 서비스 간의 느슨한 결합과 높은 확장성을 제공합니다. 이번 글에서는 RabbitMQ와 Spring Boot를 이용한 간단한 메시징 시스템의 구조와 구현 방법에 대해 자세히 설명하겠습니다.

1. RabbitMQ 소개

RabbitMQ는 오픈 소스 메시지 브로커로, 다양한 메시징 패턴을 지원합니다. 기본적으로 메시지를 큐에 저장하고, 소비자가 그 큐에서 메시지를 읽어가는 구조로 되어 있습니다. 이로 인해 메시지를 보내는 시스템(생산자)과 메시지를 받는 시스템(소비자) 간의 결합을 줄일 수 있습니다.

특징

  • 비동기 처리: 메시지를 보내고 즉시 응답을 기다리지 않기 때문에 시스템이 더 유연하게 작동합니다.
  • 내결함성: 메시지는 큐에 저장되어 소비자가 언제든지 읽을 수 있습니다.
  • 스케일 아웃: 여러 소비자를 추가하여 부하를 분산할 수 있습니다.

2. Spring Boot 프로젝트 설정

Spring Boot로 RabbitMQ를 사용하는 프로젝트를 설정하려면 몇 가지 준비가 필요합니다.

2.1. 의존성 추가

pom.xml에 RabbitMQ와 Spring Boot Starter를 추가합니다. 아래 코드를 참조하세요.

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

2.2. RabbitMQ 설정

RabbitMQ 서버를 로컬에서 실행하기 위해 Docker를 사용할 수 있습니다. 다음과 같은 명령어로 RabbitMQ를 실행할 수 있습니다.

docker run -d --hostname rabbitmq --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

이렇게 하면 RabbitMQ가 실행되며, 관리 웹 UI에 접속하려면 브라우저에서 http://localhost:15672로 이동하고, 기본 사용자 이름과 비밀번호는 guest입니다.

3. 메시징 시스템 구현

이제 RabbitMQ를 이용한 메시징 시스템을 구현해 보겠습니다.

3.1. 메시지 생산자 설정

메시지 생산자는 특정 큐에 메시지를 전송합니다. 아래의 코드를 통해 생산자를 설정할 수 있습니다.

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageProducer {

@Autowired
private RabbitTemplate rabbitTemplate;

public void sendMessage(String message) {
rabbitTemplate.convertAndSend("myQueue", message);
System.out.println("메시지 전송: " + message);
}
}

위 코드에서 myQueue는 큐의 이름입니다. 이 큐는 소비자가 메시지를 수신하는 데 사용됩니다.

3.2. 메시지 소비자 설정

소비자는 큐에서 메시지를 읽어 처리하는 역할을 합니다. 아래 코드를 통해 소비자를 설정할 수 있습니다.

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

@Component
public class MessageConsumer {

@RabbitListener(queues = "myQueue")
public void receiveMessage(String message) {
System.out.println("메시지 수신: " + message);
}
}

@RabbitListener 어노테이션을 통해 특정 큐에서 메시지를 수신합니다.

3.3. 애플리케이션 시작

이제 Spring Boot 애플리케이션을 시작합니다. 아래의 코드는 Spring Boot 애플리케이션의 진입점입니다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MessagingApplication {

public static void main(String[] args) {
SpringApplication.run(MessagingApplication.class, args);
}
}

4. 메시지 전송 및 수신 확인

애플리케이션을 실행하고 메시지를 전송하기 위해 REST 컨트롤러를 추가할 수 있습니다. 아래 코드를 참조하세요.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageController {

@Autowired
private MessageProducer messageProducer;

@PostMapping("/send")
public String send(@RequestBody String message) {
messageProducer.sendMessage(message);
return "메시지 전송 완료";
}
}

위의 REST API를 통해 /send 엔드포인트에 POST 요청을 보내면, 메시지를 전송할 수 있습니다. 요청 예시는 다음과 같습니다.

curl -X POST -d "Hello, RabbitMQ!" http://localhost:8080/send

5. 에러 처리

메시징 시스템을 구현할 때 발생할 수 있는 에러와 그 해결 방법에 대해 알아보겠습니다.

5.1. 메시지 전송 실패

메시지를 큐에 전송하지 못하는 경우 다음과 같은 에러 메시지가 발생할 수 있습니다.

org.springframework.amqp.AmqpException: Failed to send Message

이런 경우, RabbitMQ 서버가 실행 중인지, 네트워크 연결이 정상인지 확인해야 합니다.

5.2. 메시지 수신 실패

소비자가 메시지를 수신하지 못하는 경우는 아래와 같은 메시지가 출력될 수 있습니다.

No consumers for this queue

이 경우, 소비자 클래스가 정상적으로 등록되었는지 확인하고, 큐 이름이 맞는지 체크해야 합니다.

6. 결론

Spring Boot와 RabbitMQ를 활용한 메시징 시스템은 비동기 통신을 통해 서비스 간의 결합을 줄이고, 확장성을 높여줍니다. 이 글에서 살펴본 간단한 메시징 시스템 구현을 통해 비즈니스 로직의 분리와 시스템 아키텍처의 유연성을 확보할 수 있습니다.

추가로, RabbitMQ의 다양한 기능을 활용해 큐의 우선순위 설정, 메시지 지속성 등 고급 기능을 구현할 수 있습니다.

참고문서

반응형