Rails에서 Stimulus를 활용하여 URL을 사용자 친화적인 링크로 자동 변환하기

Turning URLs into User Friendly Links with Stimulus in Rails - Unagi

작성자
발행일
2025년 08월 29일

핵심 요약

  • 1 블로그 에디터에서 URL을 붙여넣을 때, 자동으로 해당 아티클의 제목으로 링크를 생성하는 기능 구현 방법을 제시합니다.
  • 2 Trix 리치 텍스트 에디터와 Stimulus 컨트롤러를 사용하여 붙여넣기 이벤트를 감지하고 URL을 처리합니다.
  • 3 동일 도메인 URL 감지, HTML 파싱을 통한 제목 추출, 그리고 Trix 에디터 내에서 URL을 링크된 제목으로 교체하는 과정을 상세히 설명합니다.

도입

블로그 애플리케이션에서 URL을 복사하여 붙여넣는 과정은 사용자 경험 측면에서 비효율적일 수 있습니다. 사용자는 단순히 URL을 붙여넣는 대신, 해당 URL이 가리키는 아티클의 제목으로 자동 변환되어 링크되는 기능을 원합니다. 본 문서는 이러한 작은 불편함에서 착안하여, Trix 리치 텍스트 에디터와 Stimulus 프레임워크를 활용하여 URL을 사용자 친화적인 링크로 자동 변환하는 구현 방안을 상세히 설명합니다.

아이디어 및 접근 방식

사용자가 블로그 에디터에 다른 아티클의 URL을 붙여넣으면, 해당 URL이 아티클의 제목으로 자동 변환되어 하이퍼링크가 걸리는 것이 핵심 아이디어입니다. 이를 위해 Trix 에디터의 trix-paste 이벤트를 Stimulus 컨트롤러로 처리하는 방식을 채택했습니다.

Trix 및 Stimulus를 활용한 구현 단계

  • Stimulus 컨트롤러 바인딩: Trix 에디터(form.rich_text_area)에 data-controller="url-link"data-action="trix-paste->url-link#handlePaste"를 추가하여 붙여넣기 이벤트를 url-link 컨트롤러의 handlePaste 메서드에 연결합니다.
  • 붙여넣기 이벤트 처리 (handlePaste): event.paste 객체에서 getPlainTextFromPaste 헬퍼를 통해 순수 텍스트를 추출합니다. 추출된 텍스트가 현재 애플리케이션의 도메인(window.location.origin)으로 시작하는 URL인지 확인하여 외부 링크는 처리하지 않습니다. 사용자가 붙여넣은 내용을 시각적으로 인지할 수 있도록 100ms의 setTimeout을 사용하여 replacePastedUrl 함수를 비동기적으로 호출합니다.
  • URL을 링크로 교체 (replacePastedUrl): fetchTitle 함수를 호출하여 URL에 해당하는 아티클의 제목을 비동기적으로 가져옵니다. Trix 에디터의 현재 선택 범위(editor.getSelectedRange())와 붙여넣은 URL의 길이를 이용하여 URL 텍스트의 정확한 범위를 계산합니다. editor.setSelectedRange(range)를 통해 URL 텍스트를 선택한 후, editor.activateAttribute("href", url)로 링크 속성을 활성화하고, editor.insertString(title)로 아티클 제목을 삽입합니다. 마지막으로 editor.deactivateAttribute("href")를 호출하여 링크 속성 적용을 완료합니다.
  • 아티클 제목 가져오기 (fetchTitle): fetch(url)을 사용하여 대상 URL의 HTML 콘텐츠를 가져옵니다. DOMParser().parseFromString(html, "text/html")을 통해 HTML 문자열을 DOM 객체로 파싱합니다. doc.querySelector("title")?.textContent?.trim()을 사용하여 <title> 태그의 텍스트 내용을 추출합니다. 제목이 없으면 원본 URL을 반환합니다.
  • 붙여넣기 콘텐츠 정규화 (getPlainTextFromPaste): 붙여넣기 이벤트의 paste 객체는 string 또는 html 속성을 가질 수 있습니다. 이 헬퍼 함수는 paste.string이 존재하면 이를 반환하고, paste.html이 존재하면 임시 div 요소를 생성하여 HTML을 삽입한 후 textContent 또는 innerText를 추출하여 항상 순수 텍스트를 반환하도록 합니다.

결론

이러한 작은 사용자 경험 개선은 에디터의 사용 흐름을 극적으로 향상시킬 수 있습니다. 사용자가 링크를 자주 붙여넣는 환경에서, URL이 자동으로 아티클 제목으로 변환되는 기능은 단순한 편의성을 넘어 사용자에게 원활하고 효율적인 작업 경험을 제공합니다. 이는 사소해 보이는 디테일이 전체적인 서비스 만족도에 큰 영향을 미칠 수 있음을 시사하는 좋은 예시입니다.

댓글 0

댓글 작성

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

아직 댓글이 없습니다

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