Ruby의 모나드

Monads in Ruby. The concept of Railway Oriented… | by Altimetrik Poland Tech Blog | Medium

작성자
jeff
발행일
2023년 03월 02일

핵심 요약

  • 1 Ruby에서 dry-monads 라이브러리를 활용하여 nil 값 및 오류 처리를 일관되고 구조화된 방식으로 관리할 수 있습니다.
  • 2 Maybe, Result, Try 모나드와 do-notation을 통해 복잡한 if/else 중첩 없이 데이터 흐름을 간결하게 표현합니다.
  • 3 Railway Oriented Programming 개념을 적용하여 성공 및 실패 경로를 명확히 분리하고, 프로세스 단계를 쉽게 조합하여 안정적인 코드를 구축합니다.

도입

프로그램에서 데이터 흐름을 처리할 때, 입력 인수에 대한 유효성 검사가 필수적이지만, 복잡한 구조는 관리하기 어려운 코드를 초래할 수 있습니다. 본 아티클에서는 이러한 문제를 해결하기 위해 모나드(Monads)와 Railway Oriented Programming(ROP) 개념을 소개합니다. 이 두 가지 접근 방식은 다단계로 구성된 프로세스를 일관되고 확장 가능한 형태로 구축하는 데 기여합니다.

데이터 흐름 내에서 nil 값 처리 및 오류 방어를 위한 if/else문의 과도한 사용은 코드를 복잡하게 만듭니다. Ruby는 .try(...), presence, & 연산자 등을 제공하지만, 본문에서는 dry-monads 라이브러리의 모나드를 활용하는 새로운 접근 방식을 제시합니다.

모나드(Monads) 개요

모나드는 카테고리 이론에서 유래한 개념이지만, 프로그래밍에서는 함수형 프로그래밍 관점에서 일관된 값 반환 구조를 의미합니다. 이는 작업의 성공 또는 실패 정보를 선택적 페이로드와 함께 전달하며, 이를 통해 개별 구성 요소의 결과를 지속적으로 확인할 필요 없이 함수들을 체인으로 연결할 수 있습니다.

Maybe 모나드

dry-monadsMaybe 모나드는 Some(성공) 또는 None(nil 처리) 값을 반환합니다. 초기 SendPackage 예제를 Maybe로 리팩터링하면 if/unless/else 표현식을 제거하고 코드를 간결하게 만들 수 있습니다. bindSome일 때 블록을 실행하고, fmap은 반환 값을 Maybe로 감싸는 역할을 합니다. 그러나 중첩된 작업은 가독성을 저해하고 오류 원인에 대한 정보를 제공하지 못하는 단점이 있습니다.

Result 모나드

Result 모나드는 Success 또는 Failure 값을 반환하며, 각 값은 페이로드(성공 값 또는 오류 메시지)를 담을 수 있습니다. 이를 통해 오류 발생 시 구체적인 원인을 전달할 수 있으며, success?failure? 메서드로 결과 유형을 확인하고 success 또는 failure 메서드로 페이로드를 접근합니다.

Do-notation

dry-monads 1.0부터 도입된 do-notationyield 키워드를 사용하여 모나드 중첩을 제거하고 코드를 순차적으로 보이게 합니다. yield는 전달된 메서드가 Success(value)를 반환하면 해당 value를 반환하고, Failure를 반환하면 즉시 호출을 중단하고 Failure를 반환합니다.

Try 모나드

Try 모나드는 외부 함수에서 발생하는 예외를 처리하는 데 사용됩니다. 특정 예외 유형을 지정하여 처리하는 것이 권장되며, Value(예외 없음) 또는 Error(예외 발생)를 반환합니다. .to_result 메서드를 사용하여 Result 도메인으로 쉽게 변환할 수 있습니다.

Railway Oriented Programming (ROP)

Scott Wlaschin이 소개한 ROP는 프로그램이 따를 수 있는 성공 및 실패 경로의 존재를 가정합니다. 모나드를 통해 각 단계의 성공/실패 여부에 따라 적절한 경로로 전환되며, 최종 결과 처리는 최상위 호출에서 한 번에 이루어집니다. 이는 철도의 선로와 스위치에 비유될 수 있으며, 프로세스 구성 요소를 쉽게 조합하고 관리할 수 있도록 돕습니다. Ruby 2.7+의 패턴 매칭을 활용하면 case문을 통해 다양한 결과 유형을 깔끔하게 처리할 수 있습니다.

결론

모나드와 Railway Oriented Programming은 Ruby에서 `nil` 값 및 오류 처리를 위한 강력한 대안을 제공합니다. 이 접근 방식은 코드의 가독성을 높이고, 일관된 결과 반환 구조를 통해 확장 가능한 프로세스 구축을 가능하게 합니다. 하지만 모든 상황에 적용하기보다는 필요한 경우 신중하게 사용하는 것이 중요하며, `dry-monads` 공식 문서와 Scott Wlaschin의 'F# for Fun and Profit' 자료를 통해 더 깊이 이해하는 것을 권장합니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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