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 (디스패처/군관리 시스템): 여러 대의 엘리베이터에 호출 요청을 최적으로 할당하는 로직 구현.
- SimulationEngine (시뮬레이션 엔진):
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
'IT 일반,소식' 카테고리의 다른 글
| 🔗 HATEOAS (Hypermedia As The Engine Of Application State) 상세 설명 (0) | 2025.12.10 |
|---|---|
| 🚢 부산항 9부두 지능형 항만 시스템 개발 계획 (MySQL, Nuxt.js, Nest.js 기반) (1) | 2025.12.07 |
| NestJS + NuxtJS로 실시간 서버 헬스 모니터링 대시보드 만들기 (WebSocket 기반) (0) | 2025.12.05 |
| AI는 일자리를 없애지 않는다 – 방직기 시대가 증명해준 250년 전 이야기, 그리고 지금 (0) | 2025.12.02 |
| MM/DD 입력 기준으로 기준일과 가장 가까운 연도 계산하기 (작년/금년/내년) (0) | 2025.11.25 |