복잡한 비즈니스 로직을 읽기 쉬운 Ruby 코드로 문서화하는 'Operations' 개념

Operations - documenting complex business logic as easy to read ruby code

작성자
Rails Upgrade News
발행일
2025년 09월 11일

핵심 요약

  • 1 복잡한 Ruby on Rails 애플리케이션의 분산된 비즈니스 로직을 중앙 집중화하고 명확하게 문서화하기 위한 'Operations' 패턴이 제안되었습니다.
  • 2 'Operations'는 플로우차트 형태의 비즈니스 프로세스를 의사결정(decision)과 실행(action) 단계로 나누어 선언적인 Ruby 코드로 표현하여 가독성과 유지보수성을 높입니다.
  • 3 스테이트리스(stateless) 핸들러와 입력 매개변수 저장 방식을 통해 'Operations'는 복잡한 비즈니스 로직의 테스트 용이성과 문제 진단 기능을 향상시킵니다.

도입

작성자는 자신의 Ruby on Rails 기반 SaaS 애플리케이션에서 발생하는 복잡하고 분산된 비즈니스 로직 처리의 어려움을 토로하며, 이를 해결하기 위한 새로운 접근 방식인 'Operations'를 소개합니다. 특히, 다중 테넌트 환경에서 계정별 설정 및 미세한 권한 관리로 인해 단순한 모델 메서드 호출만으로는 비즈니스 흐름을 파악하기 어렵다는 문제의식에서 출발합니다. 문서 다운로드와 같은 단일 기능조차도 컨트롤러, 모델, 기존 '커맨드', 백그라운드 작업 등 여러 곳에 흩어져 있어 코드 추적에 많은 시간이 소요되는 비효율성을 지적하며, 이러한 복잡성을 시각적인 플로우차트처럼 Ruby 코드로 명확하게 표현하고자 하는 아이디어를 제시합니다.

작성자는 복잡한 비즈니스 로직이 코드베이스 전반에 걸쳐 분산되어 발생하는 문제를 해결하기 위해 ‘Operations’라는 Rails Engine을 고안했습니다. 이 개념은 비즈니스 프로세스의 논리 흐름을 나타내며, 컴퓨터 과학적으로는 일종의 상태 머신 또는 그래프로 볼 수 있습니다. 각 노드는 의사결정(decision) 또는 동작(action)을 수행합니다. 작성자는 Flutter의 위젯 계층이나 ActiveRecord의 선언적 유효성 검사 및 관계 정의처럼, Ruby의 메타 프로그래밍을 활용하여 선언적인 인터페이스를 구축하고자 했습니다.

초기 스케치에서는 Tasks::Job을 상속받아 starts_with, ends_with, decision, step, next_step과 같은 키워드를 사용하여 비즈니스 흐름을 정의했습니다. 하지만 이 방식은 직관적이지 않다고 판단하여, 이후 Tasks::DecisionTree를 기반으로 inputs, outputs, decision (with if_result_is) 및 일반 메서드를 활용하는 형태로 발전시켰습니다. 그러나 이 역시 메서드의 내부 동작과 다음 흐름을 한눈에 파악하기 어렵다는 단점이 있었습니다.

최종적으로 ‘Operation’이라는 명칭을 사용하며 Operations::Task를 기반으로 한 프레임워크를 개발했습니다. 이 프레임워크의 핵심 특징은 다음과 같습니다:

  • 선언적 정의: inputs, optional, starts_with, decision, action, result 등의 DSL(Domain Specific Language)을 사용하여 비즈니스 로직의 흐름을 명확하게 선언합니다.
  • 의사결정 및 동작 분리: decision 블록은 조건을 평가하고 다음 단계를 지정하며, action 블록은 실제 작업을 수행하고 go_to를 통해 다음 단계로 이동합니다.
  • 스테이트리스 핸들러: 각 핸들러는 상태를 가지지 않아 개별 테스트가 용이하며, 복잡한 종단 간(end-to-end) 테스트의 필요성을 줄여줍니다.
  • 입력 매개변수 저장: 작업 완료 후에도 입력 매개변수를 데이터베이스에 저장함으로써 실패 진단에 유용한 정보를 제공합니다.
  • 작업 위임: ‘Operation’ 클래스 자체는 로직의 흐름을 정의하고, 실제 복잡한 작업은 다른 객체에 위임하여 클래스의 목적(라이브 문서화)을 유지합니다.

이를 통해 개발자는 복잡한 비즈니스 로직을 플로우차트 형태로 시각화하고, 이를 Operations::Task를 활용한 간결하고 읽기 쉬운 Ruby 코드로 변환하여 시스템의 동작 방식을 명확하게 이해하고 관리할 수 있게 됩니다.

결론

결론적으로 'Operations'는 Ruby on Rails 환경에서 복잡하게 얽힌 비즈니스 로직을 체계적으로 관리하고 문서화하기 위한 효과적인 해결책을 제시합니다. 플로우차트를 코드로 직접 변환하는 선언적인 접근 방식은 코드의 가독성을 극대화하며, 스테이트리스 핸들러 디자인은 테스트 용이성을 크게 향상시킵니다. 또한, 입력 매개변수 저장 기능은 문제 발생 시 진단 과정을 간소화합니다. 이 패턴은 단순히 코드를 작성하는 것을 넘어, 비즈니스 프로세스 자체를 살아있는 문서로 만들어 개발자와 비즈니스 이해관계자 모두에게 시스템의 동작 방식을 명확하게 전달하는 데 기여할 것으로 기대됩니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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