지역 서비스 SEO 웹사이트 빌더
지역별 동적 랜딩페이지, 서버 사이드 렌더링 기반 테크니컬 SEO 구조, 템플릿 에디터, 문의·예약 접수 폼을 포함한 지역 서비스 웹사이트를 Next.js와 PostgreSQL 기반으로 설계·구현하는 프로젝트입니다.
프로젝트 개요
지역별 동적 랜딩페이지, 서버 사이드 렌더링 기반 테크니컬 SEO 구조, 템플릿 에디터, 문의·예약 접수 폼을 포함한 지역 서비스 웹사이트를 Next.js와 PostgreSQL 기반으로 설계·구현하는 프로젝트입니다.
작업 범위
- 지역 페이지 템플릿 에디터: 좌측 블록 트리, 중앙 미리보기 캔버스, 우측 속성 패널로 지역 페이지의 문구와 블록 구성을 편집하는 화면입니다
- 지역별 동적 랜딩페이지: 강남, 해운대 등 지역 슬러그로 접속하면 해당 지역 정보가 담긴 반응형 랜딩페이지가 서버에서 렌더링되는 방문자용 화면입니다
- 테크니컬 SEO 메타 및 구조화 데이터: 페이지별 Title·Description·H1·canonical 값과 JSON-LD 구조화 데이터, 사이트맵·robots.txt 생성 결과를 한 화면에서 확인하는 점검 화면입니다
- 문의·예약 접수 폼: 방문자가 이름·연락처·희망 일정을 입력해 문의와 예약을 접수하는 폼과 접수 완료 안내 화면입니다
주요 업무
- 지역 페이지 템플릿 에디터 화면: 하나의 템플릿에 지역명·대표 서비스·문구 변수를 주입해 지역 페이지를 생성하고, 편집 내용이 캔버스에 즉시 반영되는 구조로 구현합니다
- 지역별 동적 랜딩페이지 화면: Next.js 동적 라우트와 정적 경로 사전 생성(generateStaticParams)으로 지역 URL을 자동 생성합니다
- 테크니컬 SEO 메타 및 구조화 데이터 화면: 지역 페이지마다 메타태그와 Schema Markup을 서버에서 동적으로 삽입하고 사이트맵을 자동 생성하는 구조로 구현합니다
- 문의·예약 접수 폼 화면: 입력값 검증 후 PostgreSQL에 저장하고 지역 페이지 출처를 함께 기록합니다



프로젝트 핵심 과제
지역 페이지가 늘어날 때 본문이 유사해져 중복 콘텐츠로 분류될 수 있어
지역별 고유 블록과 중복 검출 규칙을 설계합니다
서버 렌더링 결과와 클라이언트 에디터 미리보기의 불일치가 생길 수 있어
동일한 렌더 함수를 양쪽에서 공유하는 구조로 대응합니다
동적 라우팅 경로가 많아질수록 사이트맵 갱신 범위가 커지므로
변경된 지역만 재생성하는 on-demand 재검증 구조를 적용합니다
구조화 데이터 필수 속성이 지역 정보 누락으로 비어 있을 수 있어
입력 단계에서 필수 항목을 강제하는 스키마 검증으로 대응합니다
핵심 기능 상세
지역 페이지 템플릿 에디터
좌측 블록 트리, 중앙 미리보기 캔버스, 우측 속성 패널로 지역 페이지의 문구와 블록 구성을 편집하는 화면입니다.
- 블록 트리 상태를 Zustand로 관리하고 Immer로 불변 업데이트를 적용
- 템플릿 변수({지역명} 등)를 서버에서 치환하는 렌더 함수로 지역별 페이지를 일괄 생성
- dnd-kit 기반 블록 순서 변경과 속성 인스펙터 폼을 React Hook Form + Zod로 검증
하나의 템플릿에서 지역별 페이지를 생성하는 변수 치환 구조와 실시간 캔버스 미리보기를 구현합니다.


지역별 동적 랜딩페이지
강남, 해운대 등 지역 슬러그로 접속하면 해당 지역 정보가 담긴 반응형 랜딩페이지가 서버에서 렌더링되는 방문자용 화면입니다.
- App Router 동적 세그먼트([region])와 generateStaticParams로 지역 경로를 빌드 시점에 생성
- 지역 데이터 변경 시 on-demand revalidate로 해당 경로만 재생성
- Tailwind CSS 반응형 그리드와 모바일 우선 레이아웃 적용
지역 슬러그 하나로 URL·콘텐츠·메타 정보가 함께 생성되는 동적 라우팅 구조를 구현합니다.


테크니컬 SEO 메타 및 구조화 데이터
페이지별 Title·Description·H1·canonical 값과 JSON-LD 구조화 데이터, 사이트맵·robots.txt 생성 결과를 한 화면에서 확인하는 점검 화면입니다.
- generateMetadata로 지역별 Title·Description·canonical·Open Graph를 서버에서 생성
- LocalBusiness·FAQPage JSON-LD를 지역 데이터에서 직렬화해 script 태그로 삽입
- sitemap.ts와 robots.ts 라우트로 지역 추가 시 사이트맵 항목 자동 갱신
지역 데이터에서 메타태그·JSON-LD·사이트맵 항목이 함께 생성되는 서버 렌더링 SEO 구조를 설계합니다.


문의·예약 접수 폼
방문자가 이름·연락처·희망 일정을 입력해 문의와 예약을 접수하는 폼과 접수 완료 안내 화면입니다. 입력값 검증 후 PostgreSQL에 저장하고 지역 페이지 출처를 함께 기록합니다.
- React Hook Form + Zod 스키마를 클라이언트와 API Route에서 공유해 이중 검증
- Prisma로 문의·예약 테이블에 저장하고 유입 지역 페이지를 외래키로 기록
- 중복 제출 방지를 위한 요청 멱등 키와 간단한 제출 간격 제한 적용
접수 데이터에 유입 지역 페이지를 함께 기록해 관리자가 지역별로 문의를 구분할 수 있는 구조를 구현합니다.


프로젝트 진행 단계
지역 데이터 모델과 URL 구조 설계 · 2026.10
지역·템플릿·문의 테이블 ERD 설계, 지역 슬러그 규칙과 동적 라우트 구조 정의
서버 렌더링 지역 페이지 구현 · 2026.10
Next.js 동적 라우트, generateStaticParams, 반응형 랜딩 템플릿 구현
SEO 메타·JSON-LD·사이트맵 구성 · 2026.10
generateMetadata, 구조화 데이터 직렬화, 사이트맵·robots 라우트 구현
템플릿 에디터와 접수 폼 개발 · 2026.10
블록 트리 에디터, 실시간 미리보기, 문의·예약 폼과 검증 API 구현
개발 결과
기술적 주안점
- 하나의 템플릿에서 지역별 페이지를 생성하는 변수 치환 구조와 실시간 캔버스 미리보기를 구현합니다
- 지역 슬러그 하나로 URL·콘텐츠·메타 정보가 함께 생성되는 동적 라우팅 구조를 구현합니다
- 지역 데이터에서 메타태그·JSON-LD·사이트맵 항목이 함께 생성되는 서버 렌더링 SEO 구조를 설계합니다