ERB-to-JS 변환을 통한 오프라인 우선 SPA 개발의 혁신: Ruby Prism 파서 활용

Automatic ERB-to-JavaScript Conversion for Offline SPAs

작성자
발행일
2025년 11월 24일

핵심 요약

  • 1 Ruby의 Prism 파서를 활용하여 ERB 템플릿을 JavaScript로 자동 변환함으로써 서버 및 클라이언트 렌더링을 위한 단일 템플릿 소스를 성공적으로 구축했습니다.
  • 2 이 접근 방식은 기존 웹 컴포넌트 방식 대비 코드 라인을 66% 절감하고, 템플릿 로직의 불일치 및 유지보수 부담을 완전히 해소하여 개발 효율성을 극대화했습니다.
  • 3 Claude Code와 같은 AI 도구의 도움으로 빠른 반복 개발이 가능해져, 불확실한 보상에도 불구하고 세 번의 재작성을 통해 최적의 아키텍처를 신속하게 찾아냈습니다.

도입

초기 웹 컴포넌트 기반의 오프라인 우선 SPA 개발은 기능적으로 성공했으나 4,000라인 이상의 코드가 요구되는 복잡성과 개발 경험의 어려움을 야기했습니다. 이후 Turbo 내비게이션을 활용한 접근 방식은 코드량을 35% 줄였지만, ERB와 JavaScript 간의 템플릿 로직 중복 문제를 해결하지 못했습니다. 이 글은 이러한 템플릿 중복 문제를 근본적으로 해결하기 위해 Ruby의 Prism 파서를 활용한 ERB-to-JavaScript 자동 변환이라는 세 번째 재작성 프로젝트를 소개합니다.

이 프로젝트의 핵심은 ERB 템플릿을 단일 진실 공급원으로 삼고, 이를 JavaScript 함수로 자동 변환하는 것입니다. 이는 기존의 병렬 템플릿 구현 방식이 겪던 문제들을 해결합니다.

병렬 템플릿 문제점

  • 로직 불일치: ERB 헬퍼 메서드와 JavaScript 문자열 보간 방식의 차이.

  • 유지보수 부담: 템플릿 변경 시 두 곳 모두 업데이트 필요.

  • 테스트 복잡성: 동작 일치를 검증하기 위한 병렬 테스트 스위트 필요.

  • 미묘한 버그: 재구현 과정에서 엣지 케이스 누락 용이.

ERB-to-JS 변환 아키텍처

Ruby 3.3에 도입된 Prism 파서를 활용하여 ERB 템플릿 내 Ruby 코드를 AST(추상 구문 트리)로 분석하고, 이를 JavaScript 코드로 변환합니다. 주요 변환 전략은 다음과 같습니다.

  • 정적 HTML: JavaScript 문자열 리터럴로 변환.

  • Ruby 출력 (<%= %>): JavaScript 표현식으로 변환.

  • Ruby 코드 (<% %>): JavaScript 함수(예: .forEach for .each) 및 조건문으로 변환.

  • 인스턴스 변수: data 객체 속성으로 매핑 (예: @subjectsdata.subjects).

  • 헬퍼 메서드: JavaScript에서도 동일한 이름으로 호출되도록 통과 (별도 정의 필요).

구현 구성 요소 (총 1,370 라인)

  • ERB to JS Converter (232 라인): ERB 파싱 및 JavaScript 변환 핵심 로직.

  • Templates Controller (73 라인): 변환된 템플릿을 ES 모듈로 제공.

  • Heat Hydrator (395 라인): 정규화된 데이터를 중첩 객체로 변환하는 공유 로직.

  • Stimulus Controller (229 라인): 템플릿 로딩, 렌더링, 내비게이션 조정.

  • Node Hydration Script (58 라인): 브라우저 외부에서 테스트 및 디버깅 지원.

특히, render_erb_and_js.rb 스크립트는 ERB와 JavaScript 버전의 렌더링 결과를 비교하고 중간 아티팩트를 저장하여 디버깅 시간을 크게 단축시키는 데 기여했습니다. 이 스크립트는 실제 데이터를 사용하여 종단 간 렌더링 일치를 검증합니다.

결과 및 비교

  • 코드 크기: 기존 웹 컴포넌트 방식(4,025 라인) 대비 66% 감소한 1,370 라인으로 구현.

  • 대역폭: 두 방식 모두 동일한 벌크 다운로드 전략으로 효율적인 대역폭 사용 (~214KB).

  • 테스팅: 42개의 단위 테스트와 render_erb_and_js.rb 스크립트를 통한 실제 데이터 기반의 렌더링 일치 검증으로 높은 신뢰성 확보.

결론

ERB-to-JS 변환 방식은 단일 템플릿 코드베이스를 통해 유지보수성, 자동 변환을 통한 정확성, 그리고 `render_erb_and_js.rb`와 같은 도구를 통한 뛰어난 디버깅 가능성을 제공합니다. Claude Code와 같은 AI 도구의 도움으로 각 재작성 단계를 며칠 내에 완료하며, 불확실한 보상이 따르는 야심 찬 프로젝트도 실용적으로 만들었습니다. 이 프로젝트는 때로는 문제를 역발상하여 해결하는 것이 최적의 접근 방식임을 보여주며, 빠른 반복 개발이 최적의 솔루션을 찾는 데 얼마나 중요한 역할을 하는지 강조합니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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

아직 댓글이 없습니다

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