IT 일반,소식

🏢 빌딩 엘리베이터 시뮬레이션 개발계획(MySQL, Nuxt.js, Nest.js 기반)

_Blue_Sky_ 2025. 12. 7. 13:10
728x90

 

 

객체 지향 프로그래밍(OOP)을 사용하여 빌딩 엘리베이터의 부하를 시뮬레이션하는 프로그램의 설계는 매우 훌륭한 접근 방식입니다.
이는 현실 세계의 엔터티소프트웨어 객체로 정확하게 모델링하고 상호 작용을 시뮬레이션하기에 적합합니다.

 


🏗️ 핵심 객체(Class) 설계 및 역할

시뮬레이션을 위해서는 최소한 다음과 같은 핵심 클래스를 정의해야 합니다.

1. 🏢 Building (빌딩) 클래스

  • 역할: 시뮬레이션 환경 전체를 관리하는 메인 컨테이너이자 코디네이터입니다.
  • 주요 속성 (데이터 멤버):
    • numFloors (int): 전체 층수.
    • elevators (List of Elevator): 건물 내 모든 엘리베이터 객체 목록.
    • floors (List of Floor): 각 층 객체 목록.
    • people (List of Person): 현재 건물 내에 있는 모든 사람 객체 목록.
  • 주요 동작 (멤버 함수):
    • startSimulation(): 시뮬레이션 루프를 시작합니다.
    • update(deltaTime): 정해진 시간 간격(deltaTime)마다 모든 객체의 상태를 업데이트합니다.
    • getCallRequests(): 모든 층에서 발생한 엘리베이터 호출 요청을 수집하여 엘리베이터 스케줄러에 전달합니다.

2. 🛗 Elevator (엘리베이터) 클래스

  • 역할: 이동, 승객 수송, 요청 처리 등 엘리베이터 자체의 모든 기능을 구현합니다.
  • 주요 속성:
    • currentFloor (int): 현재 엘리베이터가 위치한 층.
    • direction (enum: UP, DOWN, STATIONARY): 현재 이동 방향 또는 정지 상태.
    • capacity (int): 최대 탑승 가능 인원.
    • currentLoad (int): 현재 탑승 인원.
    • destinationRequests (List of int): 엘리베이터 내부 버튼을 통해 요청된 목적지 층 목록.
    • state (enum: MOVING, STOPPED, DOOR_OPEN): 현재 상태.
  • 주요 동작:
    • move(): direction에 따라 currentFloor를 변경합니다.
    • addRequest(floorNum): 내부 목적지 요청을 추가합니다.
    • openDoor() / closeDoor(): 문을 열고 닫는 시간을 시뮬레이션합니다.
    • board(person) / unboard(person): 승객이 타고 내리는 과정을 처리합니다.
    • decideNextMove(): 스케줄링 알고리즘(예: SCAN/Look 알고리즘)을 실행하여 다음 정지할 층과 이동 방향을 결정합니다.

3. 🧍 Person (사람) 클래스

  • 역할: 엘리베이터를 이용하여 이동하려는 승객의 행동을 모델링합니다.
  • 주요 속성:
    • currentFloor (int): 현재 위치한 층.
    • destinationFloor (int): 가고자 하는 목적지 층.
    • state (enum: IDLE, WAITING_FOR_ELEVATOR, IN_ELEVATOR, ARRIVED): 현재 상태.
  • 주요 동작:
    • requestElevator(building, desiredDirection): 엘리베이터를 호출하기 위해 층 버튼을 누르는 동작을 시뮬레이션하고 Floor 객체와 상호작용합니다.
    • enterElevator(elevator): 엘리베이터에 탑승합니다.
    • pressDestinationButton(elevator): 엘리베이터 내부에서 목적지 버튼을 누릅니다.

4. 🖲️ Floor (층) 및 ElevatorButton (버튼) 클래스

  • Floor 역할: 각 층에 대한 정보를 담고, 외부 호출 버튼의 상태를 관리합니다.
  • Floor 주요 속성:
    • floorNumber (int).
    • upButton / downButton (ElevatorButton 객체): 외부 호출 버튼 객체.
    • waitingPeople (List of Person): 이 층에서 엘리베이터를 기다리는 사람 목록.
  • ElevatorButton 역할: 버튼의 상태(눌림/안눌림)만 간단히 모델링합니다.
  • ElevatorButton 주요 속성:
    • isPressed (boolean): 버튼이 눌려 있는지 여부.

⏱️ 시간축 기반 시뮬레이션(Real-Time Simulation) 구조

실시간 부하 시뮬레이션을 구현하기 위한 핵심은 이벤트 기반 시뮬레이션시간 업데이트 루프입니다.

1. 시뮬레이션 시간 관리

  • Clock 또는 Timer: 시뮬레이션 시간을 초 단위로 관리합니다. 실제 시간 1초가 시뮬레이션 시간 1분 또는 10초를 나타내도록 시간 배율을 설정할 수 있습니다.
  • Delta Time (deltaTime): 시뮬레이션 루프에서 한 번의 업데이트마다 경과하는 시간을 고정 값(예: 0.1초)으로 설정하고, 모든 객체의 상태 변화는 이 시간 간격을 기준으로 계산됩니다.
 

2. 부하 분석 및 결과 측정

시뮬레이션의 목적이 '부하'를 분석하는 것이므로, 다음과 같은 통계를 기록해야 합니다.

  • 평균 대기 시간 (Average Wait Time): 사람이 버튼을 누른 시점부터 탑승할 때까지 걸린 시간의 평균.
  • 평균 이동 시간 (Average Trip Time): 사람이 탑승한 시점부터 목적지에 도착할 때까지 걸린 시간의 평균.
  • 최대 부하 (Max Load): 엘리베이터에 동시에 탑승했던 최대 인원.
  • 처리량 (Throughput): 단위 시간당 목적지에 성공적으로 도착한 승객의 수.

🪜 계단(Stairs) 클래스 (선택적)

계단은 시뮬레이션의 현실성을 높이는 중요한 객체가 될 수 있습니다.

  • 역할: 사람이 엘리베이터 대신 계단을 이용할 수 있는 경우를 모델링합니다.
  • Stair 클래스 (또는 Person 클래스 내의 동작):
    • 조건: 사람이 이동하려는 층의 차이가 작거나 (예: 1~3층 이내), 엘리베이터 대기 시간이 너무 길 경우, Person 객체가 계단 이용을 결정하도록 설계합니다.
    • 시간 계산: 계단을 이용할 때 소요되는 시간은 층수 차이 * 층당 이동 시간으로 계산하여 Person의 상태 변화 시간을 업데이트합니다.

🏗️ 엘리베이터 부하 시뮬레이션 시스템 개발 계획

엘리베이터 부하 시뮬레이션 프로그램을 객체지향 방식으로 설계하고, Nuxt.js(프론트엔드), Nest.js(백엔드), MySQL(데이터베이스)를 사용하여 실시간으로 시뮬레이션하는 애플리케이션 개발 계획을 다음과 같이 목차로 제시합니다.


I. 프로젝트 개요 및 목표

  • 1.1. 프로젝트 정의: 빌딩 엘리베이터의 운행 부하를 예측하고 최적의 알고리즘을 탐색하기 위한 실시간 시뮬레이션 시스템 개발.
  • 1.2. 주요 목표:
    • 객체지향 원칙을 준수한 모듈화된 시스템 설계.
    • 실시간으로 사람들의 이동 및 엘리베이터 상호작용 시뮬레이션 구현.
    • MySQL을 활용한 시뮬레이션 데이터 저장 및 분석 기반 마련.
    • Nuxt.js를 통한 직관적인 시각화된 시뮬레이션 현황 제공.
  • 1.3. 사용 기술 스택:
    • 프론트엔드: Nuxt.js (Vue.js)
    • 백엔드/API: Nest.js (TypeScript, Node.js)
    • 데이터베이스: MySQL
    • 통신: WebSocket (실시간 시뮬레이션 상태 전송)

II. 객체지향 설계 (OOD) 및 아키텍처

  • 2.1. 핵심 객체 설계 (클래스 다이어그램)
    • Building (빌딩): 층 목록, 엘리베이터 그룹 관리, 시뮬레이션 환경 설정 등.
    • Elevator (엘리베이터): 현재 위치, 이동 상태(정지/상승/하강), 탑승 인원, 최대 용량, 목적 층 대기열, 운행 알고리즘(SCAN, LOOK 등) 구현.
    • Floor (층): 층 번호, UpButton, DownButton, 대기 중인 Person 객체 목록 관리.
    • Person (사람): 현재 층, 목적 층, 생성 시간, 탑승/하차 상태, 대기 시간 등의 속성.
    • Button (버튼 - 인터페이스/추상 클래스): Press() 메서드 정의.
      • FloorButton (층 버튼): Floor 객체 내, 방향 정보(Up/Down) 포함.
      • CarButton (엘리베이터 내부 버튼): Elevator 객체 내, 목적 층 정보 포함.
    • Stairs (계단): 사람의 계단 이용 로직(선택적 구현).
  • 2.2. 시뮬레이션 핵심 로직
    • SimulationEngine (시뮬레이션 엔진):
      • 시간 경과(tick) 관리 및 실시간 동기화.
      • Person 객체 생성 및 이동 요청 발생 로직.
      • 각 **Elevator**의 운행 알고리즘 실행 및 위치 업데이트.
      • **Person**과 **Elevator**의 상호작용(탑승/하차) 처리.
      • 시뮬레이션 통계 데이터 수집.
    • Dispatcher (디스패처/군관리 시스템): 여러 대의 엘리베이터에 호출 요청을 최적으로 할당하는 로직 구현.

III. 백엔드 개발 (Nest.js & MySQL)

  • 3.1. API 서버 구축 (Nest.js)
    • 모듈 설계: Building, Elevator, Simulation, Stats 등.
    • RESTful API 개발:
      • 시뮬레이션 환경 설정 (빌딩 높이, 엘리베이터 수/용량, 사람 발생률 등).
      • 시뮬레이션 시작/중지/재설정 엔드포인트.
      • 시뮬레이션 결과(통계) 조회.
  • 3.2. 데이터베이스 설계 (MySQL)
    • Simulation_Run 테이블: 시뮬레이션 설정 및 전체 결과(평균 대기 시간, 총 운행 거리 등).
    • Elevator_Log 테이블: 엘리베이터별 시간당 위치, 탑승 인원, 이동 방향 기록.
    • Person_Trip 테이블: 사람별 출발/도착 층, 대기 시간, 운행 시간 기록.
  • 3.3. 실시간 통신 구현 (WebSocket)
    • Nest.js의 WebSocket Gateway를 활용하여 SimulationEngine의 상태 변화(Elevator 위치, Person 대기 현황 등)를 Nuxt.js 클라이언트에 실시간 전송.

IV. 프론트엔드 개발 (Nuxt.js)

  • 4.1. 프로젝트 설정 및 컴포넌트 구조화
    • Nuxt.js (Vue.js) 기반 프로젝트 초기 설정.
    • BuildingView (전체 레이아웃), FloorDisplay, ElevatorCar, PersonAvatar 등의 컴포넌트 개발.
  • 4.2. 시뮬레이션 시각화
    • 빌딩 구조 표현: 층별 버튼 및 대기열 시각화.
    • 엘리베이터 이동 애니메이션: WebSocket으로 받은 데이터를 기반으로 엘리베이터의 실시간 위치 및 문 열림/닫힘 상태를 부드럽게 표현.
    • 사람 이동 시각화: 층에서 대기, 탑승, 하차 애니메이션 구현.
  • 4.3. 사용자 인터페이스 (UI) 개발
    • 설정 화면: 시뮬레이션 파라미터(엘리베이터 알고리즘, 인구 밀도 등) 입력 폼.
    • 통계 대시보드: 실시간 및 종료 후 통계 지표(평균 대기 시간, 엘리베이터 활용률) 차트 표시 (예: Chart.js 등 활용).

V. 테스트 및 배포

  • 5.1. 객체 단위 테스트: 각 Elevator 클래스, Person 클래스 등의 로직에 대한 단위 테스트 (예: Jest).
  • 5.2. 시뮬레이션 통합 테스트: 다양한 시나리오(출퇴근 시간, 점심 시간 등)에서 부하 테스트 및 알고리즘 효율성 검증.
  • 5.3. 배포: 백엔드(Nest.js) 및 프론트엔드(Nuxt.js) 서버 환경 구축 및 배포.

이 개발 계획을 바탕으로 각 단계별 작업 명세서를 작성하고, 우선순위를 결정하여 개발을 진행할 수 있습니다.

728x90