AI 예측과 최적제어 알고리즘을 적용해
에너지 절감과 사전 대응 기능을 갖춘 가정용 공기질 관리 플랫폼을 개발한다.
- 개발 배경
- 주요 기능 (Features)
- 앱 기능 설명
- 나의 역할 (What I built)
- 기술 스택(Backend)
- 폴더 구조
- 시스템 구조 (Architecture)
- ERD 테이블
- API 문서
- 실행 방법
- 공기질 예측 성능
- 트러블 슈팅
국립 환경 과학원에 따르면 한국인은
하루 중 86%의 시간을 실내 환경에서 생활
정부는 실내 공기질 관리법으로 다중 이용 시설에서 실내 공기질 관리를 의무화
2024년 그 기준을 강화
이에따라 실내 공기질 관리에 다방면으로 도움을 줄 수 있는
가정용 공기질 관리 플랫폼을 개발하게 되었습니다.
- AI기반 공기질 예측: 운영 환경에서의 데이터를 수집하여 학습하고, 현재 상태를 바탕으로 1시간 내의 실내 공기질 상태를 1분 단위로 예측
- 예측값 기반 사전 대응: 예측값을 바탕으로 공기청정기의 최적 제어 스케줄을 10분 단위로 제공
- 필터 수명 계산: 필터 수명은 단순 시간 누적이 아니라, 공기청정기의 팬 속도와 공기질 지수(AQI)를 가중치로 반영해 실제 사용 환경을 고려해 계산
- 맞춤형 공기질 관리 제공: 사용자에게 천식, 알러지 여부를 입력받아 공기질 관리 기준치를 설정하여 사용자 맞춤형 공기질 관리 서비스를 제공
- 시각화 정보 제공(그래프, 히트맵): 다수의 IoT센서를 활용해 센서간 간격을 좁혀 해상도 높은 데이터를 사용, 사용자에게 실내 공기질 상태를 히트맵 형식으로 제공해 오염원을 한눈에 파악
홈 화면에서는 실내외 공기질 상태 및 공기질 예측 정보를 요약해서 볼 수 있다.
(1)실외 화면에서는 실외 공기질 상태 및 24시간 예측 그래프를 확인할 수 있으며,
(2)각 항목에 대한 설명 및 단계별 기준치를 확인할 수 있다.
(1)실내 화면에서는 실내 공기질 상태 및 1시간 예측 그래프를 확인할 수 있으며,
(2)방별 예측 그래프도 확인할 수 있다.
(3)최근 24시간 내 실내 공기질 상태를 히트맵 형태로 볼 수 있어 오염원을 한눈에 파악할 수 있다.
(1)스케줄 수정 화면에서는 사용자의 외출 시간을 입력해 불필요한 에너지 소비를 줄일 수 있다.
(2)관리 기준치 수정 화면에서는 사용자에게 맞춤형 공기질 관리 서비스를 제공하기 위해 관리 임계치를 입력받는다.
이때 알러지, 천식 여부에 따라 관리 임계치를 추천해주며, 필요시 세부 설정을 할 수 있다.
(1)사용자가 자동제어를 적용할 공간을 고른다.
(2)그 공간에서 적용할 공기질 기준치를 선택한다.
이 기준치의 초기값은 사용자가 위에서 셋팅한 관리 임계치 값이다.
이 기준치를 그대로 사용해도 되고, 공간에 따라 수정해서 사용해도 된다. ex) 방은 기준치를 엄격하게, 주방은 널널하게
기준치를 설정하면, 방의 정보와 임계치 값이 AI 서버로 넘어가고,
AI는 이 정보를 받아 방 별로 최적제어를 내려 공기청정기를 제어한다.
수동 제어 상태에서는 관리 장치를 직접 제어할 수 있으며, 공기청정기의 경우 필터 소모율을 확인할 수 있다.
알림 화면에서는 필터 교체 필요 알림, 공기질 이상 경고 등을 확인할 수 있다.
계정 화면에서는 간단한 사용자 정보를 확인할 수 있으며, 알림 설정, 로그아웃, 비밀번호 변경 등 계정 설정을 할 수 있다.
- 팀장으로, 백엔드 역할을 맡았다.
- 아키텍처 설계, 도메인 모델링, ERD 테이블, API 명세서 등을 작성하였다.
- 1분마다 수신되는 센서&공기청정기 데이터 -> DB저장 -> 병합하여 AI 서버에 전송하는 흐름 완성.
- SmartThings/대기질 API 연동, 필터 수명 로직, 사용자 맞춤 제어 정책 등을 구현.
- 스프링 서버를 AWS EC2에 배포.
- Language/Build: Java 17, Gradle
- Framework: Spring Boot, Spring Web, Spring Data JPA, Spring Security (JWT)
- DB: MySQL
- Libraries: jjwt, Lombok 등
- External: SmartThings REST API, OpenWeatherMap/Weatherbit API
- Infra: AWS EC2/RDS, S3, GitHub Actions
backend/
├─ src/main/java/com/example/airqualityplatform
│ ├─ controller/ # REST 컨트롤러 (Auth, Device, Sensor, Measurement, ...)
│ ├─ service/ # 비즈니스 로직 (SmartThings, 필터수명, 스케줄러 포함)
│ ├─ domain/ # JPA 엔티티
│ ├─ repository/ # Spring Data JPA 리포지토리
│ ├─ dto/ # 요청/응답 DTO
│ ├─ security/ # JWT 필터/토큰/설정
│ └─ AirQualityPlatformApplication.java
└─ src/main/resources/
└─ application.properties (또는 application.yml)
API 명세서 주소: https://solar-skate-88b.notion.site/API-1f31bcaecabd80ebb3aae45ffce4eaa4#2031bcaecabd80b1b0d8f06554be7522
| KEY | 예시 | 설명 |
|---|---|---|
DB_URL |
jdbc:mysql://localhost:3306/air?useSSL=false&serverTimezone=Asia/Seoul |
MySQL 연결 URL |
DB_USERNAME |
root |
DB 계정 |
DB_PASSWORD |
******** |
DB 비밀번호 |
JWT_SECRET |
랜덤 64+ 바이트 | JWT 서명 키 |
SMARTTHINGS_TOKEN |
st-*** |
SmartThings PAT |
OWM_API_KEY |
owm-*** |
OpenWeatherMap 키 |
WEATHERBIT_API_KEY |
wb-*** |
Weatherbit 키 |
application.properties 예시(템플릿):
spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=update # 개발 환경에서만 권장
spring.jpa.show-sql=false
spring.jackson.time-zone=Asia/Seoul
jwt.secret=${JWT_SECRET}
external.smartthings.token=${SMARTTHINGS_TOKEN}
external.weather.owm.key=${OWM_API_KEY}
external.weather.weatherbit.key=${WEATHERBIT_API_KEY}# Docker 예시 (비밀번호는 반드시 안전한 값으로 변경)
docker run -d --name air-mysql \
-e MYSQL_ROOT_PASSWORD=pass \
-e MYSQL_DATABASE=air \
-p 3306:3306 mysql:8
cd backend
./gradlew clean build
java -jar build/libs/*-SNAPSHOT.jar
# 또는
./gradlew bootRun- 서버 기본 포트:
8080
LSTM 기반 공기질 예측 모델의 성능을 평가한 결과,
예측값이 전체적으로 실제 측정값과 높은 유사도를 보이며 안정적인 성능을 나타냈다.








