- ‘범위’ 개념을 통한 예약 로직 단순화:
- 발표자는 기존 예약, 휴업, 기기 고장 등 모든 ‘예약 불가’ 조건을 ‘기간’으로 보고, 이를 ‘범위(Range)’로 추상화하는 접근 방식을 제안했습니다.
- ‘예약 불가 범위 집합’과 ‘대상 기간’의 ‘좌집합(Left Difference)’ 연산을 통해 복잡한 다중 조건을 일괄 처리하여 ‘예약 가능한 기간’을 효과적으로 도출했습니다.
- PostgreSQL 다중 범위형(Multi-Range Type) 도입:
- 일반 범위형은 단일 연속 범위만 처리하여 불연속적인 예약 가능 기간을 다루기 어렵습니다. 이를 해결하기 위해 여러 불연속 범위를 하나의 데이터로 저장하고 연산할 수 있는 PostgreSQL의 ‘다중 범위형’을 활용했습니다.
- 다중 범위형은 교집합, 좌집합 등 다양한 범위 연산을 지원, 복잡한 기간 집계 로직 단순화의 핵심 도구입니다.
- 예약 시스템 구현 3단계:
- 모든 예약 불가 기간을 하나의 다중 범위형으로 집약합니다.
- 확인 대상 기간(예: 1주일)도 다중 범위형으로 변환합니다.
- 두 다중 범위형 간 좌집합 연산을 수행하여 최종 예약 가능 기간 목록을 얻습니다.
- Rails에서의 다중 범위형 처리 전략:
- ActiveRecord는 다중 범위형 데이터를 문자열로 반환하므로, Rails에서 다루기 쉽도록 PostgreSQL의
unnest함수를 사용해 개별 범위 객체로 ‘전개’하는 것이 효율적입니다. - 다중 범위형은 주로 ‘집계 및 조회’ 목적으로 사용하며, 원본 데이터는 단일 범위로 저장하고 필요시
range_agg함수로 집약합니다. - 복잡한 집계 로직은 SQL 뷰를 통해 DB 레벨에서 캡슐화하고, Rails에서는 뷰 반환 결과 객체만 다루어 코드 가독성과 유지보수성을 높이는 방안을 제시했습니다.
- ActiveRecord는 다중 범위형 데이터를 문자열로 반환하므로, Rails에서 다루기 쉽도록 PostgreSQL의
PostgreSQL 다중 범위형을 활용한 예약 시스템 로직 단순화
Range on Rails ― 「多重範囲型」という新たな選択肢が、複雑ロジックを劇的にシンプルにしたワケ / 梅田智大 - Kaigi on Rails 2025
작성자
Kaigi on Rails
발행일
2025년 11월 25일
핵심 요약
- 1 초코자프의 유연한 예약 시스템 개발 난제를 PostgreSQL 다중 범위형을 활용하여 예약 불가능 기간의 좌집합 연산으로 예약 가능 기간을 도출함으로써 복잡한 로직을 단순화했습니다.
- 2 일반 범위형이 다룰 수 없는 불연속적인 여러 기간을 하나의 데이터로 처리하는 다중 범위형의 특징과 교집합, 좌집합 등의 연산 활용법을 설명하며, 예약 시스템 외 다양한 집계 시나리오에서의 잠재적 활용성을 제시했습니다.
- 3 Rails 환경에서 다중 범위형 데이터를 효율적으로 다루기 위해 `range_agg` 및 `unnest` 함수를 활용하여 개별 범위 객체로 변환하고, SQL 뷰를 통해 복잡한 집계 로직을 캡슐화하여 코드 가독성과 유지보수성을 높이는 방안을 제안했습니다.
도입
초코자프(Chocozap)는 24시간 무인 편의점 헬스장으로, 사용자가 원하는 시간에 자유롭게 예약할 수 있는 '슬롯 없는' 예약 시스템이 필요했습니다. 일반적인 예약 시스템은 고정된 예약 시간을 제공하지만, 초코자프는 30분 후와 같이 유연한 시간 활용을 지향합니다. 이러한 '슬롯 없는' 시스템은 예약 가능 여부를 판단하기 위해 기존 예약, 임시 휴업, 기기 고장 등 다양한 조건을 실시간으로 확인해야 하는 복잡한 로직을 요구했습니다. 특히 직전 1주일간의 예약 가능 현황을 한눈에 보여주는 기능 구현이 큰 과제였습니다.
결론
'범위'라는 수리적 사고방식을 예약 시스템 개발에 적용함으로써 복잡한 로직을 극적으로 단순화할 수 있음을 보여주었습니다. 특히 PostgreSQL의 다중 범위형은 불연속적인 여러 기간을 동시에 효율적으로 다루는 데 매우 효과적인 도구입니다. 다중 범위형은 집계 전용으로 활용하고, 최종 결과는 개별 범위 객체로 전개하여 Rails 애플리케이션에서 처리하는 것이 코드 작성 및 가독성 측면에서 유리합니다. 이러한 접근 방식은 유사한 기간 관리 및 집계 요구사항이 있는 다른 시스템 개발에도 유용하게 적용될 수 있습니다.