우리의 커뮤니티(tech enclave.com)를 XenForo에서 Discourse로 성공적으로 마이그레이션했습니다.
총 게시물 수: 250만 개
총 사용자 수: 79,000명 (활성 및 BAN된 사용자 포함)
총 개인 메시지 수: 70만 건
이 커뮤니티는 20년 된 곳이라 Proboards, Vbulletin, IPB, XenForo를 거쳐 이번에는 Discourse로 이주하는 등 여러 번의 마이그레이션을 겪었습니다.
마이그레이션 완료까지 4일이 걸렸습니다. 하지만 그 이전에는 4주간의 마이그레이션 사전 준비 작업과 4주간의 커스텀 플러그인 개발이 있었습니다.
막혀 있을 때 도움을 주고 이끌어 주신 모든 분께 감사드립니다. ![]()
전체적으로 거의 쓸모 있는 데이터 없이 매우 성공적인 마이그레이션이었습니다.
마이그레이션의 핵심은 표준 기반을 크게 개선한 강화된 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의 미래를 위한 생각거리를 제공할 수 있을 것입니다.

