루비에서 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_transaction은 ActiveRecord::Base.transaction으로 데이터베이스 작업의 원자성을 보장하며, user.save 실패 시 Rails 유효성 검사 오류나 ActiveRecord::RecordNotUnique 예외를 Result.fail로 구조화하여 반환합니다. 컨트롤러는 서비스 호출 결과를 result.ok?로 확인해 성공 시 JSON 응답을, 실패 시 구조화된 오류 메시지와 HTTP 상태 코드를 반환함으로써 일관된 API 응답을 제공합니다. RoD는 복잡한 비즈니스 워크플로우에서 파이프라인의 가독성과 확장성을 크게 향상시킵니다.