11월 오픈 소스 프로젝트 현황: dry-operation 및 web_pipe 업데이트

Open Source Status: November 2023 - dry-operation failure hooks & database transactions | Waiting for dev…

작성자
jeff
발행일
2023년 12월 01일

핵심 요약

  • 1 dry-operation은 실패 경로 처리를 위한 #on_failure 훅을 도입하고, 데이터베이스 트랜잭션 관리는 세분화된 제어를 위해 #transaction 메서드를 통한 수동 래핑 방식을 채택했습니다.
  • 2 web_pipe는 Ruby Gem의 자동 로딩을 위해 Zeitwerk를 통합했으며, dry-auto_inject와 같은 도구에 의존하여 의존성 주입 책임을 분리하는 아키텍처 재편을 실험 중입니다.
  • 3 dry-operation의 트랜잭션 전략은 개발자가 저수준의 DB 트랜잭션 세부 사항을 인지하고 개별 오퍼레이션의 조합성을 장려함으로써, 전체 플로우보다는 오퍼레이션 단위의 구성을 유도합니다.

도입

이번 달에는 두 가지 주요 오픈 소스 프로젝트인 dry-operation과 web_pipe의 상당한 진전이 있었습니다. 필자는 이 두 프로젝트에 깊은 고심과 노력을 기울였으며, 그 결과로 이루어진 중요한 업데이트 사항들을 공유합니다. dry-operation은 견고한 오퍼레이션 관리, 특히 실패 처리 및 데이터베이스 트랜잭션 통합에 중점을 두고 있으며, web_pipe는 웹 애플리케이션 아키텍처를 개선하는 데 초점을 맞추고 있습니다. 이번 업데이트는 Ruby 개발자의 변화하는 요구 사항을 충족시키기 위해 프로젝트의 설계와 기능을 지속적으로 개선하려는 노력을 반영합니다.

이번 업데이트의 핵심은 dry-operation과 web_pipe 프로젝트의 진화입니다.

dry-operation: 실패 경로 및 데이터베이스 트랜잭션 관리 개선

dry-operation은 ‘행복한 경로(happy path)’를 간소화하는 데 중점을 두지만, ‘불행한 경로(unhappy path)’ 또한 간과하지 않습니다.

  • 실패 처리 #on_failure 훅 도입:
    • 기존에는 개별 오퍼레이션이 로컬에서 실패를 관리했으나, 전역적인 오류 처리(예: 실패 로깅)를 위해 #on_failure 훅이 추가되었습니다.
    • 이 훅은 오퍼레이션이 실패할 때 호출되어, 호출자와 독립적으로 공통된 실패 처리를 수행할 수 있도록 합니다. ruby class CreateUser < Dry::Operation def call(input) attrs = step validate(input) step persist(attrs) user end private def on_failure(failure) log_failure(failure) end # ... end
  • 데이터베이스 트랜잭션 전략:
    • 전체 플로우를 트랜잭션으로 래핑하는 방식과 #transaction 메서드를 통해 원하는 오퍼레이션만 수동으로 래핑하는 두 가지 접근 방식이 검토되었습니다.
    • 최종적으로 후자인 #transaction 메서드를 통한 수동 래핑 방식이 채택되었습니다. 이는 개발자가 데이터베이스 트랜잭션의 저수준 세부 사항을 명확히 인지하고, 비용이 많이 드는 작업을 트랜잭션 내에 포함하지 않도록 유도하기 위함입니다.
    • 이 결정은 dry-operation이 전체 플로우보다는 개별 오퍼레이션의 조합성을 장려하는 설계 철학과 일치합니다.
    • ROM 확장이 이 접근 방식의 첫 번째 구현 사례이며, 향후 다른 데이터베이스 라이브러리에 대한 지원도 추가될 예정입니다. ruby class MyOperation < Dry::Operation include Dry::Operation::Extensions::ROM attr_reader :rom def initialize(rom:) @rom = rom end def call(input) attrs = step validate(input) user = transaction do new_user = step persist(attrs) step assign_initial_role(new_user) new_user end step notify(user) user end # ... end

web_pipe: Zeitwerk 통합 및 아키텍처 실험

  • web_pipe는 이제 Zeitwerk 기반의 Ruby Gem으로, 향상된 자동 로딩 기능을 제공합니다.

  • 현재 web_pipe의 내부 아키텍처에 대한 광범위한 실험이 진행 중이며, 이는 상당한 내부 개편으로 이어질 수 있습니다.

  • 핵심 아이디어는 web_pipe 자체에서 의존성 주입 책임을 제거하고, 대신 dry-auto_inject와 같은 전용 의존성 주입 도구에 의존하도록 하는 것입니다. 이는 모듈성을 높이고 각 컴포넌트의 역할을 더욱 명확히 하는 데 기여할 것으로 예상됩니다.

결론

이번 업데이트는 dry-operation과 web_pipe 프로젝트의 중요한 진전을 명확히 보여줍니다. dry-operation은 실패 처리 메커니즘과 데이터베이스 트랜잭션 관리 방식을 개선하여 개발자가 더욱 견고하고 명확한 비즈니스 로직을 구축할 수 있도록 지원하며, 개별 오퍼레이션의 조합성을 강화합니다. 반면 web_pipe는 Zeitwerk 통합을 통해 개발 편의성을 높이고, 아키텍처 재편을 통해 의존성 관리의 효율성을 추구하고 있습니다. 이 두 프로젝트는 Ruby 생태계에서 모듈화되고 유지보수하기 쉬운 애플리케이션을 구축하는 데 필수적인 기여를 할 것으로 기대됩니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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