- 이번 포스팅으론 IoT 에 대해 알아보겠습니다.
IoT 개념과 더불어 IoT 를 개발하기 위해 필요한 기술 및 로드맵까지 정리합니다.
- IoT 는 단일 기술이 아닌 여러 기술들 융복합 기술입니다.
특정 분야의 개발자시라면 해당 분야의 기술 습득은 패스할 수 있으며,
아직 개발 경험이 없으시다면 웹 개발 부분으로 먼저 접근하시는 것을 추천드립니다.
(IoT란?)
Internet of Things (사물인터넷) = "사물(Things)" + "인터넷 연결(Internet)"
말 그대로 일상 속 사물들이 정보 단말로서 인터넷에 연결되어 데이터를 주고받고 동작하는 기술입니다.
예를 들어,
스마트 에어컨이 자동으로 온도를 조절하거나,
스마트워치가 심박수를 측정하고 서버에 저장하거나,
집 앞에 사람이 오면 자동으로 조명이 켜지고 정보를 확인하는 등의 서비스가 IoT 이며,
IT 기술 융합으로 현대인의 니즈를 충족시키고 가치를 창출할 수 있습니다.
(IoT의 구성요소)
1. 사물(Things)
실존하는 사물입니다.
IoT 의 사물로 분류되기 위해 필수사항은,
네트워크에 연결되어야 하며,
'센서'의 역할을 하거나, '액추에이터'의 역할을 해야 합니다.
센서(Sensor): 온도, 습도, 빛, 움직임 등을 감지 (ex. DHT11, PIR 센서)
액추에이터(Actuator): 명령에 따라 동작하는 장치 (ex. 모터, 릴레이, LED)
2. 마이크로컨트롤러 / 임베디드 보드
사물 장치를 제어하고 데이터를 전송하는 역할을 합니다.
작은 컴퓨터라 생각하면 됩니다.
ex: Arduino, ESP32, Raspberry Pi
3. 통신 네트워크
사물이 데이터를 전송하는 방법입니다.
Wi-Fi, Bluetooth, Zigbee, LoRa, NB-IoT 등의 종류가 있고,
MQTT, HTTP/HTTPS, CoAP 같은 프로토콜로 서버와 데이터 주고받습니다.
4. 서버/클라우드 플랫폼
중앙에서 데이터 저장, 처리, 분석을 수행하는 부분입니다.
ex: AWS IoT, Google Cloud IoT, Firebase, Node-RED
5. 사용자 인터페이스 (UI)
데이터를 시각화하거나 장치를 제어하는 화면
ex: 웹사이트, 스마트폰 앱 등
- IoT 개발 시작 방법
1. 목표 정하기
사물 인터넷으로 무슨 문제를 해결할지를 결정합니다.
예를들어 자동으로 관리되는 스마트 화분,
원격으로 On/Off 되는 원격 조명,
자동으로 최적 관리되는 지능형 농장 등이 있습니다.
2. IoT 서비스 설계
만들고자 하는 사물 인터넷이 무엇으로 이루어지고 어떻게 구성되며 어떻게 동작하는지에 대한 설계를 수행합니다.
설계 종류 | 설계도 종류 | 설명 |
아키텍쳐 설계 | 시스템 아키텍처 다이어그램 | 센서 → 통신 → 클라우드 → 앱 흐름을 도식화 |
데이터 흐름도(DFD) | 데이터가 어떻게 이동하는지 시각화 | |
통신 프로토콜 명세서 | MQTT, HTTP 등 어떤 방식으로 통신할지 | |
요구사항 명세서 | 기능적/비기능적 요구사항 정의 | |
HW 설계 | 회로도(Schematic) | 어떤 센서/부품을 어떻게 연결할지 |
부품 목록(BOM) | 필요한 부품 리스트와 사양, 수량 | |
PCB 설계도 | 회로 기판을 직접 제작할 때 | |
전원 설계 문서 | 배터리 용량, 전류 계산 등 | |
SW/펌웨어 설계 | 펌웨어 구조도 | 모듈별 기능 설명 (센서 모듈, Wi-Fi 모듈 등) |
상태 전이 다이어그램 | 장치 동작의 흐름 정의 (ex: 대기 → 감지 → 전송) | |
코드 구조 문서 | 사용 언어, 라이브러리, 폴더 구조 등 | |
통신/서버 설계 | MQTT Topic 설계 | 어떤 주제로 데이터를 주고받을지 (예: /home/temp) |
데이터 포맷 정의 | JSON, CSV 등 어떤 형식으로 데이터 전송할지 | |
API 문서 | 클라이언트가 서버에 어떻게 요청/응답하는지 | |
클라우드 아키텍쳐 | AWS, Azure, Firebase 등 구조 정의 | |
UI/UX 설계 | 와이어프레임 | 대시보드 화면 레이아웃 스케치 |
UI 모형(Mockup) | 실제와 비슷한 시각 디자인 | |
사용자 흐름도 | 사용자가 어떤 과정을 통해 데이터를 확인/제어하는지 |
3. 필요한 부품/기기 구매
디바이스 설계상 필요한 센서, 구동부, 마이크로컨트롤러 등을 구매합니다.
4. 펌웨어 개발
Arduino IDE, PlatformIO 등으로 센서 데이터 수집, 장치 동작, 데이터 처리, 서버로 데이터 전송, 서버에서 데이터 수집 등의 기능을 구현합니다.
5. 통신 설정
ex: Wi-Fi 연결 → MQTT 서버에 데이터 전송
6. 서버/클라우드 연동
Node-RED, Firebase, AWS 등을 사용해 데이터 수집 및 저장
7. 웹/앱 개발
실시간 모니터링 및 제어 기능 개발
(IoT 개발 핵심 기술)
기술 범위 | 기술 종류 | 설명 |
임베디드 시스템 & 하드웨어 제어 |
마이크로컨트롤러 프로그래밍 | Arduino, ESP32, STM32 등의 보드 프로그래밍 (C/C++ 또는 MicroPython) 펌웨어 개발 툴 : Arduino IDE, PlatformIO, MicroPython |
센서/액추에이터 활용 | 온습도, 조도, 모션, 토양 습도 등 센서 데이터 읽기 / 모터, 릴레이 제어 등 | |
회로 설계 기초 | 브레드보드, 전압/전류 계산, 전원 설계 등 기본 전자 회로 지식 필요 회로 시뮬레이션 툴 : Tinkercad, Fritzing |
|
PCB 설계 (선택) | 직접 제품화하려면 PCB 도면 그리기 필요 (Eagle, KiCAD 등 사용) | |
네트워크 & 통신 기술 |
무선 통신 | Wi-Fi, Bluetooth, Zigbee, LoRa, NB-IoT 등 IoT 장치 연결 |
네트워크 프로토콜 | HTTP, MQTT, CoAP 등 IoT에서 사용하는 통신 방식 | |
MQTT 브로커 활용 | Mosquitto, HiveMQ 등 브로커를 통해 실시간 메시지 전달 MQTT 브로커 툴 : Mosquitto, HiveMQ, EMQX |
|
IP & 포트 이해 | 장치 간 연결을 위한 네트워크 기본 개념 필요 | |
백엔드 개발 기술 | 데이터 수신 서버 구축 | Node.js, Python(Flask, FastAPI), Java(Spring) 등으로 IoT 데이터를 수신 |
데이터베이스 | MySQL, MongoDB, InfluxDB 등을 사용해 데이터 저장 | |
클라우드 서비스 활용 | AWS IoT, Google Cloud IoT, Firebase 등과 연동 가능 | |
REST API / WebSocket | 프론트엔드와 서버 간 통신 구현 | |
프론트엔드 & 사용자 인터페이스 |
웹 프론트엔드 | HTML, CSS, JavaScript, React, Vue 등으로 대시보드 UI 구성 |
데이터 시각화 | Chart.js, D3.js, Grafana 등을 이용한 실시간 데이터 시각화 | |
앱 개발 (선택) | React Native, Flutter 등으로 모바일 앱 제작 가능 | |
데이터 처리 및 분석 (선택) |
실시간 스트리밍 처리 | Kafka, Spark Streaming, Node-RED 등 |
데이터 분석 | Python(pandas, matplotlib 등)을 활용한 통계/시각화 | |
AI/ML 활용 (고급) | 센서 데이터를 기반으로 예측 모델 적용 (TensorFlow, PyTorch 등) |
- IoT 실무에서 중요한 능력은 다양한 기술의 융합입니다.
IoT 는 결국 소비자가 원하는 제품을 만들어내는 것이 목적이므로 현실 문제를 해결하고 더 나은 해답을 도출할 수 있도록
HW, SW 를 가리지 않고,
센서, 데이터 수집, 데이터 처리, 전송, 시각화, 서버 관리 등의 분야를 가리지 않는 기술 응용이 중요합니다.
(MQTT(Message Queuing Telemetry Transport))
- MQTT(Message Queuing Telemetry Transport)는 IoT에서 가장 많이 사용하는 경량 메시징 프로토콜입니다.
쉽게 말하면,
"인터넷을 통해 장치끼리 가볍고 빠르게 대화하게 해주는 소통 방식" 이라고 보면 됩니다.
- MQTT 핵심 개념 요약
항목 | 설명 |
용도 | IoT 장치 간 데이터 송수신 |
특징 | 가볍고 빠름, 네트워크 상태 안 좋아도 잘 동작 |
통신 방식 | Publish / Subscribe 구조 |
포트 | 기본은 1883 (MQTT), 8883 (MQTT over SSL) |
- MQTT 동작
MQTT는 3가지 구성 요소로 이루어져 있습니다.
1. Publisher (발행자)
데이터를 보냅니다 (예: 온도센서 → 온도 정보 전송)
2. Broker (중개자)
데이터를 중계하는 서버 (예: Mosquitto, HiveMQ)
3. Subscriber (구독자)
데이터를 받습니다 (예: React 대시보드 앱이 온도 구독)
[온도센서 - ESP32] --(publish)---> [MQTT 브로커] ---(subscribe)---> [Spring 서버 or 앱]
- MQTT 브로커 실행
MQTT 의 브로커로 가장 많이 사용되는 오픈소스는 Mosquitto 입니다.
이를 실행시켜 서버 역할을 하게 만들면, 해당 서버가 MQTT 프로토콜로 전달되는 메시지를 수신하여 적절히 연결된 다른 노드로 전달할 것입니다.
MQTT 서버 실행 방식은 구글링 해서 직접 실행시키거나 Docker 를 사용하는 방법도 있습니다.
- 아두이노 MQTT 응용
아두이노에서 MQTT 서버로 메시지를 발행하고 수신하기 위해서는,
PubSubClient, ESP8266WiFi 라이브러리를 사용하여,
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// WiFi 설정
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// MQTT 브로커 설정
const char* mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
// 콜백 함수 - 메시지 수신 시 호출됨
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("메시지 수신됨 [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
void reconnect() {
// MQTT 재연결 루프
while (!client.connected()) {
Serial.print("MQTT 연결 시도 중...");
String clientId = "ESP8266Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("연결 성공!");
// 수신할 topic 구독
client.subscribe("iot/test");
} else {
Serial.print("연결 실패, rc=");
Serial.print(client.state());
Serial.println(" 다시 시도 중...");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// WiFi 연결
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("WiFi 연결 중...");
}
Serial.println("WiFi 연결 완료");
// MQTT 연결
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// 5초마다 메시지 발행
static unsigned long lastSend = 0;
if (millis() - lastSend > 5000) {
lastSend = millis();
String message = "안녕 MQTT!";
client.publish("iot/test", message.c_str());
Serial.println("메시지 발행: " + message);
}
}
위와 같은 방식으로
MQTT 브로커에 연결 ->
토픽 "iot/test"로 "안녕 MQTT!"를 발행 ->
같은 토픽 "iot/test"를 구독하고, 메시지 수신 시 Serial에 출력
이렇게 처리 가능합니다.
- Springboot MQTT 응용
서버 애플리케이션 Springboot 에서는,
가장 많이 쓰는 MQTT Java 클라이언트 라이브러리인 Eclipse Paho 를 사용하여 아래와 같이 작성합니다.
라이브러리
<!-- pom.xml -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.5</version>
</dependency>
Config
@Configuration
public class MqttConfig {
@Value("${mqtt.broker}")
private String brokerUrl;
@Value("${mqtt.client-id}")
private String clientId;
@Bean
public MqttClient mqttClient() throws MqttException {
MqttClient client = new MqttClient(brokerUrl, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setAutomaticReconnect(true);
options.setCleanSession(true);
client.connect(options);
return client;
}
}
Config yml
mqtt:
broker: tcp://broker.hivemq.com:1883
client-id: spring-mqtt-client
MQTT Service
@Service
public class MqttService {
private final MqttClient mqttClient;
@Autowired
public MqttService(MqttClient mqttClient) {
this.mqttClient = mqttClient;
subscribe("iot/temp");
}
public void publish(String topic, String message) {
try {
mqttClient.publish(topic, new MqttMessage(message.getBytes()));
System.out.println("발행됨: " + message);
} catch (MqttException e) {
e.printStackTrace();
}
}
private void subscribe(String topic) {
try {
mqttClient.subscribe(topic, (t, msg) -> {
String payload = new String(msg.getPayload());
System.out.println("수신됨 [" + t + "] " + payload);
// DB 저장 or 처리 로직 추가 가능
});
} catch (MqttException e) {
e.printStackTrace();
}
}
}
MQTT 발행
@RestController
@RequestMapping("/mqtt")
public class MqttController {
private final MqttService mqttService;
@Autowired
public MqttController(MqttService mqttService) {
this.mqttService = mqttService;
}
@GetMapping("/send")
public String send(@RequestParam String msg) {
mqttService.publish("iot/temp", msg);
return "메시지 발행 완료: " + msg;
}
}
위와 같이 처리할 수 있습니다.
- ReactJS MQTT 응용
클라이언트 애플리케이션 ReactJS 에서는 mqtt.js 라이브러리를 사용합니다.
import React, { useEffect, useState } from 'react';
import mqtt from 'mqtt';
const MqttComponent = () => {
const [message, setMessage] = useState('');
const [connected, setConnected] = useState(false);
useEffect(() => {
// MQTT 클라이언트 설정
const client = mqtt.connect('ws://broker.hivemq.com:8000/mqtt'); // WebSocket 연결 예시
// 연결 성공 시
client.on('connect', () => {
setConnected(true);
console.log('Connected to MQTT broker');
// 특정 토픽 구독
client.subscribe('test/topic', (err) => {
if (err) {
console.error('Subscription error:', err);
}
});
});
// 메시지 수신 시
client.on('message', (topic, payload) => {
console.log('Received message:', payload.toString());
setMessage(payload.toString());
});
// 컴포넌트 언마운트 시 연결 종료
return () => {
client.end();
};
}, []);
// 메시지 발신
const sendMessage = () => {
if (connected) {
client.publish('test/topic', 'Hello MQTT!');
}
};
return (
<div>
<h1>MQTT ReactJS Example</h1>
<p>Received Message: {message}</p>
<button onClick={sendMessage}>Send Message</button>
</div>
);
};
export default MqttComponent;
위와 같이 작성 가능합니다.
이로서 IoT 네트워크를 구성하는 대표적인 구성요소인 서버, 클라이언트, IoT 디바이스를 상호간 통신할 수 있게 되었으므로,
남은 것은 적절한 서비스 설계 및 기술 응용입니다.
(IoT 기술 로드맵 (2025 기준))
- IoT 개발자로 성장하기 위한 기술 향상을 체계적으로 정리하겠습니다.
1. 센서 연결하고 데이터 전송까지
목표: 센서 데이터를 읽고, Wi-Fi로 전송하는 기초 IoT 시스템 구현
필수 기술:
분야 | 기술 |
전자 기초 | 회로도 읽기, 브레드보드 사용, 저항/전압 개념 |
마이크로 컨트롤러 | Arduino, ESP32 등 설정 및 사용 (C/C++ 또는 MicroPython) |
센서 제어 | 온습도(DHT11), 조도, PIR 센서 등 다뤄보기 |
통신 | Wi-Fi 연결, MQTT 또는 HTTP로 데이터 전송 |
간단한 서버 연동 | Node-RED, ThingSpeak, Firebase 등 |
추천 프로젝트 :
온도센서 + ESP32 + ThingSpeak로 실시간 모니터링
PIR 센서로 사람 감지 후 알림 보내기
2. IoT 시스템 구성 이해
목표: IoT 장치 ↔ 서버 ↔ 대시보드 구성 구현
필수 기술 :
분야 | 기술 |
MQTT | Publish/Subscribe 개념, Mosquitto 브로커 활용 |
백엔드 | Node.js/Flask로 간단한 데이터 수신 API 만들기 |
DB | MySQL, MongoDB 연동해 센서 데이터 저장 |
프론트엔드 | HTML, JS, Chart.js로 실시간 데이터 시각화 |
클라우드 | Firebase Realtime DB, Google Sheets 연동 |
추천 프로젝트 :
온습도 센서 + MQTT → Node.js 서버 → 웹 대시보드
스마트 화분: 토양 센서 + 펌프 + 앱으로 제어
3. 실제 제품 수준의 IoT 시스템
목표: 확장 가능하고 안정적인 IoT 시스템 설계 및 구현
필수 기술 :
분야 | 기술 |
LoRa, BLE 등 무선 통신 | Wi-Fi 외의 저전력 통신 기술 학습 |
고급 보드 사용 | STM32, Raspberry Pi, ESP32-S3 등 |
보안 | 데이터 암호화 (TLS/SSL), 인증, 토큰 처리 |
클라우드 IoT | AWS IoT Core, Google Cloud IoT 활용 |
OTA 업데이트 | 펌웨어 무선 업데이트 기능 구현 |
추천 프로젝트 :
스마트 홈 시스템 전체 구성: 조명, 온도, 도어 등 통합
Raspberry Pi + 카메라로 침입 감지 + Telegram 알림
4. 데이터 처리 & AI 연동
목표: IoT 데이터를 분석하거나 예측하는 스마트 시스템 설계
필수 기술 :
분야 | 기술 |
스트리밍 처리 | Kafka, Spark Streaming, InfluxDB, Grafana |
머신러닝 연동 | TensorFlow Lite, TinyML로 장치 내 추론 |
엣지 컴퓨팅 | 게이트웨이에서 실시간 처리 후 전송 |
PCB 설계 | KiCAD, Eagle 등으로 직접 회로 설계 및 제조 |
앱 개발 | Flutter, React Native 등으로 사용자 UI 제작 |
추천 프로젝트 :
스마트 공기질 관리 시스템 + AI 예측
TinyML로 IoT 기기 자체에서 동작 감지 및 판단
(개인 : 웹 개발자용 전략 로드맵)
- 일반적인 개발자 풀에서 가장 큰 영역을 차지하는 백엔드 혹은 프론트엔드 혹은 풀스택 개발자의 경우는 위 로드맵에서 해당 부분을 제외할 수 있으며, 네트워크 서비스 관련 실무 지식이 있으므로 완전 새시작 보다는 조금 더 이점이 있을 수 있습니다.
저의 경우는 Springboot 백엔드를 중심으로 Flutter, ReactJS 프론트엔드를 처리 가능합니다.
이를 기반으로 로드맵을 다시 세워보자면,
1. IoT 장치 입문
실습을 위한 디바이스가 필요합니다.
마이크로 컨트롤러 보드 : 최소 1개, Wi-Fi 네트워크 지원
센서 : 온습도 센서, 거리 측정 센서, 움직임 감지 센서, 카메라 센서, 마이크 센서 등
기본 부품 세트 : 브레드보드, 점퍼 케이블 다수, 저항 다수, USB 케이블, 배터리 전원 공급 장치, WIFI 수신기 등
동작 파츠 : 모터, LED, 스피커, 소형 모니터 등
그외 : 관심있는 장치는 어느정도 익숙해진 후 구입
구입 링크
추천 실습 :
온도센서 → ESP32 → HTTP POST → Spring Boot 서버로 수신
2. Spring Boot 서버 + 네트워크(MQTT/HTTP) 연동
ESP32 → MQTT 브로커(Mosquitto) → Spring Boot 소비자/리스너
혹은 ESP32 → REST API (Spring Controller로 수신)
3. React / Flutter 대시보드 개발
ESP32가 보낸 데이터를 서버에서 DB 저장 → API로 프론트에서 조회
실시간 센서 값 보기 : 클라이언트 + WebSocket or Polling
원격 제어 버튼 : 클라이언트에서 전등 ON/OFF 명령 송신 (→ Spring API → ESP32)
4. IoT 클라우드 서비스 도입 (선택)
Firebase Realtime DB / AWS IoT Core 등으로 확장 가능
OTA 업데이트, 원격 모니터링, 다중 기기 관리에 적합
// 이상입니다.
보시는바와 같이 웹 서비스 개발 경험이 있는 경력자시라면 하드웨어 부분에 대한 실습 및 MQTT 연동 부분을 확인해보시면 쉽게 감이 오실 것으로 보이므로 그렇게 진행하시면 되며,
만약 본 글을 기점으로 개발 자체를 처음 진행하시는 분이시라면 먼저 웹개발부터 경험하시는 것도 추천드립니다.
남은 부분은 카메라 센서를 이용한 컴퓨터 비전 응용이라던지,
바퀴 모터를 이용한 소형 디바이스 자율주행,
마이크, 스피커를 이용한 자연어 처리 등을 응용하면 좋을 것 같습니다.
'Programming > ETC' 카테고리의 다른 글
Python 서버 실시간 웹캠 영상 처리 방법 (ReactJS, WebRTC, FastAPI, OpenCV) - 미디어 통신 실시간 영상 합성 (1) | 2025.04.16 |
---|---|
IoT MQTT(Message Queuing Telemetry Transport) 프로토콜 설명 및 실시간 통신 실습(Server Docker EMQX 클러스터링, Client Javascript & C++) (0) | 2025.04.15 |
[Java] TLV(Tag-Length-Value) 설명 및 해석 함수 구현 (0) | 2024.10.26 |
[Java] JVM Garbage Collector 정리 (2) | 2024.10.13 |
[Java] 자바 Thread Dump 개인정리 (0) | 2024.10.13 |