React로 만드는 차세대 XE 게시판으로

React로 만드는 차세대 XE 게시판

이온디 218

들어가며: 왜 XE에 React를 도입했는가

XE/Rhymix와 함께한 지 15년이 넘었습니다. 수많은 프로젝트를 진행하며 느낀 것은, XE의 안정성과 한국형 CMS로서의 강점은 여전히 유효하지만, 프론트엔드 경험에서는 현대적인 웹 애플리케이션에 비해 아쉬움이 있다는 점이었습니다.

특히 게시판은 XE의 핵심 모듈이지만:

  • 매 페이지마다 전체 새로고침이 발생
  • 모바일에서 앱 같은 부드러운 전환 경험 부재
  • 대용량 게시물이 많을 경우 체감 속도 저하

이런 문제들을 해결하면서도 XE의 강점은 유지할 수 없을까? 그 고민의 결과가 바로 React SPA 게시판입니다.


기술 스택 선정

Backend: XE/Rhymix API Layer

```

// XE의 기존 구조를 활용한 RESTful API

class BoardAPIController extends Controller {

    public function getDocumentList() {

        $output = executeQueryArray('board.getDocumentList', $args);

        

        return new JSONResponse([

            'success' => true,

            'data' => $output->data,

            'pagination' => [

                'total' => $output->total_count,

                'page' => $args->page

            ]

        ]);

    }

}

```


선택 이유:

  • XE의 강력한 권한 시스템 그대로 활용
  • 기존 모듈/애드온과 호환성 유지
  • 검증된 데이터베이스 쿼리 재사용


```

// 가상돔 기반 초고속 렌더링

import { useState, useEffect } from 'react';


function BoardList({ moduleId }) {

    const [documents, setDocuments] = useState([]);

    const [loading, setLoading] = useState(false);

    

    const fetchDocuments = async (page = 1) => {

        setLoading(true);

        const response = await fetch(

            `/api/board/${moduleId}/documents?page=${page}`

        );

        const data = await response.json();

        setDocuments(data.data);

        setLoading(false);

    };

    

    useEffect(() => {

        fetchDocuments();

    }, []);

    

    return (

        <div className="board-list">

            {loading ? (

                <Skeleton count={10} />

            ) : (

                documents.map(doc => (

                    <DocumentRow key={doc.document_srl} data={doc} />

                ))

            )}

        </div>

    );

}

```

선택 이유:

  • Virtual DOM으로 불필요한 DOM 조작 최소화
  • Vite의 초고속 빌드 시스템
  • 풍부한 생태계와 라이브러리

핵심 구현 전략

1. 점진적 마이그레이션 (Progressive Enhancement)

기존 XE 사이트를 한 번에 바꾸는 것이 아니라, 게시판만 React로 교체하는 방식입니다.

장점:

  • 기존 스킨, 위젯, 레이아웃 그대로 사용
  • 단계적 적용으로 리스크 최소화
  • SEO를 위한 SSR은 선택적 적용

2. 상태 관리: React Query 활용

효과:

  • 자동 캐싱으로 네트워크 요청 최소화
  • 낙관적 업데이트로 즉각적인 UX
  • 백그라운드 자동 동기화

3. 라우팅: 페이지 전환 없는 네비게이션

체감 효과:

  • 클릭 즉시 화면 전환 (새로고침 없음)
  • 뒤로가기/앞으로가기 자연스럽게 동작
  • 모바일 앱과 동일한 경험

4. 성능 최적화

성능 비교: 실측 데이터

항목기존 XE 게시판React SPA 게시판
초기 로딩1.2초0.8초
페이지 전환0.9초 (전체 새로고침)0.1초 (부분 렌더링)
1000개 게시물 렌더링3.5초0.3초 (가상 스크롤)
모바일 체감 속도★★★☆☆★★★★★

측정 환경: Chrome DevTools, Regular 3G throttling

XE 권한 시스템 통합

XE의 강력한 권한 관리를 그대로 활용합니다.

실제 프로젝트 적용 사례

사례 1: 대형 커뮤니티 (회원 10만+, 게시물 50만+)

도입 전 문제점:

  • 게시판 목록 로딩에 2-3초 소요
  • 모바일 이탈률 45%
  • 서버 부하로 인한 간헐적 다운

도입 후 개선:

  • 목록 로딩 0.5초로 단축
  • 모바일 이탈률 28%로 감소
  • API 캐싱으로 서버 부하 40% 감소

사례 2: 기업 인트라넷

요구사항:

  • 엑셀 같은 빠른 데이터 입력
  • 실시간 협업 기능
  • 기존 ERP 시스템과 연동

React SPA의 이점:

  • 인라인 편집으로 즉각 반응
  • WebSocket 통합으로 실시간 동기화
  • API 기반이라 외부 시스템 연동 용이

개발 과정의 도전과 해결

도전 1: SEO 문제

문제: SPA는 검색엔진 크롤링이 어려움
해결:

  • 게시물 상세 페이지는 서버 사이드 렌더링 옵션 제공
  • 메타 태그 동적 생성
  • Sitemap 자동 생성 API

도전 2: 기존 애드온 호환성

문제: XE 애드온이 DOM 직접 조작
해결:

  • 애드온 실행 시점을 React 라이프사이클에 통합
  • useEffect에서 애드온 초기화
  • 필요시 애드온을 React 컴포넌트로 재작성

  • 도전 3: 에디터 통합


    문제: XE Editor 모듈과의 통합
    해결:
    • Editor를 React 컴포넌트로 래핑
    • 파일 업로드 API 별도 구현
    • 이미지 드래그앤드롭 지원

    • 배포 전략

      빌드 프로세스

    • [준비중]
    • 버전관리

    • [준비중]

    • 향후 로드맵

      Phase 1 (완료)

      • ✅ 기본 CRUD 기능
      • ✅ 댓글 시스템
      • ✅ 파일 첨부
      • ✅ 권한 관리

    • Phase 2 (진행중)

      • 🚧 실시간 알림 (WebSocket)
      • 🚧 마크다운 에디터 옵션
      • 🚧 다크모드 지원

    • Phase 3 (계획)

      • 📋 모바일 앱 (React Native)
      • 📋 오프라인 모드 (PWA)
      • 📋 AI 기반 내용 추천

    • 마치며

      "레거시를 버리지 않고 현대화한다"는 철학으로 시작한 이 프로젝트는, XE/Rhymix의 강력한 기반 위에 현대적인 사용자 경험을 더하는 것이 가능함을 증명했습니다.

      핵심 가치:

      1. 완전한 재작성보다 점진적 개선이 현실적
      2. API 레이어 분리로 프론트/백엔드 독립성 확보
      3. 사용자 경험 개선이 곧 비즈니스 가치
    • 25년간 쌓아온 XE 경험과 최신 React 기술의 만남. 이것이 제가 만든 "현존하는 가장 빠른 XE"의 비밀입니다.