차량관제시스템 Renewal

이 프로젝트는 (주)이트레이스가 IDC에 ORACLE 기반으로 운영하고 있던 기존 차량관제시스템을 AWS로 이전하기 위해 시스템을 MariaDB 기반으로 재설계하고 구축한 작업입니다.

차량관제시스템 Renewal 작업에서의 본인의 역할

IDC에 ORACLE 기반으로 운영되고 있던 Legacy 차량관제시스템 자체도 그 이전에 존재했던 전신을 당시 (주)이트레이스에 근무하던 본인이 직접 재설계하여 구축했었으며, 이 번 Renewal 작업 역시 본인이 다시 새롭게 설계를 개선하고 새로운 프레임워크를 적용하여 구축했습니다.

참고로, Renewal 작업은 본인이 별도의 법인을 설립(2020)한 후에 맺은 계약중에 진행되었습니다.

차량관제시스템이란?

차량관제시스템은 차량을 운행하는 운송사가 차량의 움직임을 실시간으로 파악함으로써 적시에 화물을 적재할 차량을 찾고, 차량이 적절한 경로를 선택하여 신속하게 목적지로 이동하는지 감시, 감독할 수 있도록 합니다. 또한,  온도감시, 출발/도착 감지 등, 차량운영에 도움되는 다양한 정보를 제공합니다.

차량의 경로를 네이버 지도에 표시한 모습
차량의 경로를 네이버 지도에 표시한 모습

기존의 Oracle 기반 Legacy 시스템 구성

IDC에 구성된 Oracle 기반 Legacy 시스템은 다음과 같으며 Check체크 표시된 것들은 모두 과거에 본인이 설계, 구현한 것들입니다.

IDC의 기존 Oracle 기반 Legacy 차량관제시스템 구성도
Oracle 기반 Legacy 차량관제시스템 (React, jQuery, AngularJS, Tomcat, JSP, Netty)

신규 MariaDB 기반 차량관제시스템(CVO) 구성

신규 차량관제시스템(CVO)은 아래 그림의 빨간색 표시된 부분이며, 좌측의 "운송사 API", 상단 우측의 "위치보고전용 단말기"를 제외한 모든 것을 본인이 설계, 구현했습니다.

AWS에 구축한 신규 MariaDB 기반 차량관제시스템(CVO) 아키텍처
AWS에 구축한 신규 MariaDB 기반 차량관제시스템(CVO) 아키텍처

사용한 언어, 프레임워크, 기술 등

구분 언어, 프레임워크, 기술 등
데이터베이스 MariaDB. Geospatial Data, Stored Procedure, Function, Trigger, Events
CVO 백엔드 Java & Spring Boot, GraphQL, REST, myBatis
CVO 프론트엔드 React, GraphQL, MUI
EMS API Server Java & Spring Boot, REST, myBatis
위치보고수신 HTTPS Java & Spring Boot, REST, myBatis
위치보고수신 TCP Java, Netty3, myBatis
기타 Perl (DBI, Paws, Archive::Zip)

백엔드와 데이터베이스

백엔드는 최대한 가볍게하고 데이터베이스 I/O를 최소화하기 위해 주요 로직을 Stored Procedure로 구현했습니다. 백엔드는 데이터의 중간처리, 프론트엔드와 Stored Procedure의 연결, 기타 외부 API로의 연결 등을 위한 경로로서의 역할이 주요한 역할입니다.

프론트엔드

프론트엔드는 React로 작성하고, 컴포넌트들은 모듈화하여 가능한 한 선언만으로 데이터를 처리할 수 있도록 함으로써 각 뷰에서 같은 Boilerplate 로직을 반복하지 않도록 했습니다.

또한, 사용자의 이용 편의를 위해 아래 그림처럼 탭으로 이전에 사용한 기능에 즉시 접근할 수 있도록 했습니다.

신규 차량관제시스템 웹 인터페이스 캡처
신규 차량관제시스템 웹 인터페이스 캡처

이 외에도 테이블형 데이터의 엑셀저장, 클립보드 복사 등의 기본 기능들을 모듈화한 컴포넌트에 내장하는 등 인수자가 새로운 화면을 추가할 때에도 기본적인 기능들을 넣기 위해 같은 일을 반복하지 않도록 노력했습니다.

위치보고수신 TCP 서버

위치보고전용 단말기는 TCP 전문으로 위치정보를 서버로 전송합니다. 이 데이터를 수신하여 데이터베이스에 저장하기 위한 TCP 서버는 Netty3을 사용하여 구현했습니다.

이 TCP 서버는 단일 프로토콜이 아니라, 여러 프로토콜을 다루며, 향후에 프로토콜을 추가하더라도 손쉽게 할 수 있도록 프로토콜 핸들링을 위한 클래스와 통신 자체를 위한 클래스를 구분하고 유기적으로 연결할 수 있도록 설계했습니다.

위치데이터 Archive, 파티션 관리

위치데이터는 매일 별도의 파일로 저장되고, 매월 zip 파일로 만들어진 후 S3에 저장됩니다.

또한, 테이블들 중 일부는 Partition을 사용합니다. 주기적으로 파티션 정보를 읽은 후 필요한 파티션을 파악하여 미리 생성해야합니다.

두 작업 모두 Perl로 작성한 스크립트를 crontab으로 실행합니다.

Legacy 시스템과 신규 시스템의 프레임워크 변화도

Legacy시스템에 사용된 프레임워크와 신규시스템의 프레임워크를 비교한 그림입니다.

레거시 시스템을 새롭게 구축하기 위한 프레임워크 변경
레거시 시스템을 새롭게 구축하기 위한 프레임워크 변경