Railway Oriented Programming (ROP) 개념
ROP는 스콧 왈라신(Scott Wlaschin)이 고안한 개념으로, 철도 스위치 비유를 통해 오류 처리를 설명합니다. 여러 작은 함수로 구성된 복합 함수에서 각 단계는 성공하거나 실패할 수 있으며, 어떤 단계라도 실패하면 전체 프로세스가 실패합니다.
-
두 가지 트랙: 각 단계의 성공/실패 결과는 철도 스위치처럼 작동하여 성공 트랙 또는 실패 트랙으로 이동시킵니다.
-
오류 발생 시: 실패 트랙으로 이동하여 나머지 단계를 우회하고 즉시 실패 결과를 반환합니다.
-
성공 시: 다음 단계의 입력으로 연결되어 최종 목표 달성을 향해 계속 진행됩니다. 이러한 방식은
if/else및return문 없이도 명확하고 효율적인 오류 처리를 가능하게 합니다.
Dry Monads 소개 및 작동 방식
dry-monads는 Ruby를 위한 모나드 집합으로, 특히 Result Monad는 ROP의 성공/실패 출력을 구현하는 데 적합합니다.
-
모나드란: 원래 수학적 개념으로, 코드에서 상태 값을 명시적으로 처리하지 않도록 추상화하며, 여러 특별한 함수의 구성 또는 추상화입니다.
-
dry-monads 활용:
Gemfile에dry-monads추가 후bundle install.- 클래스 내에서
require 'dry/monads'및include Dry::Monads[:result, :do]선언. deliver_car와 같은 주요 메서드를 작은 검증 메서드(예:check_year,check_model)로 분할.- 각 검증 메서드는 조건에 따라
Success("성공 메시지")또는Failure("실패 메시지")를 반환. - 주요 메서드 내에서
yield키워드를 사용하여 이들 검증 메서드를 연결.yield는 실패 시 즉시 프로세스를 중단하고Failure를 반환하며, 성공 시 다음 단계로 진행합니다.
RSpec을 이용한 테스트
dry-monads를 사용한 ROP 코드는 RSpec을 통해 쉽게 테스트할 수 있습니다.
-
테스트에서 반환된
Result객체의success또는failure메서드를 호출하여 예상 결과와 비교합니다. -
예:
expect(delivery.success).to eq '...'또는expect(delivery.failure).to eq '...'. 이러한 테스트 방식은 각 단계의 성공 또는 실패 시나리오를 명확하게 검증할 수 있도록 돕습니다.