헥사테트라헤드랄 레일즈(Hexatetrahedral Rails) 애플리케이션: 과도한 아키텍처의 재고

Hexatetrahedral Rails - Julik Tarkhanov

작성자
발행일
2025년 07월 26일

핵심 요약

  • 1 Hexagonal Rails 아키텍처는 의도치 않은 복잡성과 유지보수 부담을 초래하며, 본래의 이점보다 비용이 큰 경우가 많습니다.
  • 2 이 접근 방식의 근본적인 가치는 ActiveRecord의 방대한 API 표면을 줄이는 'API 축소'에 있으나, 이는 더 간단한 방식으로 달성 가능합니다.
  • 3 현재 시점에서 Hexagonal Rails 아키텍처를 도입하는 것은 권장되지 않으며, 대신 모듈 단위의 엄격한 API 관리가 더 효과적입니다.

도입

약 10년 전, 도메인 주도 설계(DDD)와 앨리스터 콕번(Alastair Cockburn)의 Hexagonal Architecture 작업에 크게 영향을 받은 'Hexagonal Rails'가 소프트웨어 개발의 한 유행으로 자리 잡았습니다. 그러나 시간이 흐르면서 이러한 아키텍처를 채택한 애플리케이션들은 'hexatetrahedral Rails 애플리케이션'이라는 비유적 표현처럼, 의도한 이점보다는 복잡성을 가중시키고 유지보수 및 진화에 어려움을 겪는 사례가 빈번하게 관찰되고 있습니다. 본 글은 이러한 접근 방식의 실질적인 가치를 재평가하고, 그 문제점과 본질적인 목표를 심층적으로 분석하여 오늘날의 Rails 개발 환경에 적합한 방향성을 모색하고자 합니다.

Hexagonal Rails 아키텍처를 적용한 애플리케이션들은 종종 비표준 도구와 방대한 양의 비기본 종속성을 도입하여 업데이트 및 이해에 상당한 부담을 가중시킵니다. 이는 기존 Rails 내장 기능(ActiveRecord, ERB, 컨트롤러 등)에 익숙한 개발자들에게 새로운 학습 곡선을 요구하며, 특정 개발자에 의해 도입된 도구들이 방치되거나 재작성되는 경우도 발생합니다. 또한, ‘UsersRepository.find_all_with_email(…)’과 같은 간접 계층은 코드의 표현력을 향상시키기보다 변경을 더욱 복잡하게 만들고, 개발자가 ‘정석적인 경로’를 따를지 아니면 ActiveRecord를 직접 사용할지 매번 결정해야 하는 딜레마를 야기합니다.

‘Rails로부터의 분리(Decouple from Rails)’라는 주장은 웹을 주된 전달 수단으로 하는 Rails 애플리케이션의 본질을 간과하는 경우가 많습니다. 결제 공급자 전환, 데이터베이스 없이 비즈니스 로직 테스트, GraphQL 도입과 같은 Hexagonal 아키텍처의 이점으로 제시되는 사항들은 대부분 해당 아키텍처 없이도 충분히 달성 가능하거나, 문제의 본질과는 거리가 있습니다. 예를 들어, 결제 공급자 전환은 아키텍처의 문제가 아닌 외부 API 연동의 문제이며, GraphQL 도입 시 ActiveRecord 사용이 문제가 되는 것이 아니라 뷰 레이어 자체가 재작성되어야 합니다.

Hexagonal Rails와 연관된 DataMapper, rom_rb, dry-rb, Trailblazer, ROAR, RSpec의 과도한 모킹, ‘null database’ 등 많은 도구들은 시간이 지나면서 예상과 다르게 발전하거나 유지보수 문제를 겪었습니다. SSD와 SQLite의 발전으로 ‘null database’와 ‘mock database’의 필요성은 크게 줄었으며, FactoryBot은 테스트 속도 저하의 주범으로 지목되기도 합니다. 이러한 도구들은 추가적인 개념과 종속성을 부과하여 애플리케이션을 ‘프랑켄슈타인의 괴물’처럼 만들 수 있습니다.

그러나 저자는 Hexagonal 아키텍처의 진정한 가치가 ActiveRecord와 같이 방대한 API를 가진 프레임워크의 API 표면을 줄이는 ‘API 축소(API narrowing)’에 있다고 주장합니다. Ruby의 IO 객체 예시를 통해, 필요한 메서드만 노출하는 ‘좁은 인터페이스’가 어떻게 코드의 제어와 안정성을 높이는지 설명합니다. ActiveRecord는 600개 이상의 클래스 메서드와 270개 이상의 인스턴스 메서드를 제공하는 방대한 API를 가지고 있으며, 이는 대규모 협업 환경에서 ‘통행료 징수소’를 설치하기 매우 어렵게 만듭니다. 즉, Hexagonal 아키텍처의 핵심 동기는 비즈니스 유스케이스 모델링보다는 이처럼 거대한 API로부터 발생하는 혼란을 줄이고자 하는 열망에 있었다고 분석합니다.

결론

결론적으로, 현재 시점에서 Hexagonal Rails 아키텍처를 도입하는 것은 권장되지 않습니다. 비즈니스 유스케이스를 더 잘 모델링하려는 시도로서 Hexagonal Rails 아키텍처는 실패했다고 평가됩니다. Rails 커뮤니티 또한 Packwerk와 같은 다른 고립화 시도로 나아가고 있습니다. 이 아키텍처에서 얻을 수 있는 교훈은 여전히 유효하지만, RSpec, FactoryBot, Repository, dry-rb, rom, ROAR, Trailblazer와 같은 특정 도구들은 더 이상 필수적이지 않습니다. 가장 큰 도전 과제는 이러한 아키텍처를 설정하는 것이 아니라 이를 지속적으로 유지하는 '규율'입니다. 개발자들은 방대한 Rails 기본 API를 통해 빠르게 기능을 구현할 유혹에 직면하며, 특별히 설계된 '좁은 API'를 고수하기 어렵습니다. 또한, 특정 아키텍처에 대한 학습 비용은 다른 프로젝트나 직업으로의 이식성이 낮아 개발자들에게 부담으로 작용합니다. 대신, 각 '도메인'을 Ruby 모듈로 정의하여 모델, ActiveJob, 컨트롤러 등을 포함하는 네임스페이스를 생성하는 접근 방식을 제안합니다. 이는 Rails Engine과 유사하지만, Rails의 복잡한 초기화 주기에 얽매이지 않고 특정 모델이 특정 도메인 내에 존재한다는 신호를 제공하여 도메인 이해의 진입점으로 활용될 수 있습니다. Hexagonal Rails 아키텍처는 한때의 유행이었으며, 시간을 초월한 아키텍처로 자리 잡지 못했음을 인지하고, 더 실용적이고 유지보수 가능한 접근 방식을 모색해야 할 시점입니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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