ViewComponent In The Wild: 현대적인 Rails 프론트엔드 구축하기

ViewComponent in the Wild I: building modern Rails frontends—Martian Chronicles, Evil Martians’ team blog

작성자
jeff
발행일
2022년 10월 12일

핵심 요약

  • 1 ViewComponent는 Rails 애플리케이션의 뷰 레이어 개발을 합리적으로 돕는 GitHub의 라이브러리로, 기존 partials 및 뷰 헬퍼 방식의 한계를 극복합니다.
  • 2 단일 페이지 애플리케이션(SPA) 대신 고전적인 서버 주도 MVC 방식에서 ViewComponent를 활용하여 현대적이고 유지보수 가능한 프론트엔드를 구축할 수 있습니다.
  • 3 ViewComponent는 컴포넌트의 격리된 테스트, 재사용성 증대, 백엔드와 프론트엔드 팀 간의 협업 용이성 등 다양한 이점을 제공하여 코드 품질을 향상시킵니다.

도입

GitHub에서 개발한 ViewComponent 라이브러리는 Ruby on Rails 애플리케이션의 뷰 레이어를 보다 체계적으로 구축할 수 있도록 지원하며, 최근 개발자들 사이에서 점차 주목받고 있습니다. 이 글은 ViewComponent의 필요성과 현대 Rails 애플리케이션에서 컴포넌트 기반 접근 방식을 적용하는 고수준의 측면을 다룹니다. 특히, 단일 페이지 애플리케이션(SPA)에 대한 강력한 대안으로서 ViewComponent가 어떻게 복잡성을 줄이고 효율적인 개발을 가능하게 하는지 탐구하며, 실질적인 적용 팁과 모범 사례를 제시하여 견고한 프론트엔드를 구축하는 방법을 안내합니다.

MVC의 ‘V’ 재조명

2022년에도 고전적인 MVC(Model-View-Controller) 아키텍처에서 뷰 레이어를 구축하는 것이 유효한지에 대한 의문이 제기되곤 합니다. 현재 많은 프로젝트가 백엔드와 프론트엔드를 분리하여 운영하지만, 이는 개발 비용 증가와 인프라 복잡성 등 숨겨진 비용을 초래할 수 있습니다. GitHub와 같은 대규모 애플리케이션이 여전히 멀티 페이지 Rails 애플리케이션으로 운영되며 ERB 템플릿을 활용하는 사례는 서버 주도 MVC 방식의 잠재력을 보여줍니다. 또한, Phoenix LiveView에서 영감을 받은 Hotwire와 같은 ‘HTML over-the-wire’ 접근 방식은 JavaScript 없이도 반응형 웹 인터페이스를 구축할 수 있는 대안을 제시하며, 이는 SPA의 필요성을 다시금 고려하게 만듭니다. 결국, 어떤 방식이든 코드 구조를 합리적으로 관리하는 것이 중요하며, 여기서 ✨컴포넌트✨의 역할이 부각됩니다.

컴포넌트의 장점

프론트엔드 개발에서 컴포넌트 방식은 이미 보편화되어 있으며, 이는 컴포넌트가 고립성, 테스트 용이성, 재사용성, 조합성 등 좋은 코드의 특성을 모두 갖추고 있기 때문입니다. 반면, Rails의 기존 partials 및 뷰 헬퍼 방식은 결합도가 높고 데이터 흐름이 예측 불가능하며 테스트가 어렵다는 단점을 가집니다. ViewComponent는 이러한 문제를 해결하기 위해 Ruby 객체와 연결된 템플릿(ERB/Slim 등)이라는 간단한 아이디어를 기반으로 합니다. 컴포넌트는 일반 Ruby 객체처럼 인스턴스화하고 Rails의 #render 메서드로 렌더링하며, 이를 통해 예측 가능성(유지보수성)과 Ruby OOP의 강력한 기능을 뷰에 도입합니다.

특히, ViewComponent는 테스트 측면에서 혁신적입니다. 컴포넌트 테스트는 PORO(Plain Old Ruby Objects) 테스트만큼 용이하며, 기존 요청/시스템 테스트보다 훨씬 빠르고 안정적입니다. 이는 뷰 코드에 대한 신뢰를 높이고 통합 테스트의 부담을 줄여줍니다. 또한, 백엔드와 프론트엔드 팀 간의 개발 패러다임을 일치시켜 프론트엔드 개발자가 백엔드 뷰 코드에 쉽게 접근하고 수정할 수 있도록 돕는 큰 이점이 있습니다.

컴포넌트 활용법

ViewComponent를 효과적으로 사용하기 위해서는 몇 가지 원칙을 준수해야 합니다. 프론트엔드 커뮤니티에서 확립된 모범 사례들을 백엔드 환경에 맞게 적용하는 것이 중요합니다.

  • 헬퍼가 아닌 실제 동작 테스트: 컴포넌트의 Ruby 클래스 내 메서드보다는 컴포넌트의 퍼블릭 인터페이스인 템플릿의 실제 동작(조건부 로직, 계산 등)을 테스트해야 합니다. 이를 통해 뷰 레이어의 높은 테스트 커버리지를 확보할 수 있습니다.
  • 전역 상태 전달에 컨텍스트 사용: current_user와 같이 자주 사용되는 전역 데이터는 dry-effects와 같은 라이브러리를 통해 컨텍스트로 전달하여 ‘인자 드릴링(argument drilling)’ 문제를 피할 수 있습니다. 단, 과도한 사용은 데이터 흐름 추적을 어렵게 하므로 주의해야 합니다.
  • 깊게 중첩된 컴포넌트 트리 피하기: 컴포넌트 트리가 깊어지는 것을 방지하기 위해 데이터를 직접 전달하기보다 컴포넌트 자체를 슬롯(renders_one, renders_many)을 통해 전달하는 방식을 활용합니다. 이는 컴포넌트의 재사용성을 높이고, ‘Smart’ 컴포넌트(애플리케이션 특정 로직)와 ‘Dumb’ 컴포넌트(재사용 가능한 UI 요소)를 분리하는 데 도움이 됩니다.
  • 단일 책임 원칙 준수: 큰 템플릿은 피하고, 컴포넌트가 하나의 책임만 갖도록 분해해야 합니다. 이는 코드 이해도를 높이고 리팩토링 및 재사용을 용이하게 하여 코드 품질을 향상시킵니다.
  • 컴포넌트 내 DB 쿼리 피하기: 뷰는 데이터를 렌더링하는 역할을 하며, 데이터를 가져오는 역할은 컨트롤러에서 수행해야 합니다. 컴포넌트 내에서 DB 쿼리를 수행하면 N+1 문제와 같은 성능 저하를 유발할 수 있으므로, 데이터를 미리 로드하여 전달하는 것이 바람직합니다. 개발 단계에서는 컴포넌트의 DB 쿼리를 완전히 금지하는 설정도 고려할 수 있습니다.

이러한 가이드라인을 준수함으로써 ViewComponent를 활용한 개발 과정에서 발생할 수 있는 일반적인 함정을 피하고, 보다 견고하고 유지보수 가능한 코드를 작성할 수 있습니다.

결론

ViewComponent는 Rails 뷰 레이어 개발의 복잡성을 관리하고 코드 품질을 향상시키는 데 있어 강력한 도구입니다. 이 글에서 제시된 모범 사례와 원칙들, 즉 컴포넌트의 적절한 테스트, 컨텍스트를 통한 전역 상태 관리, 깊은 중첩 피하기, 단일 책임 원칙 준수, 그리고 컴포넌트 내 DB 쿼리 회피 등은 개발자들이 ViewComponent의 잠재력을 최대한 발휘할 수 있도록 돕습니다. 이러한 가이드라인을 따름으로써 개발자들은 더욱 즐겁고 효율적인 개발 경험을 할 수 있으며, 결과적으로 고품질의 유지보수 가능한 Rails 애플리케이션을 구축할 수 있을 것입니다. 이제 이론을 넘어 ViewComponent의 실제 활용 단계로 나아갈 때입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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