프로젝트 개요
하이라이트
멀티테넌트 리더
하나의 라우트로 플랫폼의 모든 블로그 제공
아티클 리더는 /[lang]/article/[blogSlug]/[postSlug]에 위치합니다. blogSlug 세그먼트가 어떤 블로그의 설정을 적용할지 선택합니다. 주색, 이름, 카테고리, AdSense 퍼블리셔 ID, 사이트 인증 태그 모두 블로그 레코드에서 옵니다. 블로그별 배포, 코드베이스, 빌드가 없습니다.
"portfolio"라는 특수 슬러그 값은 데이터베이스 조회를 생략하고 포트폴리오 케이스 스터디 콘텐츠를 렌더링합니다. 동일한 라우트 핸들러가 아티클 읽기와 포트폴리오 케이스 스터디 페이지를 별도 라우트 없이 제공합니다.
SEO
4개의 Schema.org 블록과 정규 hreflang 대체 URL
각 아티클 페이지는 BlogPosting(헤드라인, 설명, 저자, 퍼블리셔, 이미지, wordCount, timeRequired), Blog(퍼블리셔 참조), BreadcrumbList(3단계: Yurasis → 블로그 → 포스트), FAQPage(포스트에 faqSchema 배열이 있는 경우) 네 개의 블록을 서버 HTML의 <script type="application/ld+json">으로 삽입합니다.
hreflang 대체 URL은 포스트의 translationOf와 translations 필드에서 파생됩니다. canonicalTranslation()이 요청 언어, 블로그 기본 언어, ko/en 순으로 권위 있는 언어-슬러그 쌍을 선택합니다. 정규 URL은 항상 기본 언어 버전입니다.
관련 포스트
추천 엔진 없이 동일 카테고리 콘텐츠 추천
포스트에 카테고리가 있으면 리더는 동일 카테고리에서 최대 6개를 가져와 현재 포스트를 제외한 4개를 관련 포스트 그리드로 렌더링합니다. 카테고리가 없으면 포스트의 첫 번째 태그로 폴백합니다. 임베딩이나 ML 모델 없이 요청 시간에 필터링된 API 호출만 사용합니다.
관련 포스트 카드는 각 포스트의 정규 경로로 연결되며, 독자의 언어 설정을 반영합니다. 독자의 언어로 번역본이 있으면 해당 번역본으로 연결됩니다.
분석
렌더링을 차단하지 않는 클라이언트 사이드 조회수 추적
조회수는 하이드레이션 후 keepalive fetch로 POST 요청을 보내는 ViewTracker 클라이언트 컴포넌트가 증가시킵니다. 서버는 조회 이벤트를 기다리지 않고 아티클을 렌더링합니다. 독자가 보는 조회수는 viewCount + 1로 API 확인 전에 현재 방문을 반영합니다.
일별 메트릭은 별도의 cron 작업이 blog_daily_metrics에 집계하므로 아티클 렌더링 핫 패스가 분석 쓰기로 인해 차단되지 않습니다. 대시보드는 실시간 viewCount 컬럼이 아닌 집계 테이블에서 읽습니다.
아티클 리더는 Yurasis 플랫폼의 실제 공개 화면입니다. 발행된 블로그를 탐색하면 블로그별 테마, 구조화 데이터, 관련 포스트, 다국어 라우팅이 실제 AI 생성 콘텐츠와 함께 동작하는 것을 확인할 수 있습니다.
데모 보기