Rails 애플리케이션에서 JavaScript를 '진정한 언어'로 만들기

[27S01] Feels Like Ruby / Sarah Mei (Pivotal Labs)

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 Rails 개발자는 비침투적 JavaScript 패턴을 도입하고 JavaScript 코드를 구조화하여 관리해야 합니다.
  • 2 JavaScript를 독립적인 '진정한 언어'로 존중하며, Jasmine과 같은 BDD 프레임워크를 활용해 테스트 주도 개발을 실천해야 합니다.
  • 3 기존 Rails의 RJS 헬퍼 방식은 JavaScript 테스트를 어렵게 하므로, Rails 3의 비침투적 JavaScript 방식으로 전환하여 코드 품질을 높여야 합니다.

도입

본 발표는 Ruby 개발자가 웹 애플리케이션 개발 과정에서 겪는 JavaScript 관련 어려움을 해소하고, JavaScript를 '진정한 언어'로 격상시키는 방안을 제시합니다. 발표자는 Ruby의 표현력, 유연성, 접근성 및 RSpec, TestUnit, Cucumber와 같은 강력한 테스트 도구들을 높이 평가하며, 이와 대비되는 JavaScript 개발의 고통스러운 현실을 지적합니다. 특히 Rails 2의 RJS 헬퍼가 JavaScript를 다루는 방식과 실제 JavaScript의 빠른 진화 속도 사이의 철학적 불일치를 강조하며, JavaScript 개발 경험을 개선할 필요성을 역설합니다.

Rails의 JavaScript 처리 문제점

웹 애플리케이션은 HTML, CSS, JavaScript, Ruby, SQL 등 다양한 언어로 구성된 다국어 환경입니다. Rails는 Active Record를 통해 SQL과의 상호작용을 성공적으로 추상화했지만, RJS 헬퍼를 사용한 JavaScript 생성 방식은 여러 문제를 야기합니다. JavaScript의 라이브러리와 사용 패턴은 Ruby보다 훨씬 빠르게 진화하고 있어, Rails 프레임워크가 모든 변화를 따라가기 어렵습니다. 특히 Rails 2의 RJS는 JavaScript 코드를 뷰(view)에 분산시켜 테스트를 어렵게 만들며, Selenium과 같은 통합 테스트만으로는 수많은 상호작용을 검증하기 비효율적입니다.

비침투적 JavaScript로의 전환

이러한 문제점을 해결하기 위해 발표자는 비침투적 JavaScript 패턴을 제안합니다. 핵심적인 내용은 다음과 같습니다.

  • RJS 사용을 중단하고, 순수한 JavaScript 함수를 직접 작성합니다.

  • JavaScript의 프로토타입 기반 특성을 고려하여 함수들을 클래스(sets)로 구성합니다.

  • 클래스들을 동작 및 위치별로 체계적으로 정리합니다.

  • 모든 JavaScript 코드를 테스트 주도 방식으로 개발합니다.

  • Rails 3는 이러한 비침투적 JavaScript 방식을 채택하여 개선될 예정입니다.

실제 코드 예시 및 구조화

구체적인 예시로, link_to 헬퍼에서 인라인 JavaScript를 제거하고 대신 CSS 클래스를 부여하는 방식을 보여줍니다. JavaScript 코드는 public/javascripts 디렉토리에 별도의 파일(project_form.js)로 분리하여 관리합니다. 이 파일 내에서 ruby_kyi.project_form과 같은 클래스를 정의하고 initialize, removeTask 등의 함수를 포함합니다. document.ready 이벤트 시점에 해당 클래스를 초기화하여 동작을 DOM 요소에 연결합니다. 여러 페이지에서 동일한 기능을 사용할 경우, project_edit_page, project_new_page와 같은 페이지별 클래스를 생성하여 project_form 객체를 초기화하는 방식으로 확장성을 확보하여 코드의 복잡성을 관리할 수 있습니다.

JavaScript 테스트 프레임워크 Jasmine

JavaScript 테스트를 위해 Pivotal이 개발한 오픈소스 BDD(Behavior-Driven Development) 테스트 프레임워크인 Jasmine을 소개합니다. Jasmine은 RSpec과 유사한 스타일을 가지며, JavaScript 코드를 JavaScript로 테스트하는 철학을 따릅니다. 특히 DOM에 의존하지 않아 웹 이외의 JavaScript 환경에서도 테스트가 가능합니다. gem install jasmine으로 설치하며, spec/javascripts 디렉토리에 스펙을 작성합니다. describe, it, expect 및 매처(matcher)를 사용하여 동작을 기술하며, 사용자 정의 매처도 지원합니다. Jasmine은 내장 서버를 통해 브라우저에서 테스트를 실행할 수 있으며, 지속적 통합(CI)을 위한 Selenium 연동 및 Johnson을 이용한 헤드리스(headless) 테스트 플러그인도 제공합니다. Q&A 세션에서는 Jasmine이 Ajax 호출이나 시각적 효과와 같은 부수 효과(side effect)를 스파이(spy)와 목(mock)을 통해 효과적으로 테스트할 수 있는 기능도 설명합니다.

결론

결론적으로, 웹 애플리케이션 개발에서 JavaScript는 더 이상 서버 언어의 부속물이 아닌, 독립적이고 중요한 '진정한 언어'로 존중되어야 합니다. 이를 위해 Rails 개발자는 RJS 헬퍼 사용을 지양하고 비침투적 JavaScript 패턴을 채택하여 코드를 체계적으로 구조화해야 합니다. 또한, Jasmine과 같은 BDD 테스트 프레임워크를 활용하여 모든 JavaScript 코드를 테스트 주도 방식으로 개발함으로써 코드의 품질과 유지보수성을 크게 향상시킬 수 있습니다. 이러한 접근 방식은 복잡한 웹 애플리케이션 개발 환경에서 JavaScript의 역할을 강화하고 개발 경험을 긍정적으로 변화시킬 것입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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