루비에서의 Railway-Oriented Design: PORO 및 Rails-native 서비스

Railway-Oriented Design in Ruby: PORO and Rails-native Service | by Marie Giy | Jan, 2026 | Medium

작성자
jeff
발행일
2026년 01월 06일

핵심 요약

  • 1 Railway-Oriented Design(RoD)은 성공과 실패 경로를 명시적으로 분리하여 예외 대신 Result 객체를 통한 예측 가능한 제어 흐름을 제공합니다.
  • 2 루비에서 Result 객체와 then 메서드를 활용하여 프레임워크에 독립적인 PORO(Plain Old Ruby Object) 및 Rails 환경에서 RoD 패턴을 효과적으로 구현할 수 있습니다.
  • 3 RoD는 복잡한 비즈니스 로직, API 액션, 백그라운드 작업에서 깊은 중첩이나 산발적인 반환 없이 가독성 높고 구성 가능한 단계별 처리를 가능하게 하여 복잡성을 줄입니다.

도입

2014년 Scott Wlaschin에 의해 소개된 Railway-Oriented Design(RoD)은 함수형 프로그래밍(특히 F#)에서 유래했지만, 언어 독립적인 패턴으로 루비 및 Rails 환경에도 자연스럽게 적용됩니다. 이 디자인 패턴의 핵심은 성공과 실패를 두 개의 병렬 트랙으로 시각화하여, 예외 기반의 제어 흐름 대신 명시적이고 구성 가능하며 읽기 쉬운 오류 처리를 제공하는 것입니다. 이는 개발자가 복잡한 비즈니스 로직을 명확하게 구조화할 수 있도록 돕습니다.

루비에서 RoD는 핵심적으로 Result 객체와 then 메서드를 사용하여 구현됩니다. Result 객체는 작업의 성공 여부와 결과 값 또는 오류 정보를 캡슐화하며, then 메서드는 이전 단계가 성공했을 때만 다음 파이프라인 단계를 실행하는 ‘철도 스위치’ 역할을 합니다.

PORO (Plain Old Ruby Object) 구현

프레임워크 독립적인 PORO 환경에서 Result 클래스는 self.ok, self.fail 팩토리 메서드를 제공합니다. 서비스 객체는 then을 사용하여 validate, normalize, persist와 같은 비즈니스 로직 단계를 순차적으로 연결하며, 각 단계는 Result.ok 또는 Result.fail을 반환해 흐름을 제어합니다. 오류 발생 시 code, message, details를 표준화하고 step 메서드를 추가하여 실패 발생 단계를 기록함으로써 문제 해결 정보를 풍부하게 제공합니다.

Rails 환경에서의 구현 (ActiveRecord + 트랜잭션)

Rails 애플리케이션에서는 User 모델 유효성 검사를 활용하되, 예외 대신 Result.fail을 반환하는 방식으로 RoD를 적용합니다. 서비스 객체는 coerce, authorize, create_in_transaction 등의 단계를 then으로 연결합니다. create_in_transactionActiveRecord::Base.transaction으로 데이터베이스 작업의 원자성을 보장하며, user.save 실패 시 Rails 유효성 검사 오류나 ActiveRecord::RecordNotUnique 예외를 Result.fail로 구조화하여 반환합니다. 컨트롤러는 서비스 호출 결과를 result.ok?로 확인해 성공 시 JSON 응답을, 실패 시 구조화된 오류 메시지와 HTTP 상태 코드를 반환함으로써 일관된 API 응답을 제공합니다. RoD는 복잡한 비즈니스 워크플로우에서 파이프라인의 가독성과 확장성을 크게 향상시킵니다.

결론

Railway-Oriented Design은 성공 경로와 실패 경로를 명확하게 분리하는 직관적인 사고 모델을 제공하여 이해하기 쉽습니다. 이 패턴은 깊은 중첩 조건문을 제거하고, 작고 구성 가능한 단계를 장려하며, 함수형 및 객체 지향 시스템 모두에서 효과적으로 작동합니다. 복잡한 비즈니스 워크플로우, 일관된 오류 의미론이 필요한 API 액션, 구조화된 실패 보고가 중요한 백그라운드 작업에 특히 유용합니다. 적절한 상황에서 RoD를 사용하면 복잡성을 추가하는 것이 아니라 오히려 제거하여 코드의 명확성과 유지보수성을 크게 향상시킬 수 있습니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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