본문 바로가기
IT, 개발/JAVA

Spring 프레임워크 MQTT 연동하기

by 개발자스터디 2024. 8. 23.
반응형

 

안녕하세요! 오늘은 Spring Framework에서 MQTT를 연동하는 방법을 소개해드리려고 합니다. IoT 기기들과의 통신을 위해 많이 사용되는 MQTT 프로토콜을 Spring 애플리케이션에서 어떻게 사용하는지 궁금하시다면, 이 글을 참고해주세요.

 

1. MQTT란?

먼저, 간단하게 MQTT에 대해 짚고 넘어가볼게요. MQTT(Message Queuing Telemetry Transport)는 가벼운 메시지 통신 프로토콜로, 주로 IoT 환경에서 많이 사용됩니다. 낮은 대역폭과 낮은 전력 소비가 중요한 환경에서 효율적으로 통신할 수 있도록 설계되었습니다.

 

MQTT는 Publisher-Subscriber 모델을 기반으로 하고, 브로커(Broker)를 통해 메시지를 전달합니다. 각 클라이언트는 특정 토픽을 구독(Subscribe)하거나 발행(Publish)하여 서로 통신할 수 있습니다.

 

 

2. Spring에서 MQTT 사용하기

Spring에서는 spring-integration-mqtt 모듈을 사용하여 MQTT를 쉽게 연동할 수 있습니다. 이제부터는 실제 프로젝트에 MQTT를 연동하는 방법을 단계별로 설명드릴게요.

 

2.1 의존성 추가

우선, Maven 프로젝트의 pom.xml에 필요한 의존성을 추가해야 합니다. Gradle을 사용하신다면 해당 의존성을 build.gradle 파일에 추가하면 됩니다.

 
1
2
3
4
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mqtt</artifactId>
</dependency>
cs

 

2.2 MQTT 설정하기

다음으로는 MQTT 브로커와의 연결을 설정하는 작업이 필요합니다. @Configuration 클래스를 사용해 설정을 정의할 수 있습니다.

 

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
32
33
34
@Configuration
public class MqttConfig {
 
    @Bean
    public MqttPahoClientFactory mqttClientFactory() {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setServerURIs("tcp://broker.hivemq.com:1883"); // 브로커 주소
        return factory;
    }
 
    @Bean
    public MessageChannel mqttInputChannel() {
        return new DirectChannel();
    }
 
    @Bean
    public MessageProducerSupport mqttInbound() {
        MqttPahoMessageDrivenChannelAdapter adapter =
                new MqttPahoMessageDrivenChannelAdapter("testClient", mqttClientFactory(),
                                                        "test/topic");
        adapter.setOutputChannel(mqttInputChannel());
        return adapter;
    }
 
    @Bean
    @ServiceActivator(inputChannel = "mqttInputChannel")
    public MessageHandler handler() {
        return message -> {
            String payload = (String) message.getPayload();
            System.out.println("Received message: " + payload);
        };
    }
}
 
cs

 

위 설정에서는 mqttClientFactory() 메서드를 통해 MQTT 브로커와 연결할 수 있는 MqttPahoClientFactory를 생성합니다. mqttInbound() 메서드에서는 MQTT 메시지를 수신할 수 있는 MqttPahoMessageDrivenChannelAdapter를 생성하고, 특정 토픽을 구독하도록 설정합니다.

handler() 메서드는 메시지를 처리하는 로직을 정의합니다. 여기서는 간단하게 콘솔에 수신된 메시지를 출력하도록 했습니다.


2.3 MQTT 메시지 발행하기

이제 Spring 애플리케이션에서 MQTT 메시지를 발행하는 방법을 알아보겠습니다. MqttTemplate을 사용하면 간단하게 메시지를 발행할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Service
public class MqttPublisher {
 
    private final MqttTemplate mqttTemplate;
 
    public MqttPublisher(MqttTemplate mqttTemplate) {
        this.mqttTemplate = mqttTemplate;
    }
 
    public void publish(String topic, String payload) {
        mqttTemplate.convertAndSend(topic, payload);
        System.out.println("Message published to topic: " + topic);
    }
}
 
cs

 

위 코드에서 MqttPublisher 클래스는 MqttTemplate을 주입받아 MQTT 메시지를 발행합니다. publish() 메서드를 통해 특정 토픽에 메시지를 발행할 수 있으며, 메시지가 발행되면 콘솔에 확인 메시지를 출력합니다.

 

2.4 간단한 테스트

마지막으로, Spring 애플리케이션에서 MQTT 메시지를 발행하고 수신하는 간단한 테스트를 해볼 수 있습니다. 아래와 같이 테스트 코드를 작성해봅시다.

1
2
3
4
5
6
7
8
9
10
11
@SpringBootApplication
public class MqttApplication {
 
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MqttApplication.class, args);
 
        MqttPublisher publisher = context.getBean(MqttPublisher.class);
        publisher.publish("test/topic""Hello MQTT");
    }
}
 
cs

 

이제 애플리케이션을 실행하면, "test/topic"이라는 토픽에 "Hello MQTT" 메시지가 발행되고, 구독자가 이 메시지를 수신하는 것을 콘솔에서 확인할 수 있을 거예요.

 

3. 결론

오늘은 Spring에서 MQTT를 연동하는 방법을 알아봤습니다. Spring의 강력한 의존성 주입과 다양한 유틸리티 덕분에 비교적 간단하게 MQTT를 연동할 수 있었죠. 이 가이드를 참고하여 여러분의 프로젝트에서도 MQTT를 활용해보세요!

궁금한 점이나 추가적으로 다루었으면 하는 내용이 있다면 언제든지 댓글로 남겨주세요. 감사합니다!

728x90
반응형