Ruby로 구축한 주유소 시뮬레이터: 취미 프로젝트에서 비즈니스 통찰까지

Jakub Godawa, "Visualized multi-threaded simulators in Ruby"

작성자
EuRuKo
발행일
2025년 02월 24일

핵심 요약

  • 1 루비(Ruby)를 활용하여 주유소 운영 시뮬레이터를 개발한 경험과 그 과정에서 얻은 기술적 통찰을 공유합니다.
  • 2 시뮬레이터는 YAML 설정을 통해 다양한 시나리오를 비교하고, 스레드, 뮤텍스, 조건 변수 등 루비의 동시성 기능을 활용하여 구현되었습니다.
  • 3 이 프로젝트는 개발자의 취미 활동이 실제 업무 코드 품질 향상에 기여할 수 있음을 보여줍니다.

도입

발표자는 소프트웨어 엔지니어로서 실직 후 주유소 카운터에서 일하게 된 개인적인 경험을 서두에 밝힙니다. 새로운 직장 상사의 주유소 운영 최적화 요구(최적의 펌프 수와 연료 주문량 결정)를 해결하기 위해 루비(Ruby) 기반의 주유소 시뮬레이터를 개발하게 된 배경을 설명합니다. 이 시뮬레이터는 단순히 데이터를 시각화하는 것을 넘어, 다양한 시나리오를 비교 분석하여 실제 비즈니스 의사결정에 도움을 줄 수 있도록 설계되었습니다.

시뮬레이터 개발 과정에서 발표자는 초기 추상적인 버블 형태의 시각화가 아닌, 실제 자동차의 움직임과 매출, 주유 시간, 대기 시간 등 구체적인 데이터를 시각화하는 방향으로 발전시켰습니다. ASCII 아트를 활용하여 시뮬레이션 상황을 직관적으로 보여주며, 여러 시뮬레이션 시나리오를 병렬로 실행하여 비교할 수 있는 기능을 구현했습니다. 기술적으로 시뮬레이터는 YAML 파일을 통해 시뮬레이션 속도, 자동차 수, 연료 비축량, 펌프 수, 주유 속도, 연료 가격 등 세부 파라미터를 설정할 수 있습니다. 핵심 컴포넌트로는 Logger, Timer, Car Spawner, Queue, Station, Pumps, Report Saver 등이 포함됩니다. 특히 Timer는 루비의 스레드를 사용하여 구현되었으며, JRuby와 MRI 환경에서의 스레드 동작 차이(GIL의 영향)에 대한 논의를 포함합니다. Car SpawnerRandomIntervalEnumerator를 활용하여 메모리 효율적으로 자동차를 생성하고 큐에 추가하며, 각 자동차에 개별 스레드를 할당하지 않아 CPU 부하를 최소화합니다. 주유소 큐는 루비의 MutexConditionVariable을 이용한 생산자-소비자(Producer-Consumer) 패턴으로 구현되어, 자동차(생산자)가 큐에 들어오면 펌프(소비자)가 이를 처리하는 동시성 제어 메커니즘을 상세히 설명합니다. 발표자는 이 프로젝트를 통해 의존성 주입의 중요성, 시스템 시간 대신 커스텀 카운터 사용의 이점, GIL의 특성 이해, 프로토타입 단계에서의 자유로운 시도, 그리고 취미 프로젝트가 실제 업무 코드 품질 향상에 기여한다는 교훈을 얻었다고 강조합니다.

결론

본 주유소 시뮬레이터 프로젝트는 루비의 동시성 기능을 실제 비즈니스 문제 해결에 적용한 성공적인 사례를 제시합니다. 발표자는 향후 시뮬레이션 프레임워크 개발, Go나 Elixir와 같은 다른 언어에서의 구현 탐색, 이벤트 기반 아키텍처 도입, 웹 기반 게임화 등 다양한 확장 아이디어를 제시하며 프로젝트에 대한 지속적인 열정과 가능성을 보여주었습니다. 이 발표는 루비 개발자들에게 실용적인 동시성 프로그래밍 기법을 소개하며, 개인적인 흥미가 어떻게 기술적 성장과 문제 해결 능력 향상으로 이어질 수 있는지를 보여주는 좋은 예시입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!