스마트 농업 용수 관리 백엔드 시스템 개발

공공데이터 API와 IoT 센서를 연동하여 농업 용수를 효율적으로 관리하는 백엔드 시스템을 개발했습니다. Strategy 패턴을 적용하여 수집 대상을 런타임에 동적으로 설정할 수 있는 유연한 크롤링 아키텍처를 구현했습니다.

Architecture

동기

수문을 언제 열고 닫을지를 사람 대신 머신러닝이 판단하게 하는 것이 이 시스템의 목표였습니다. 판단을 하려면 근거가 되는 값이 있어야 했는데 그것을 모으는 체계가 아직 없었습니다.

필요한 값은 두 군데에 흩어져 있었고 성질이 서로 달랐습니다. 기상, 수위, 댐 같은 값은 공공데이터 API 에 있어서 주기적으로 가서 긁어와야 했고, 현장 값은 설치된 IoT 센서가 자기가 알아서 보내 왔습니다.

내가 담당한 트랙

수집하는 쪽을 제가 맡았습니다. 공공데이터 크롤러부터 센서 데이터를 받는 서버, 저장, 조회 API 까지입니다. 항목별 내역은 오른쪽 「주요 업무」에 있습니다.

트랙경계
윈도우 데스크탑 애플리케이션(수문 개폐와 뷰어) · 머신러닝 예측 모델다른 분들 몫이었습니다. 저는 그 모델이 볼 데이터를 채우는 쪽이었습니다

대상이 하나 늘 때마다 배포하지 않기

공공데이터 API 는 하나가 아니었습니다. 기상이 있고 수위가 있고 댐이 있었는데 응답 형식과 인증 방식이 제각각이었습니다. 그리고 운영하는 동안 실제로 대상이 늘어났습니다.

크롤러를 대상마다 따로 만들면 API 가 하나 붙을 때마다 코드를 짜고 다시 배포해야 합니다. 수집 로직을 Strategy 패턴으로 갈라 두고, 무엇을 긁을지는 컨테이너를 띄울 때 환경변수로 정하게 했습니다. 이미지는 하나이고 환경변수를 weather 로 주느냐 iot 로 주느냐에 따라 그 컨테이너가 맡는 대상이 달라집니다. 저장하는 곳은 어느 쪽이든 같은 MariaDB 입니다.

대상이 하나 느는 일이 코드를 고치는 일에서 컨테이너를 하나 더 띄우는 일이 되었습니다.

배운 점

C# 은 학부 때 써 봐서 낯설지 않았는데 Docker 는 이때가 처음이었습니다. 같은 이미지가 환경변수 하나로 다른 일을 하고, 무엇을 수집할지 바꾸는 것이 더는 코드를 고치는 일이 아니게 되는 것을 직접 겪었습니다.

지금 돌아보면 여기가 방향이 갈린 자리입니다. 컨테이너가 배포 방법이 아니라 코드의 모양 자체를 바꾼다는 생각이 들었고, 그쪽을 파다가 DevOps 엔지니어라는 일에 관심을 갖게 되었습니다.