본문으로 건너뛰기
피드

포럼 소프트웨어에서 React 걷어내고 HTMX로 돌아가려는 이유

frontend 약 7분
vote
0
댓글
북마크

Misago 프로젝트가 React.js 기반 UI 구조를 걷어내고 Django 서버 렌더링과 HTMX 조합으로 단순화하려는 이유를 설명한 글이다. 같은 화면을 Django 템플릿과 React 컴포넌트로 두 번 구현하는 문제, 중복 번역 파일, JSON 직렬화 비용, 플러그인 개발 복잡도까지 꽤 현실적인 고통이 나온다. 결론은 포럼처럼 상호작용이 특정 영역에 몰린 서비스라면 풀 React 앱보다 서버 렌더링 HTML 조각 교체가 더 맞을 수 있다는 얘기다.

  • 1

    Misago는 현재 Django가 HTML을 렌더링한 뒤 React가 같은 데이터를 다시 읽어 화면 대부분을 교체하는 구조를 쓰고 있다.

  • 2

    이 구조 때문에 템플릿, 라우트, API, 직렬화, 번역 파일, 플러그인 확장 지점이 중복된다.

  • 3

    작성자는 포럼 UI의 상호작용은 대부분 고립된 영역에서 일어나므로 HTMX로 서버 렌더링 HTML 조각만 교체하는 쪽이 더 단순하다고 본다.

  • Misago가 지금 겪는 문제는 “React를 썼다”가 아니라 “같은 화면을 서버와 클라이언트에서 두 번 만들고 있다”는 데 있음

    • 사용자가 misago-project.org에 접속하면 Django view가 스레드 목록 데이터를 모아서 템플릿으로 거의 완성된 HTML을 렌더링함
    • 그런데 그 HTML 안에 같은 데이터를 담은 JSON도 같이 박아두고, 자바스크립트가 내려온 뒤 React.js가 그 JSON을 읽어서 Django가 만든 HTML 대부분을 다시 갈아엎음
    • 결과적으로 버튼이 활성화되고 타임스탬프가 바뀌긴 하는데, 그 과정이 좀 많이 돌아가는 구조임
  • 이 방식의 제일 큰 비용은 중복 구현임

    • Misago의 많은 페이지가 Django 템플릿과 React.js 컴포넌트로 각각 구현돼 있음
    • HTML을 커스터마이징하려는 사람은 Django 템플릿만 고쳤다가, 화면에 잠깐 보인 뒤 React HTML로 교체되는 걸 보고 당황하게 됨
    • 게스트와 로그인 사용자 모두 접근하는 view는 Django view와 템플릿, React route와 컴포넌트, API, JSON serializer까지 같이 필요해짐
  • 성능과 운영 비용도 같이 따라옴

    • React 앱을 위해 데이터를 미리 JSON으로 직렬화하는 과정이 응답 생성 속도를 늦춤
    • 번역 메시지도 django.podjangojs.po에 나뉘어 중복되고, 자바스크립트 번역 파일은 초기 다운로드 크기를 키움
    • 오래되거나 느린 모바일 기기에서는 많은 자바스크립트 자체가 성능을 깎아먹을 수 있음

중요

> 이 글의 핵심은 “포럼 UI에 풀 클라이언트 앱이 꼭 필요한가?”라는 질문임. 스레드 목록, 모더레이션, 알림, 투표처럼 상호작용이 특정 영역에 고립돼 있다면 전체 페이지를 React로 다시 장악할 이유가 약해짐.

  • 플러그인 생태계까지 생각하면 복잡도는 더 커짐

    • 플러그인이 페이지에 HTML을 주입하거나 교체하려면 Django 템플릿뿐 아니라 React 컴포넌트도 구현해야 함
    • misago-docker에는 사이트 빌드 과정에 자바스크립트 빌드 단계까지 들어가야 함
    • 플러그인 개발자도 Django와 React 양쪽을 알아야 하니 진입장벽이 올라감
  • 작성자는 대안으로 두 가지를 검토했지만, 결국 더 단순한 방향을 택하려는 분위기임

    • 하나는 Django view와 템플릿을 거의 버리고 API 중심으로 간 뒤 UI를 React 앱으로 만드는 것
    • 다른 하나는 Django를 API로 줄이고 Next.js나 Remix.run 같은 서버 사이드 렌더링 프레임워크를 쓰는 것
    • 하지만 포럼 소프트웨어는 오래전부터 서버에서 최대한 렌더링하고 필요한 곳에만 자바스크립트를 얹는 방식으로 잘 돌아왔다는 게 작성자의 판단임
  • 그래서 나온 선택지가 HTMX임

    • HTMX는 HTML 일부를 “동적 섬”처럼 지정하고, 사용자 상호작용이 생기면 서버가 렌더링한 새 HTML 조각으로 그 부분만 교체하게 해줌
    • 예를 들어 스레드 목록에서 카테고리를 바꾸면 페이지 전체가 아니라 선택된 카테고리의 스레드 목록 HTML만 Django에서 받아와 갈아끼울 수 있음
    • 이때 네비게이션 바에 이미 로드된 검색 결과 같은 다른 HTMX 영역은 그대로 유지할 수 있음
  • 구현 관점에서도 백엔드 변경 폭이 줄어듦

    • Django는 일반 요청이면 전체 페이지 HTML을 반환하고, HTMX 요청이면 해당 섬에 들어갈 HTML 조각만 반환하면 됨
    • 별도 JSON 직렬화, 전용 API, React 컴포넌트, 클라이언트 라우팅을 매번 만들 필요가 줄어듦
    • 작성자는 이걸 20년 전 jQuery의 $.get("url", "#outlet")이나 Rails Turbolinks에 가까운 선언적 방식이라고 표현함

ℹ️참고

> 작성자가 말하는 결론은 꽤 현실적임. 끝없는 스크롤이나 앱 같은 전환감이 꼭 필요한 게 아니라면, 포럼 소프트웨어에는 “서버가 HTML을 만들고 필요한 부분만 바꾸는 방식”이 오히려 더 잘 맞을 수 있다는 것.


기술 맥락

  • 여기서의 기술 선택은 React.js 중심 구조에서 Django 서버 렌더링과 HTMX 조합으로 무게중심을 옮기는 거예요. 왜냐하면 Misago는 이미 Django가 거의 완성된 HTML을 만들고 있는데, React가 같은 데이터를 다시 읽어서 화면을 교체하면서 중복 비용이 커졌거든요.

  • 대안이 없었던 건 아니에요. 작성자는 아예 API 중심으로 가고 React 앱을 키우는 방법, 혹은 Next.js나 Remix.run 같은 서버 사이드 렌더링 프레임워크를 붙이는 방법도 봤어요. 그런데 포럼 소프트웨어의 상호작용은 모더레이션, 알림, 투표, 답글 작성처럼 특정 영역에 몰려 있어서 전체 앱 구조를 바꾸는 선택이 과하다고 본 거예요.

  • HTMX가 맞아 보이는 이유는 구현 단위가 페이지 전체가 아니라 HTML 조각이기 때문이에요. Django view가 일반 요청에는 전체 HTML을 주고, HTMX 요청에는 스레드 목록 같은 일부 HTML만 주면 되니까 JSON serializer와 별도 React route를 계속 만들 필요가 줄어들어요.

  • 이 결정은 프론트엔드 취향 문제가 아니라 확장 구조 문제에 가까워요. 플러그인이 HTML을 바꾸려면 Django 템플릿과 React 컴포넌트를 둘 다 알아야 하는 상황이었고, 이건 오픈소스 포럼 소프트웨어 입장에선 꽤 큰 유지보수 비용이에요.

이 글의 포인트는 React가 나쁘다는 얘기가 아니라, 서버 중심 앱에 SPA 구조를 얹었을 때 생기는 중복 비용이 생각보다 빨리 커진다는 데 있다. 특히 커스터마이징과 플러그인을 열어둔 오픈소스라면 프론트엔드 선택이 유지보수 정책이 돼버린다.

댓글

댓글

댓글을 불러오는 중...

frontend

UI 컴포넌트 이름 헷갈릴 때, 동작 계약까지 뽑아주는 퀴즈형 도구

NameThatUI는 웹 UI 요소의 이름을 맞히는 데서 끝나지 않고, 비슷한 UI 패턴을 비교한 뒤 구현 가능한 동작 명세로 정리해주는 도구다. Tooltip, Popover, Hover Card처럼 생긴 건 비슷하지만 접근성, 포커스, 닫힘 규칙이 다른 패턴을 구분하는 데 초점을 둔다. 코딩 에이전트나 컴포넌트 라이브러리에 잘못된 이름을 던져서 엉뚱한 구현이 나오는 문제를 줄이려는 접근이다.

frontend

타입스크립트 7.0, Go 네이티브 포팅으로 빌드가 8~12배 빨라졌다

마이크로소프트가 타입스크립트 7.0을 출시하면서 기존 자바스크립트 기반 구현을 Go로 네이티브 포팅했다. 전체 빌드는 평균 8~12배 빨라졌고, VS코드 빌드는 125.7초에서 10.6초로 줄었으며, 슬랙은 CI 타입 검사 시간을 7.5분에서 1.25분으로 낮췄다.

frontend

타입스크립트 7 공개, 고 포팅으로 빌드가 최대 10배 이상 빨라짐

마이크로소프트가 고(Go)로 네이티브 포팅한 타입스크립트 7을 공개했다. 전체 빌드는 보통 8~12배 빨라지고, VS 코드 코드베이스에서는 125.7초가 10.6초로 줄었으며, 편집기 첫 오류 표시도 17.5초에서 1.3초 미만으로 내려갔다.

frontend

“98% 지원”이 생각보다 별로 안 넉넉한 이유

브라우저 기능 지원률 98%는 얼핏 높아 보이지만, 실제 서비스에서는 2%의 사용자를 깨진 화면 앞에 세우는 숫자일 수 있다는 글이다. 특히 일반 통계와 내 서비스 방문자 분포는 다를 수 있고, 실제 사례로 어떤 사이트는 최신 중첩 CSS 기능 지원 브라우저가 방문자의 약 70%뿐이었다.

frontend

메타, AI가 읽고 쓰는 디자인 시스템 ‘Astryx’ 오픈소스로 공개

메타가 내부 디자인 시스템 Astryx를 오픈소스로 공개했다. React와 StyleX 기반의 150개 이상 접근성 지원 컴포넌트, 디자인 토큰, 테마, 템플릿, CLI를 제공하며, 특히 AI 에이전트가 컴포넌트 구조를 이해하고 UI를 생성·수정할 수 있도록 MCP 서버까지 포함한 점이 핵심이다.