Rails 애플리케이션에 구문 강조(Syntax Highlighting) 추가하기

Code Highlighting with Rails

작성자
HackerNews
발행일
2025년 10월 28일

핵심 요약

  • 1 Rails 애플리케이션에 구문 강조를 추가하는 다양한 방법을 탐구하며, Commonmarker, Redcarpet+Rouge, Highlight.js, 그리고 Rhino Editor를 활용한 서버 및 클라이언트 측 구현을 다룹니다.
  • 2 Commonmarker는 인라인 스타일로 간편한 구문 강조를 제공하며, Redcarpet과 Rouge는 커스텀 HTML 렌더러와 다양한 테마를 통해 유연한 서버 측 처리를 가능하게 합니다.
  • 3 Highlight.js는 프런트엔드에서 동적 구문 강조를 제공하며, Rhino Editor는 Action Text와 통합되어 WYSIWYG 환경에서 실시간 편집 강조 기능을 지원합니다.

도입

개발자로서 구문 강조(Syntax Highlighting)는 블로그, CMS, 문서 사이트 등 사용자 생성 마크다운 콘텐츠를 다루는 Rails 애플리케이션에서 필수적인 기능입니다. 본 아티클은 Rails 애플리케이션에 구문 강조를 추가하는 여러 효과적인 방법을 제시하고, 사용자 경험을 개선하기 위한 유용한 팁들을 소개합니다. Commonmarker, Redcarpet과 Rouge, Highlight.js, 그리고 Rhino Editor를 활용한 백엔드 및 프런트엔드 솔루션을 통해 다양한 시나리오에 맞는 구현 방안을 상세히 다룰 것입니다.

Rails 애플리케이션에 구문 강조를 추가하는 방법은 크게 서버 측 처리와 클라이언트 측 처리로 나눌 수 있으며, WYSIWYG 에디터 통합 방안도 있습니다.

1. Commonmarker Gem 활용

Commonmarker는 구문 강조 스타일을 인라인으로 추가하여 별도의 라이브러리 없이 간편하게 구현할 수 있습니다.

  • Post 모델에 formatted_content 메서드를 정의하여 Commonmarker.to_html을 사용합니다.

  • plugins: { syntax_highlighter: { theme: "base16-ocean.dark" } } 옵션을 통해 테마를 지정합니다.

  • path: Rails.root.join("app", "assets", "themes").to_s를 통해 .tmtheme 형식의 사용자 정의 테마를 추가할 수 있습니다.

2. Redcarpet과 Rouge 조합

Redcarpet과 Rouge는 Rails 개발자들이 가장 흔히 사용하는 구문 강조 스택입니다.

  • Redcarpet::Render::HTML을 상속받는 HtmlRenderer 클래스를 생성하고 Rouge::Plugins::Redcarpet 모듈을 포함시킵니다.

  • Post 모델의 formatted_content 메서드에서 Redcarpet::Markdown.new(HtmlRenderer, { fenced_code_blocks: true }).render(content)를 호출합니다.

  • 테마 적용은 <% content_for :head do %><style><%= Rouge::Themes::Molokai.render %></style><% end %>와 같이 인라인으로 추가하거나, rougify 스크립트를 통해 CSS 파일을 생성하여 링크할 수 있습니다.

3. Highlight.js 활용 (프런트엔드)

Highlight.js는 가장 인기 있는 프런트엔드 구문 강조 라이브러리입니다.

  • Post 모델에 formatted_plain 메서드를 추가하여 Commonmarker로 구문 강조 없이 마크다운을 HTML로 파싱합니다.

  • app/javascript/syntax_highlight.js 파일에 Highlight.js를 임포트하고 hljs.highlightElement(block)를 호출하여 코드 블록을 강조합니다.

  • import hljs from "highlight.js/lib/core"와 같이 필요한 언어만 선택적으로 임포트하여 번들 크기를 최적화할 수 있습니다.

  • CSS 번들링을 사용하는 경우 @import "highlight.js/styles/tokyo-night-dark.css"application.tailwind.css에 추가합니다.

4. Rhino Editor 활용 (WYSIWYG)

Action Text 호환 WYSIWYG 에디터인 Rhino Editor는 TipTap과 Highlight.js를 기반으로 합니다.

  • Action Text 및 Active Storage를 설치하고 Post 모델에 has_rich_text :body를 추가합니다.

  • Rhino Editor를 설치하고 app/javascript/rhino_editor.js에서 lowlight@tiptap/extension-code-block-lowlight를 사용하여 에디터 내에서 실시간 구문 강조를 구현합니다.

  • rhino-before-initialize 이벤트 리스너를 통해 starterKitOptionsextensions를 커스터마이징합니다.

5. 적절한 접근 방식 선택

  • 서버 측: 대부분의 경우 적합하며, Commonmarker, Redcarpet+Rouge(Pygments) 등이 사용됩니다.

  • 프런트엔드: 실시간 강조, 혼합 프런트엔드 환경, 다양한 테마 선택 시 유리합니다. 단, 번들 크기 증가, 강조 깜빡임, 언어 지원 제한 등의 단점이 있습니다.

결론

본 아티클에서는 Rails 애플리케이션에 구문 강조 기능을 통합하는 다양한 접근 방식을 살펴보았습니다. Commonmarker를 통한 간편한 인라인 스타일 적용, Redcarpet과 Rouge를 활용한 유연한 서버 측 렌더링, Highlight.js를 이용한 효율적인 클라이언트 측 처리, 그리고 Rhino Editor와 `lowlight` 확장 기능을 통한 WYSIWYG 에디터 내 실시간 강조까지, 각 방법은 고유한 장단점을 가집니다. 프로젝트의 특정 요구사항(성능, 사용자 경험, 개발 편의성 등)을 고려하여 가장 적합한 방법을 선택하는 것이 중요하며, 이를 통해 사용자에게 더욱 풍부하고 전문적인 콘텐츠 경험을 제공할 수 있습니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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