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

**URL:** https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245
**Category:** Migration
**Created:** [7월 15, 2025, 5:48오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245 "2025-07-15T05:48:02Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [7월 15, 2025, 5:48오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/1 "2025-07-15T05:48:02Z")

</div>

우리의 커뮤니티(tech [enclave.com](http://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의 미래를 위한 생각거리를 제공할 수 있을 것입니다.

---

<div class="post-metadata">

### Author: ![schneeland](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/schneeland/32/275391_2.png) [@schneeland](https://meta.discourse.org/u/schneeland)
#### Post date: [7월 15, 2025, 7:21오후 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/2 "2025-07-15T19:21:24Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [7월 16, 2025, 8:04오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/3 "2025-07-16T08:04:20Z")

</div>

> **[GitHub - rahul-rakesh/xenforo-migration-scripts](https://github.com/rahul-rakesh/xenforo-migration-scripts)**
>
> Contribute to rahul-rakesh/xenforo-migration-scripts development by creating an account on GitHub.

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

---

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [7월 16, 2025, 12:09오후 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/4 "2025-07-16T12:09:26Z")

</div>

> [@schneeland](#):
>
> 올바로운 새 링크를 보장하기 위한 2단계 가져오기.

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

---

<div class="post-metadata">

### Author: ![schneeland](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/schneeland/32/275391_2.png) [@schneeland](https://meta.discourse.org/u/schneeland)
#### Post date: [7월 16, 2025, 5:36오후 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/5 "2025-07-16T17:36:32Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![cocococosti](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cocococosti/32/231474_2.png) [@cocococosti](https://meta.discourse.org/u/cocococosti)
#### Post date: [7월 16, 2025, 11:35오후 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/6 "2025-07-16T23:35:17Z")

</div>

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

> [@SubStrider](#):
>
> 마이그레이션 후 많은 사용자들이 만족하지 못했습니다.

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

이 글의 마지막 섹션을 참고해 보세요. 몇 가지 팁을 얻을 수 있을 겁니다: [How to prepare your community for a Discourse migration](https://blog.discourse.org/2025/06/how-to-prepare-your-community-for-a-discourse-migration/)

---

<div class="post-metadata">

### Author: ![bhegnauer](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bhegnauer/32/512624_2.png) [@bhegnauer](https://meta.discourse.org/u/bhegnauer)
#### Post date: [7월 19, 2025, 5:24오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/7 "2025-07-19T05:24:54Z")

</div>

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

---

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [9월 23, 2025, 6:58오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/8 "2025-09-23T06:58:51Z")

</div>

> [@SubStrider](#):
>
> 그럼에도 불구하고, 이 주제에서 나중에 피드백 요약을 공유할 것입니다. 디스코스의 미래에 반영할 만한 통찰을 얻을 수 있을지도 모릅니다.

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

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

* * *

### 요약

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

* * *

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

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

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

- **실행 가능한 통찰:**

* * *

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

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

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

- **실행 가능한 통찰:**

* * *

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

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

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

- **실행 가능한 통찰:**

* * *

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

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

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

- **실행 가능한 통찰:**

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [9월 23, 2025, 7:06오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/9 "2025-09-23T07:06:01Z")

</div>

> [@SubStrider](#):
>
> 다른 포럼 플랫폼처럼 Discourse에도 유료 테마 마켓플레이스가 있으면 좋겠습니다.

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

---

<div class="post-metadata">

### Author: ![Bas](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bas/32/294929_2.png) [@Bas](https://meta.discourse.org/u/Bas)
#### Post date: [9월 23, 2025, 7:11오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/10 "2025-09-23T07:11:50Z")

</div>

> [@SubStrider](#):
>
> **콘텐츠 탐색성 부족:** 사용자가 제공된 명확한 계층 구조 개요와 섹션 내 최신 활동을 보여주던 기존 카테고리 페이지를 그리워합니다. 새로운 레이아웃은 "어수선한 혼합"으로 인식되고 있습니다.

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

> [@SubStrider](#):
>
> **인용 기능 오류:** 텍스트 인용 과정이 어렵고 불안정하다고 평가받으며, 특히 모바일과 태블릿에서는 네이티브 UI에 의해 인용 팝업이 가려지는 문제가 있습니다.

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

> [@SubStrider](#):
>
> **과도한 여백:** 이는 가장 많이 지적된 디자인 결함입니다. 대형 데스크톱 모니터를 사용하는 사용자는 좁은 중앙 열이 상당한 화면 공간을 낭비하고 정보 밀도를 낮춘다고 느낍니다.

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

> [@SubStrider](#):
>
> **가독성 저하:** 여백, 글꼴 크기, 그리고 게시물 간의 명확한 구분 부재가 이전 소프트웨어와 비교할 때 콘텐츠를 빠르게 훑어보고 읽는 것을 어렵게 만듭니다.

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

> [@SubStrider](#):
>
> - **부정적 인식 / 사용량 감소:** 이는 핵심 지표입니다. 여러 사용자가 이제 포럼을 덜 방문한다고 명시적으로 언급하고 있습니다.
> - **긍정적 인식:** 현대적인 느낌, 속도, 알림 시스템 및 마크다운 편집기 같은 기능을 좋아하는 소수이지만 주목할 만한 그룹이 있습니다.
> - **적응형 사용자:** 이 그룹은 기존 포럼을 그리워하지만, 마이그레이션의 기술적 이유를 이해하며 적응할 의사가 있습니다.

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

---

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [9월 23, 2025, 8:11오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/11 "2025-09-23T08:11:02Z")

</div>

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

---

<div class="post-metadata">

### Author: ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)
#### Post date: [9월 23, 2025, 8:32오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/12 "2025-09-23T08:32:29Z")

</div>

> [@Bas](#):
>
> 사용자 테마로 해결 가능합니다 🙂 이 테마 구성 요소를 사용자가 선택할 수 있는 테마에 추가하는 것을 고려해 보세요.

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

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

 ![Screenshot 2025-09-23 at 1.56.56 PM](https://global.discourse-cdn.com/meta/original/4X/0/4/2/04208ebbbbecf385addc7e619a3ad332a8dc99b9.jpeg)

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

 ![Screenshot 2025-09-23 at 1.57.31 PM](https://global.discourse-cdn.com/meta/original/4X/c/7/2/c72f075758cf98c30253acab8d5a53c8658c7c49.jpeg)

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

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

---

<div class="post-metadata">

### Author: ![sniper756](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sniper756/32/545002_2.png) [@sniper756](https://meta.discourse.org/u/sniper756)
#### Post date: [12월 7, 2025, 8:08오전 UTC](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/13 "2025-12-07T08:08:33Z")

</div>

[XenForo에서 Discourse로 마이그레이션: 마이그레이션 개요](https://meta.discourse.org/t/migrated-from-xenforo-to-discourse-overview-of-the-migration/374245/3)에서 이어서 논의합니다:

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