병원 블로그 멀티 클라이언트 CMS
여러 병원 블로그를 한 코드베이스로 운영하는 CMS의 백엔드·관리자단과 검색·AI 검색 대응 기능을 만든 작업
- 같은 코드를 여러 병원·업체에 배포하는 블로그 CMS의 백엔드와 관리자단을 주도해 만들었습니다.
- 게시글 JSON-LD와 robots·sitemap·llms.txt를 백엔드에서 만들고, 운영자가 관리자 화면에서 조정하게 했습니다.
- 사용자 화면·RSS·작성자 권한은 동료가 맡았고, 여기에는 제가 커밋한 범위만 적습니다.
문제
블로그는 병원마다 저장소가 따로 있었다. 각 저장소는 병원 경로와 문구가 코드에 박힌 Next.js 사이트였고, 그중 두 곳에는 제가 백엔드와 관리자를 따로 붙였다. 같은 관리자 SEO 화면이 다른 병원 저장소로 복사되어 쓰이기도 했다.
새 CMS도 처음에는 한 병원용으로 시작했다. 초기 코드와 화면 곳곳에 병원명과 도메인이 하드코딩되어 있었다.
해결
백엔드와 관리자단. NestJS와 Prisma(PostgreSQL)로 백엔드를, Next.js로 관리자단을 만들었다. 콘텐츠는 그룹 → 카테고리 → 게시글 구조로 정리하고, 그룹 기반 공개 API를 냈다. 운영자 활동 로그, 에러 로그, 초기 셋업 마법사도 넣었다.
여러 병원에 같은 코드. 하드코딩을 걷어냈다. 도메인은 .env에서 파생하고, 병원명·SEO 값·브랜드 컬러는 운영자가 관리자에서 입력한다. 다국어 노출이나 하위 경로(/blog) 마운트처럼 병원마다 다른 동작은 env 플래그로 나눴다. 배포는 병원 목록을 matrix로 받아 인스턴스별로 올린다. 한 DB를 나눠 쓰는 멀티테넌시가 아니라, 병원마다 인스턴스를 따로 두고 같은 코드를 배포하는 구조다.
검색과 AI 검색 대응. 백엔드가 게시글 응답에 JSON-LD(Article·FAQPage·BreadcrumbList)를 자동으로 붙이고, robots.txt·sitemap.xml·llms.txt·llms-full.txt를 생성한다. 운영자는 차단 경로, AI 봇 허용 여부, llms 소개 문구를 관리자에서 조정한다. 글을 발행하면 IndexNow로 검색엔진에 알린다.
게시글 SEO 패널. 관리자 에디터 옆에 권장 글자수 카운터, 검색결과·OG 카드 미리보기, 9개 항목 완성도 검사를 두었다.
다국어. 게시글·의료진·카테고리·그룹에 번역 테이블을 두고, 관리자에 9개 언어 입력 탭을 만들었다. 번역이 없으면 404 대신 한국어를 보여준다. 새 언어를 추가해도 행만 늘고 응답 형태는 그대로라 프론트를 거의 고치지 않는다.
| 정한 것 | 대신 버린 것 | 이유 |
|---|---|---|
| 도메인·사이트명 처리도메인은 .env에서 파생, 병원명·SEO 값은 운영자가 관리자에서 입력 | 코드에 하드코딩 | 병원마다 .env만 바꾸면 코드 수정 없이 새 도메인에 대응하고, 새 병원을 추가할 때 설정 파일을 고치는 일이 사라진다. |
| 검색엔진 색인 알림게시글 발행 시 IndexNow 통합 알림 | 검색엔진별 sitemap ping | 구글 sitemap ping은 2023년 6월에 중단됐고, Bing·네이버·Yandex는 IndexNow 엔드포인트 하나로 받는다. |
동료가 만든 부분. 사용자 화면(SSR), RSS, 작성자 권한, 관련글 자동 선정, 방문자 통계, 서치콘솔 연동, 이후의 블루-그린 배포 전환은 동료 작업이다.
결과
- 21 / 22
- 직접 도입한 Prisma 모델
- 21
- 직접 만든 NestJS 모듈 (전체)
- 35 / 39
- 직접 만든 관리자 화면
- 현재 코드 기준 백엔드의 약 64%, 관리자단의 약 72%가 제가 작성한 줄이다(git blame 기준, 남아 있는 줄만 센 값).
- 제가 만든 백엔드·관리자 위에서 동료들이 RSS, 작성자 권한, 관련글, 방문자 통계를 이어서 만들었다.
- Claude Code로 구현 속도를 높였고, 구조 결정과 검증은 직접 했다.
계약상 병원 실명, 도메인, 화면 캡처는 공개하지 않는다.
이 프로젝트가 궁금하시면 편하게 물어보세요.
연락하기