XenForo에서 Discourse로 마이그레이션: 마이그레이션 개요

우리의 커뮤니티(tech enclave.com)를 XenForo에서 Discourse로 성공적으로 마이그레이션했습니다.

총 게시물 수: 250만 개
총 사용자 수: 79,000명 (활성 및 BAN된 사용자 포함)
총 개인 메시지 수: 70만 건

이 커뮤니티는 20년 된 곳이라 Proboards, Vbulletin, IPB, XenForo를 거쳐 이번에는 Discourse로 이주하는 등 여러 번의 마이그레이션을 겪었습니다.

마이그레이션 완료까지 4일이 걸렸습니다. 하지만 그 이전에는 4주간의 마이그레이션 사전 준비 작업과 4주간의 커스텀 플러그인 개발이 있었습니다.

막혀 있을 때 도움을 주고 이끌어 주신 모든 분께 감사드립니다. :folded_hands:
전체적으로 거의 쓸모 있는 데이터 없이 매우 성공적인 마이그레이션이었습니다.


마이그레이션의 핵심은 표준 기반을 크게 개선한 강화된 XenForo 가져오기(import) 스크립트 위에 구축되었습니다. 또한 특정 데이터 변환을 처리하고 가져오기 후 데이터 무결성을 보장하기 위해 여러 가지 전문적인 지원 스크립트를 활용했습니다.

XenForo 메인 가져오기 스크립트의 주요 개선 사항

성능 최적화 (Keyset 페이지네이션): 가장 중요한 개선 사항은 keyset 페이지네이션(WHERE id > last_id)의 도입입니다. 이 방법은 인덱싱된 기본 키를 사용하여 다음 레코드 집합을 가져오므로, 특히 대규모 데이터셋에서 전통적인 OFFSET 쿼리에 비해 배치 처리 속도를 극적으로 향상시킵니다.

강력한 체크포인팅 및 재개: 사용자, 토픽, 답변, 개인 메시지에 대해 고급 체크포인팅 로직(.json 파일 사용)을 구현했습니다. 이를 통해 중단(예: 서버 재시작, 스크립트 오류) 후에도 마지막으로 성공적으로 가져온 레코드부터 안전하게 가져오기 프로세스를 재개할 수 있어 상당한 시간을 절약할 수 있습니다.

2단계 게시물 가져오기 전략: 게시물은 이제 두 가지 명확한 단계를 거쳐 가져오게 되었습니다:

먼저 토픽: 모든 XenForo 원본 스레드(첫 번째 게시물)를 가져와 답변보다 부모 토픽이 먼저 존재하도록 보장합니다.

다음 답변: 스레드 내의 후속 게시물들을 가져와서 새로 생성된 Discourse 토픽에 올바르게 연결합니다. 이 구조화된 접근 방식은 고아(orphaned) 답변을 최소화하고 데이터 일관성을 향상시킵니다.

포괄적인 리액션/좋아요 가져오기:

스크립트는 이제 XenForo 리액션 중 Discourse의 핵심 “좋아요”(하트)에 직접 매핑되는 것과 커스텀 리액션을 지능적으로 구분합니다.

핵심 좋아요(post_actions 테이블로)와 커스텀 리액션(discourse-reactions 플러그인 활용) 모두의 일괄 삽입을 지원하여 프로세스를 크게 가속화합니다.

XenForo 이모지 숏네임에서 Discourse 대응 이모지로의 매핑을 포함합니다(예: thumbsup은 +1, heart_eyes는 heart로).

풍부한 마켓플레이스 데이터 가져오기 (커스텀 플러그인):

XenForo의 thread_field_value 테이블에서 상세한 마켓플레이스 리스팅 데이터(예: 가격, 위치, 상태, 보증, 결제 옵션)를 가져오기 위해 전용 섹션을 추가했습니다.

이 데이터는 커스텀 TecencMarket::Listing 모델과 토픽 커스텀 필드로 저장되어 Discourse에서 더 풍부한 표시와 기능을 가능하게 합니다.

마켓플레이스 피드백 가져오기 (커스텀 플러그인):

마켓플레이스 거래와 관련된 사용자 피드백/평점(좋아요/싫어요)을 마이그레이션하기 위한 새로운 기능이 도입되었습니다.

스레드 접두사(Topic Prefix)에서 태그로 변환: 스크립트는 이제 XenForo의 스레드 접두사를 자동으로 Discourse 태그로 변환합니다. 이는 discourse-tagging 플러그인을 사용하여 콘텐츠 조직화와 검색 가능성을 유지하는 데 필수적입니다. 또한 XenForo의 프레이즈 테이블을 사용하여 접두사 ID를 사람이 읽을 수 있는 제목으로 올바르게 매핑합니다.

향상된 게시물 콘텐츠 처리: 이 메서드는 더 나은 마크다운 변환과 XenForo의 복잡한 BBCode 처리를 위해 상당한 업데이트를 받았습니다:

개선된 인용 처리: XenForo의 [QUOTE] 태그 변환을 처리하며, 가능할 경우 인용된 사용자와 특정 Discourse 게시물/토픽으로의 링크를 포함합니다.

수정된 미디어 임베드: 가져온 모든 미디어(YouTube, Twitter/X)가 Discourse의 원박스/임베딩 기능을 활성화하기 위해 별도의 줄에 위치하도록 보장하고, 오래된 BBCode [MEDIA] 태그를 표준 URL로 변환합니다.

테이블 변환: XenForo의 [TABLE] BBCode를 마크다운 테이블로 변환합니다.

첨부파일 처리 (인라인 및 추가): 첨부파일 처리 로직이 재구성되었습니다. 이제 업로드된 파일에 대한 올바른 마크다운으로 [ATTACH] 태그를 대체하려고 시도합니다. 특히, 게시물 콘텐츠에 명시적으로 [ATTACH] 태그가 지정되지 않은 첨부파일은 이제 “첨부파일:” 헤더 아래에 게시물 끝에 추가되어 파일이 유실되지 않도록 보장합니다.

이모지/스마일리 변환: XenForo 스마일리를 네이티브 Discourse 이모지로 매핑하는 범위를 확장하여 시각적 일관성을 향상시켰습니다.

일반 BBCode 정리: 다양한 BBCode 태그(예: [B], [I], [URL], [IMG], [LIST], [CODE], [COLOR], [FONT], [SIZE], [INDENT], [USER])의 제거와 변환을 더 포괄적으로 수행합니다.

인코딩 및 스크러빙: 잘못된 UTF-8 시퀀스에 대한 .scrub!과 올바른 HTML 엔티티 디코딩을 위한 CGI.unescapeHTML을 포함합니다.

정지된 사용자 처리: BAN된 XenForo 사용자는 이제 계정 보유 상태이지만 활동이 제한된 정지된 Discourse 사용자로 가져오며, BAN 이유는 커스텀 필드에 보존됩니다.

북마크 가져오기: XenForo의 모든 북마크를 Discourse로 가져옵니다. 처음부터 많지는 않았습니다.


마이그레이션 후 많은 사용자가 불만을 표했습니다. 이는 예상된 일입니다. 마이그레이션 후 여러분도 이전에 여러 번 들어보셨을 것입니다. 그럼에도 불구하고, 이 토픽에서 나중에 피드백 요약을 공유할 예정입니다. Discourse의 미래를 위한 생각거리를 제공할 수 있을 것입니다.

공유해 주셔서 감사합니다! 목록에 SMF에서 Discourse로 이관하는 진행 중인 프로젝트의 작업 항목으로 제가 파악한 내용들이 많이 있네요 :slightly_smiling_face:

커스터마이징한 가져오기(importer) 코드가 공개되어 있나요? 특히 두 단계 가져오기를 통해 올바른 새 링크를 확보하는 방식을 어떻게 처리했는지 특히 궁금합니다.

제가 사용한 가져오기 스크립트를 참고할 수 있습니다. 확인하고 싶은 파일은 다음과 같습니다:
xenforo_import_enhanced.rb

2단계를 진행해야 했던 이유는 시간이 지남에 따라 구版主의(구 토픽)가 새 토픽에 병합되는 경우가 항상 있기 때문입니다. 하지만 게시글은 여전히 구版主의 ID를 가지고 있어 먼저 선택됩니다. 이때까지 해당 구版主의가 가져와지지 않았다면, 모든 게시글이 삭제되어 손실됩니다.

정말 감사합니다! 확인해 보겠습니다.

이 기능에 대한 배경 사상에 대한 추가 설명도 정말 감사드립니다. 다행히 우리도 그런 문제에 부딪히지는 않았습니다. 2단계 가져오기를 생각했던 주된 이유는 인용문 안의 하이퍼링크가 여전히 구 URL을 사용하고 있기 때문입니다. 영구 링크도 작동할 수는 있겠지만, 새 포스트 URL을 바로 사용하는 것이 더 나을 것 같다고 생각합니다.

와! 축하해요! 그리고 공유해 주셔서 감사합니다.

예상된 일이죠. 이제 그들의 피드백을 어떻게 다루는지가 중요합니다. 그들의 의견을 다루고, 그들이 충분히 heard(경청)되고 있다고 느끼게 하세요. 또한 개선된 점과 새로운 기능(많은 것이 있을 거예요!)을 강조해 주세요. 피드백 처리에 어려움이 있다면 여기에 올려 주세요. 기꺼이 도와드리겠습니다.

이 글의 마지막 섹션을 참고해 보세요. 몇 가지 팁을 얻을 수 있을 겁니다: How to prepare your community for a Discourse migration

기본 스톡 가져오기로 네 번 실패한 끝에, 여러분의 버전이 완벽하게 작동했습니다.

약속대로 이 요약을 공유합니다. 지난 3개월간 수집된 모든 피드백을 Gemini 2.5 Pro를 사용하여 요약했습니다.

가장 큰 우려 사항은 좋은 테마의 부재라고 생각합니다. 다른 포럼 플랫폼처럼 디스코스에 유료 테마 마켓플레이스가 있다면 좋겠습니다.


요약

디스코스로의 마이그레이션에 대한 피드백은 크게 나뉘어 있지만, 목소리를 내는 다수의 사용자들이 상당한 좌절감을 표현하고 있으며 이로 인해 참여도가 감소하고 있습니다. 가장 중요한 문제는 내비게이션 및 사용성UI 및 디자인에 집중되어 있으며, 이는 특히 전통적인 포럼 레이아웃에 익숙한 데스크톱 사용자에게 해당됩니다. 일부 사용자는 현대적인 외관과 기술적 개선을 칭찬하지만, 비판자들의 공통된 의견은 이 플랫폼이 기능보다 형식을 우선시하여 인지 부하를 높이고 직관적이지 않은 경험을 만들고 있다는 것입니다.


1. 내비게이션 및 사용성 (최상위 우선순위)

이 카테고리는 가장 빈번하고 상세한 부정적 피드백을 받았습니다. 사용자는 새로운 플랫폼이 근본적으로 사용하기 어렵다고 느끼며, 이는 참여도 감소의 직접적인 원인입니다.

  • 주요 피드백 포인트 및 비중:

    • 무한 스크롤 비인기: 가장 강한 공감대는 무한 스크롤에 대한 불만입니다. 특히 데스크톱 환경에서입니다. 사용자는 긴 스레드를 탐색할 때 페이지 번호가 제공하는 맥락과 제어력을 그리워합니다.
    • 일반적으로 탐색이 어려움: 상당수의 사용자가 플랫폼을 혼란스럽고, 어지럽고, 지루하며, 포럼을 위해 투자하고 싶지 않은 가파른 학습 곡선을 가진다고 설명합니다.
    • 마지막/안 읽은 게시글 찾기 어려움: 스레드의 마지막 게시글로 직관적으로 이동하거나 특정 지점부터 읽기를 재개하는 것이 불가능하다는 점이 공통적인 어려움입니다. 사용자는 직관적이지 않은 우회 방법을 배워야 합니다.
    • 콘텐츠 발견 기능 부족: 포럼 구조와 섹션 내 최신 활동을 명확하고 계층적으로 보여줬던 구버전의 카테고리 페이지를 그리워합니다. 새로운 레이아웃은 "잡다한 혼합물"로 인식됩니다.
    • 인용 기능 오류: 텍스트 인용 과정은 특히 모바일과 태블릿에서 어려우며 불안정하다고 설명됩니다. 여기서 인용 팝업이 네이티브 UI에 가려질 수 있습니다.
  • 실행 가능한 통찰:

    • “전통적인 포럼” 경험 우선시: 핵심 문제는 예상되는 포럼 모델에서 벗어난 것입니다. 특히 카테고리 페이지를 위해 페이지네이션이 적용되고 더 구조화된 뷰를 모방하는 테마나 레이아웃은 가장 큰 불만 사항을 해결할 것입니다.
    • 내비게이션 힌트 개선: 첫 번째, 마지막, 마지막 안 읽은 게시글로 이동하는 것을 명확하고 원클릭 동작으로 만들어야 합니다. 현재 스크롤바 기능은 많은 사용자에게 직관적이지 않습니다. 스레드 상단과 하단에 명시적인 버튼을 추가하는 것을 고려하십시오.
    • 기본 인용 동작 재평가: 인용할 텍스트를 수동으로 선택해야 하는 것은 주요 마찰 요인입니다. 전체 게시글 인용을 기본 원클릭 동작으로 만드는 플러그인이나 설정을 조사하십시오.

2. UI 및 디자인 (높은 우선순위)

사용자는 현재 디자인이 공간을 낭비하고 가독성을 해친다고 느끼며, 이는 콘텐츠 소비 능력과 욕구에 직접적인 영향을 미칩니다.

  • 주요 피드백 포인트 및 비중:

    • 과도한 여백: 이는 가장 많이 언급된 디자인 결함입니다. 대형 데스크톱 모니터를 사용하는 사용자는 좁은 중앙 컬럼이 상당한 화면 공간을 낭비하고 정보 밀도를 낮춘다고 느낍니다.
    • 커스터마이징 욕구: 사용자는 사용자 정의 CSS, 다른 테마(Horizon 대신 Default), 더 작은 글꼴 크기 등을 통해 경험을 개선할 방법을 적극적으로 찾고 있습니다. 이는 외관에 대한 사용자 수준 제어에 대한 강한 욕구를 나타냅니다.
    • 가독성 저하: 여백, 글꼴 크기, 게시글 간 명확한 분리 부재의 조합으로 인해 이전 소프트웨어보다 콘텐츠를 스캔하고 읽기가 더 어려워졌습니다.
  • 실행 가능한 통찰:

    • “컴팩트” 또는 “풀-위드” 테마 개발: 화면 폭의 더 많은 부분을 활용하는 공식 테마를 제공하여 여백에 대한 불만을 직접적으로 해결하십시오. 이는 커스터마이징 욕구도 충족시키며, 사용자가 스스로 구현하는 가장 일반적인 우회 방법입니다.
    • 시각적 구분선 개선: 게시글 간의 시각적 구분을 강화하십시오. 테두리, 교대 배경색, 또는 다른 사용자 정보 블록 레이아웃과 같은 미묘한 변경은 가독성을 크게 향상시키고 “채팅 앱 같은” 느낌을 줄일 수 있습니다.
    • 글꼴 크기 및 위계 구조 검토: 특히 하위 카테고리 텍스트와 게시글 콘텐츠에 대해 더 일관되고 정보 밀도가 높은 위계 구조를 보장하기 위해 테마의 타이포그래피를 검토하십시오.

3. 전반적인 감정 및 사용자 참여 (높은 영향)

피드백의 상당 부분이 사용자 활동에 직접적인 부정적 영향을 미치고 있음을 나타냅니다. 일부는 변화에 대한 저항이지만, 불만의 일관성은 더 깊은 문제를 시사합니다.

  • 주요 피드백 포인트 및 비중:

    • 부정적 감정 / 사용량 감소: 이는 중요한 지표입니다. 여러 사용자가 이제 포럼을 덜 자주 방문한다고 명시적으로 언급합니다.
    • 긍정적 감정: 작지만 주목할 만한 그룹은 현대적인 느낌, 속도, 알림 시스템 및 마크다운 에디터와 같은 기능을 즐깁니다.
    • 적응형 사용자: 이 그룹은 구버전 포럼을 그리워하지만 마이그레이션의 기술적 이유를 이해하고 적응할 의향이 있습니다.
  • 실행 가능한 통찰:

    • 인정과 소통: 사용자 피드백을 공개적으로 인정하고 UI/UX 개선에 대한 명확한 로드맵을 소통하십시오. 이는 현재 좌절감을 느끼고 있지만 적응할 의향이 있는 사용자를 유지하는 데 도움이 될 수 있습니다.
    • “라이프 퀄리티” 수정 우선시: 먼저 저비용, 고영향 변경 사항에 초점을 맞추십시오(예: 한 사용자가 제안한 대로 구버전 테마와 일치하도록 카테고리 색상을 변경). 이는 피드백이 듣고 실행되고 있음을 보여줍니다.
    • “시작하기” 가이드 작성: 일부 사용자는 가이드 읽기를 거부하지만, 가장 혼란스러운 변경 사항 5가지(스레드 탐색 및 인용 등)를 빠르게 설명하는 고정된 주제(토론)는 많은 사용자의 전환을 용이하게 할 수 있습니다.

4. 핵심 기능 및 성능 (중간 우선순위)

UI/UX만큼 자주 언급되지는 않지만, 이 문제들은 포럼의 핵심 목적에 영향을 미칩니다.

  • 주요 피드백 포인트 및 비중:

    • 채팅 앱 같은 느낌: 디자인은 긴 구조화된 토론보다는 짧고 반응적인 답변을 장려하여 포럼보다는 채팅 앱처럼 느끼게 만듭니다.
    • 검색 품질 저하: 사용자는 검색이 주제 제목의 결과를 효과적으로 우선순위에 두지 않아 알려진 스레드를 찾기 어렵다고 보고합니다.
    • 성능 문제: 한 사용자는 긴 스레드에서 텍스트 에디터가 지연되고 노트북이 뜨거워진다고 언급했습니다.
  • 실행 가능한 통찰:

    • 검색 관련성 조정: 검색 결과에서 주제 제목을 더 중시할 수 있는 디스코스 설정이나 플러그인을 조사하십시오. 관리자의 고급 문법 사용 제안은 우회 방법이지, 기본 검색 동작에 대한 해결책이 아닙니다.
    • 긴 스레드 성능 모니터링: 수천 개의 답변이 있는 스레드에서 에디터 및 스크롤링의 성능에 주의를 기울여 잠재적인 클라이언트 측 병목 현상을 해결하십시오.
    • AI 검색 활성화: 관리자가 제안한 대로 AI 기반 검색을 활성화하는 것이 검색 관련성 문제의 장기적 해결책이 될 수 있지만, 잠재적 비용과 대비하여 평가해야 합니다.

Marketplace 채널은 어떨까요? 다만 결과는 보통 비공개입니다.

이러한 사용자를 위해 카테고리 개요를 명시적으로 강조하는 방법을 고려해 보시기 바랍니다. 아니면 사용자가 더 선호하는 형태로 해당 개요를 전환하는 것도 좋습니다. 이는 사용자를 참여시키는 기회이기도 합니다.
Desktop category page style의 다양한 설정이 어떤 모습으로 보일지 스크린샷을 공유하고, 사용자가 가장 좋아하는 스타일을 물어보는 것은 어떨까요?

이 부분은 명시적으로 피드백을 받고 싶은 내용입니다. Meta에서 이 문제를 보고해 달라고 요청해 보시는 것은 어떨까요?

이것은 사용자 테마로 해결할 수 있습니다 :slight_smile: 이 테마 구성 요소를 사용자가 선택할 수 있는 테마에 추가해 보세요: GitHub - discourse/discourse-full-width-component: Make Discourse occupy the full browser width · GitHub

"게시물 간의 명확한 구분"이라는 표현을 이해하지 못하겠습니다?

변화는 항상 어렵고, 사람들은 항상 불평할 것입니다. “부정적” 그룹이 충분히 작다면, 지금은 그들을 무시하고 적응형 사용자에게 집중해도 안전하다고 생각합니다. 그들의 경험을 훌륭하게 만들어 주면 부정적인 사용자들도 따라오거나(또는 떠날 것입니다).

테마 마켓플레이스를 사용하면 비용이 여러 구매자 사이에 분산됩니다. 테마 제작자도 다양한 테마를 만들도록 동기가 부여됩니다.

이 구성 요소는 실제로 전체 폭을 지원하지 않습니다. 레이아웃을 왼쪽으로 몰아넣을 뿐, 확장되지는 않습니다. 확장이 되는 커스텀 테마를 하나 구현해 두었지만, 모든 테마에서 가능했으면 좋겠습니다.

Horizon에서 전체 폭 구성 요소 사용 시

Foundation 기반의 커스텀 테마 사용 시

말씀하신 대로, 변경은 어렵고 많은 사용자가 이미 적응해 놓은 상태라 일부 사용자에게는 여전히 어려울 수 있습니다. 모두를 만족시키기란 쉽지 않죠. 전체적인 경험을 공유해 보고자 했습니다.

모바일/태블릿에서의 인용(quotation) 문제와 관련하여 더 자세한 내용을 공유하겠습니다.

XenForo에서 Discourse로 마이그레이션: 마이그레이션 개요에서 이어서 논의합니다:

감사합니다. 제공해 주신 확장된 가져오기 스크립트를 사용하여 XenForo 마이그레이션을 성공적으로 완료했습니다. - 2025.12.07