Ruby에서 Dry Monads를 활용한 Railway Oriented Programming 기반 오류 처리

Railway Oriented Programming In Rails Using Dry-Monads - Honeybadger Developer Blog

작성자
jeff
발행일
2021년 11월 15일

핵심 요약

  • 1 Railway Oriented Programming(ROP)은 각 단계의 성공/실패 여부에 따라 프로세스를 분기하여 전체 오류를 효과적으로 관리하는 패러다임입니다.
  • 2 Ruby의 dry-monads 젬의 Result Monad는 ROP 구현에 이상적이며, Success 및 Failure 객체를 통해 명시적인 조건문 없이 오류 흐름을 제어합니다.
  • 3 ROP는 복잡한 비즈니스 로직을 작은 함수로 분할하고, 각 함수의 결과를 연결하여 코드 가독성과 유지보수성을 크게 향상시킵니다.

도입

모든 프로그램에서 오류 처리는 필수적이며, 코드 구현 중 발생할 수 있는 오류를 예측하고 적절히 처리하여 애플리케이션의 각 단계에서 발생한 오류를 명확히 설명하는 것이 중요합니다. 동시에 코드의 기능성과 가독성을 유지하는 방식으로 이를 달성해야 합니다. 본문에서는 이러한 목표를 달성하기 위한 효과적인 방법론인 Railway Oriented Programming(ROP)과 Ruby에서 이를 구현하는 dry-monads 젬에 대해 심층적으로 다룹니다.

Railway Oriented Programming (ROP) 개념

ROP는 스콧 왈라신(Scott Wlaschin)이 고안한 개념으로, 철도 스위치 비유를 통해 오류 처리를 설명합니다. 여러 작은 함수로 구성된 복합 함수에서 각 단계는 성공하거나 실패할 수 있으며, 어떤 단계라도 실패하면 전체 프로세스가 실패합니다.

  • 두 가지 트랙: 각 단계의 성공/실패 결과는 철도 스위치처럼 작동하여 성공 트랙 또는 실패 트랙으로 이동시킵니다.

  • 오류 발생 시: 실패 트랙으로 이동하여 나머지 단계를 우회하고 즉시 실패 결과를 반환합니다.

  • 성공 시: 다음 단계의 입력으로 연결되어 최종 목표 달성을 향해 계속 진행됩니다. 이러한 방식은 if/elsereturn 문 없이도 명확하고 효율적인 오류 처리를 가능하게 합니다.

Dry Monads 소개 및 작동 방식

dry-monads는 Ruby를 위한 모나드 집합으로, 특히 Result Monad는 ROP의 성공/실패 출력을 구현하는 데 적합합니다.

  • 모나드란: 원래 수학적 개념으로, 코드에서 상태 값을 명시적으로 처리하지 않도록 추상화하며, 여러 특별한 함수의 구성 또는 추상화입니다.

  • dry-monads 활용:

    • Gemfiledry-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 '...'. 이러한 테스트 방식은 각 단계의 성공 또는 실패 시나리오를 명확하게 검증할 수 있도록 돕습니다.

결론

Railway Oriented Programming은 dry-monads 젬을 활용하여 Ruby 애플리케이션에서 매우 효과적인 오류 처리 메커니즘을 제공합니다. 이 접근 방식은 복잡한 비즈니스 로직을 명확하고 독립적인 단계로 분할하고, 각 단계의 성공 또는 실패를 명시적으로 처리하여 전체 프로세스의 흐름을 예측 가능하게 만듭니다. 결과적으로 코드는 더욱 간결하고 가독성이 높아지며, 오류 발생 시 정확한 위치와 원인을 쉽게 파악할 수 있어 개발 및 유지보수 효율성을 크게 향상시킵니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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