Tecnoblog의 Discourse 댓글 사용 경험

안녕하세요!

이 새로운 기능에 정말 기대가 큽니다. 이렇게 좋은 솔루션을 오랫동안 기다려 왔는데, Tecnoblog의 독자분들로부터 받은 초기 피드백도 매우 좋습니다. 커뮤니티가 통합된 것을 매우 좋아하고 있습니다.

그러나 실제 환경에서 테스트를 해본 결과, 이 기능이 진정한 네이티브 댓글 시스템처럼 느껴지려면, 그리고 무엇보다 높은 트래픽을 처리하는 사이트에서 지속 가능하려면 몇 가지 기술적 장벽을 해결해야 할 것 같습니다.

현재까지 발견한 내용은 다음과 같습니다:

1. 성능 및 서버 부하

전체 앱을 임베드한 후 서버 부하가 크게 증가했습니다. Cloudflare를 확인해 보니 요청량이 10배로 증가했습니다. 이를 최적화하기 위한 몇 가지 아이디어를 제안합니다:

  • 레이지 로딩(Lazy Loading): JS에 대해 레이지 로딩을 구현하면 도움이 많이 됩니다(이미 이를 위한 임시 대안을 사용하고 있습니다).
            <script type="text/javascript">
                DiscourseEmbed = {
                    discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                    
                    <?php if ($use_topic_id): ?>
                        // Modo ID: Tópico salvo no banco, imune a mudanças de URL
                        topicId: <?php echo intval($topic_id); ?>,
                    <?php else: ?>
                        // Modo URL: Fallback quando a criação via API falha
                        discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                    <?php endif; ?>
                    fullApp: true,
                    embedHeight: '800px',
                };

                (function() {
                    var container = document.getElementById('discourse-comments');

                    // Verifica se o navegador suporta IntersectionObserver
                    if ('IntersectionObserver' in window) {
                        var observer = new IntersectionObserver(function(entries, observer) {
                            entries.forEach(function(entry) {
                                if (entry.isIntersecting) {
                                    // Quando o div entra na tela, carrega o script
                                    loadDiscourse();
                                    observer.unobserve(entry.target);
                                }
                            });
                        }, { rootMargin: "1500px" }); // Carrega 1500px antes de chegar no div

                        observer.observe(container);
                    } else {
                        // Fallback para navegadores antigos
                        loadDiscourse();
                    }

                    function loadDiscourse() {
                        var d = document.createElement('script'); 
                        d.type = 'text/javascript'; 
                        d.async = true;
                        d.src = window.DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
                        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
                    }
                })();
            </script>

레이지 로딩 구현 후 요청 수가 감소하는 것을 확인할 수 있습니다(웹사이트의 일부가 여전히 캐시되어 있어 최종 결과는 아닙니다):

  • 페이로드 제거: 임베드 내에서 로드되는 리소스를 줄일 수 있을까요? 예: 채팅 URL 쿼리와 AI 크레딧 확인 요청을 발견했는데, 임베드 뷰에서 이것이 필요한가요?

  • 요청 빈도: 실시간 POST 요청이 다소 공격적입니다. 임베드 버전의 경우 폴링 빈도를 낮출 수 있을까요?

  • 캐시: 트래픽 급증을 처리하기 위해 임베드된 토픽의 캐시 관리를 개선해야 합니다.

2. 분석 데이터 혼란

현재 임베드는 Google Analytics/GTM 스크립트를 실행하고 있습니다. 이로 인해 페이지뷰가 두 배로 집계됩니다(게시물 1회, iframe 1회)하여 데이터가 왜곡됩니다. 시스템이 iframe 내부에 있음을 감지하고 추적 스크립트(또는 Discourse 분석 기능 포함)를 자동으로 비활성화할 수 있다면 이상적입니다.

3. iFrame 높이 문제

이것은 UX 측면에서 가장 큰 장벽일 수 있습니다. 댓글이 없는 게시물의 경우 이상한 빈 공간이 생깁니다. 긴 스레드가 있는 경우, iframe은 처음 2~3개의 댓글에서 잘려나가고, 이는 특히 모바일에서 매우 불편한 “스크롤 안의 스크롤” 상황을 초래합니다.

Disqus와 같은 서비스와 경쟁하려면 높이가 동적이어야 합니다(댓글 수에 따라 조절). 또한 특정 답변 수 이후에 스레드를 확장하는 “더 보기” 버튼이 있어야 합니다.

4. 플러그인 충돌

임베드가 모든 활성 플러그인을 로드하기 때문에 일부 이상한 동작이 관찰됩니다. 예를 들어, "Google One Tap"이 블로그 게시물 내부에 팝업으로 나타납니다. 사용자가 로그인하면 iframe이 새로고침되어 커뮤니티 홈페이지만 아니라 댓글 스레드로 이동하지 않습니다. 임베드 뷰에서 특정 플러그인을 수동으로 비활성화할 수 있다면 큰 도움이 될 것입니다.

5. 로그인 마찰

현재 플로우가 전환율을 크게 떨어뜨리는 요인입니다: 사용자가 로그인을 클릭 → 새 탭이 열림 → 로그인 완료 → 사용자가 커뮤니티 홈페이에 머무름. 블로그 게시물로 돌아와도 사용자가 전체 페이지를 수동으로 새로고침할 때까지 iframe은 여전히 로그아웃 상태로 보입니다. 이는 사용자가 댓글을 달기 전에 포기를 하고 이탈하게 만드는 혼란스러운 루프입니다.

새로운 임베드를 활성화한 후, 일일 신규 가입자가 두 배 이상 증가하여 좋습니다. 그러나 참여 지표는 전혀 변하지 않았습니다. 실제로 DAU/MAU 비율이 하락했습니다. 로그인한 사용자는 더 많지만, 그들이 상호작용하지 않고 있기 때문입니다. “일일 참여 사용자”, “신규 기여자”, "게시물 작성 수"와 같은 지표는 어떤 증가도 보이지 않았습니다.

이것은 사람들이 대화에 참여하고 싶어 하지만, 로그인 루프에서 길을 잃어 실제로 댓글을 달기 전에 게시물을 이탈한다는 것을 증명합니다.

6. 모바일 UI

모바일에서 답변 창이 화면 전체를 차지하여 답변하려는 대화의 맥락을 모두 잃게 됩니다. 다소 답답한 느낌이 드는데, 더 컴팩트하게 유지할 수 있는 방법이 있다면 큰 성과가 될 것입니다.


Tecnoblog(그리고 우리가 소유하는 다른 사이트)에서 이것이 기본 시스템이 되기를 정말 바랍니다. 이 중 어떤 항목에 대해 더 깊이 논의하고 싶으신지 알려주세요!

14개의 좋아요

이것은 다음을 통해 수정될 것입니다.

11개의 좋아요

상세한 피드백을 주셔서 감사합니다, @Thiago_Mobilon!

목록을 검토하여 결국 모든 항목을 다루도록 하겠습니다.

방금 여기서 확인해 보니, Discourse 사이트의 CSS가 잘못 설정되어 있는 것 같습니다. cache-control 헤더가 중복되어 있으며, 그중 하나는 no-cache입니다.

curl -v https://tecnoblog.net/comunidade/stylesheets/common_cd45efa28175431b0b8ff143783178d55206920b.css?__ws=tecnoblog.net -s 2>&1 | grep cache-control
< cache-control: max-age=31556952, public, immutable
< cache-control: no-store, no-cache, must-revalidate, private
9개의 좋아요

Discourse의 내장 Google Analytics 통합 기능을 사용 중이신가요?

8개의 좋아요

다음에서 처리 중입니다:

9개의 좋아요

다음에서 처리되었습니다:

11개의 좋아요

Cloudflare가 /comunidade/ 디렉토리의 캐시를 우회하도록 설정했기 때문에 해당 헤더를 추가했을 것이라고 생각합니다. 이 설정을 제거하지 않으면 Cloudflare가 Discourse의 CSS와 JS에 캐싱 규칙을 적용하게 되어 나중에 충돌이 발생할 수 있습니다.

어쨌든, 캐싱 문제를 언급한 것은 서버 부하를 줄이려는 목적이 더 컸습니다. CSS 파일은 정적(static) 파일이 맞나요? 그렇다면 캐시되지 않는 것은 바람직하지 않지만, 서버 부하에 직접적인 영향을 주지는 않을 것입니다.

5개의 좋아요

저는 Google Tag Manager와 함께 Discourse 통합을 사용하고 있습니다.

4개의 좋아요

이것은 최종 사용자 성능에 영향을 미칩니다. 모든 기사에서 CSS를 59회 요청하여 1.43MB(압축 시 340KB)를 다운로드하기 때문입니다.

또한 Ruby 서버를 통해 제공되는데, 사이트가 캐시를 깨뜨리지 않는 것을 전제로 하므로 정상적인 조건에서는 이 경로가 거의 사용되지 않습니다.

제가 잘못 기억하고 있지 않다면, 캐시가 깨진 상태로 이들을 제공하면 데이터베이스까지 접근하게 됩니다.

4개의 좋아요

훌륭한 아이디어네요. 네이티브 지원을 추가하겠습니다.

11개의 좋아요

이는 이동 중 작성하는 일반적인 문제이며, Creating/Editing a post on mobile: let's discuss the 2026 Discourse experience 의 개선 사항에서 혜택을 볼 것입니다.

8개의 좋아요

익명 사용자가 토픽 페이지에 접근할 때 사용할 수 있는 놀라운 캐시가 있으며, 이 새로운 모드도 포함하고 있으므로, 충분한 Pitchfork 워커와 Redis I/O 워커가 있으면 스파이크를 잘 처리하며 확장할 수 있을 것입니다.

5개의 좋아요

Pooling은 백그라운드 탭이나 높은 부하 이벤트 시 자동으로 빈도를 낮추며, 여기에도 동일한 원리가 적용되어야 합니다.

5개의 좋아요

해당 태그를 포함하도록 선택했습니다

8개의 좋아요

동적 높이(dynamic height)가 올바르게 작동하지 않아 어려움을 겪고 있습니다. Discourse를 업데이트하고 스니펫을 최신 구성으로 새로고침해도 문제가 계속됩니다.

        <h4 class="comments-main-title component-title">Comentários</h4>
        <div id='discourse-comments'></div>

        <meta name='discourse-username' content='<?php echo esc_attr($discourse_author); ?>'>

        <script type="text/javascript">
            DiscourseEmbed = {
                discourseUrl: '<?php echo esc_url($discourse_url); ?>',
                
                <?php if ($use_topic_id): ?>
                    // ID 모드: 데이터베이스에 저장된 토픽, URL 변경에 영향받지 않음
                    topicId: <?php echo intval($topic_id); ?>,
                <?php else: ?>
                    // URL 모드: API를 통한 생성이 실패할 때의 폴백
                    discourseEmbedUrl: '<?php echo esc_url($permalink); ?>',
                <?php endif; ?>
                fullApp: true,
                lazyLoad: true, // iframe의 지연 로딩 비활성화
                lazyLoadMargin: '1500', // 뷰포트 시작 전 픽셀 수
                dynamicHeight: true,
                embedMinHeight: '400',
                embedMaxHeight: '3000',
					  embedHeight: '800px',
                // className: 'CLASS_NAME',
            };

            (function() {
            var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
            d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
            })();
        </script>
4개의 좋아요

여기서 <iframe loading="lazy">를 사용할 수 있을까요? 그러면 커스텀 JS나 인터섹션 옵저버가 필요하지 않을 텐데요.

4개의 좋아요

오, 이제 브라우저에서 널리 지원되는 건가요? 처음 알았네요! 가능한 한 빨리 변경하겠습니다.

8개의 좋아요

테스트해 주셔서 감사합니다. 문제를 찾았습니다.

5개의 좋아요

훌륭합니다! 동적 높이가 이제 예상대로 작동하고 있습니다. 그러나 이로 인해 작은 문제가 발생했습니다: 답변을 작성하려고 클릭하면, 답변 입력 필드가 iframe의 높이에 맞게 조정되려 합니다. 이 경우, 높이가 7385px으로 잘못 설정되었습니다.

해당 게시물에는 31개의 댓글이 있었고, 내장된 iframe의 높이는 9757px였습니다 (embedMaxHeight를 15000px으로 설정해 두었었기 때문입니다).

업데이트: 실제로는 댓글 작성 폼이 iframe의 높이를 최대치까지 확장하는 것을 확인했습니다. 따라서 '폐기’를 클릭하면, 댓글 아래에 거대한 빈 공간이 남게 됩니다.

Screenshot 2026-04-16 at 16.03.37

5개의 좋아요

거기에는 1000~1500px 정도처럼 좀 더 합리적인 값으로 max-height를 설정해야 할 것 같습니다.

이 기능은 초기에 제기하신 문제인

을 해결해 주며, 일정 수준까지 확장되지만 Discourse의 네이티브 무한 스크롤 동작을 고려할 때 높이를 그렇게까지 크게 증가시키고 싶지는 않을 것입니다.

이 기능은 당분간 “스크롤 안의 스크롤” 문제를 제거하지는 못할 것입니다.

모바일 작성기(composer)에 대해서는 여기서 무엇을 할 수 있는지 살펴보고 있습니다.

6개의 좋아요