모던 웹 개발 기술을 다루는 기술 블로그입니다. React, TypeScript, Vite를 기반으로 구축되었습니다.
- 📝 마크다운 기반 게시글 작성 및 표시
- 💬 GitHub Issues 기반 댓글 시스템 (Utterances)
- 📊 Google Analytics를 통한 조회수 추적
- 🌓 다크/라이트 모드 지원
- 📱 반응형 디자인
- 🎨 커스터마이징 가능한 테마
- Node.js 18 이상
- npm 또는 yarn
npm install프로젝트 루트에 .env 파일을 생성하고 다음 환경 변수를 설정하세요:
# Google Analytics Measurement ID (프론트엔드 추적용)
VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX
# Google Analytics Data API (조회수 가져오기용, 선택사항)
GA_PROPERTY_ID=123456789
GA_SERVICE_ACCOUNT_KEY=./ga-service-account-key.json
# GitHub (댓글 개수 가져오기용, 선택사항)
COMMENTS_GH_PAT=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
UTTERANCES_REPO=your-username/your-repo- Google Analytics에 접속
- 계정 및 속성 생성
- 속성 설정에서 Measurement ID 확인 (형식:
G-XXXXXXXXXX) .env파일에VITE_GA_MEASUREMENT_ID로 설정
npm run dev브라우저에서 http://localhost:5173으로 접속하세요.
npm run build빌드된 파일은 dist 디렉토리에 생성됩니다.
ModernDevBlog/
├── src/
│ ├── components/ # React 컴포넌트
│ ├── pages/ # 페이지 컴포넌트
│ ├── lib/ # 유틸리티 함수
│ ├── hooks/ # 커스텀 훅
│ └── App.tsx # 메인 앱 컴포넌트
├── server/ # Express 서버 (선택사항)
├── public/ # 정적 파일
└── scripts/ # 빌드 스크립트
이 블로그는 Utterances를 사용하여 GitHub Issues 기반 댓글 시스템을 제공합니다.
설정 방법:
- GitHub 저장소에서 Utterances 앱 설치
src/pages/post.tsx에서repoprop을 실제 GitHub 저장소 경로로 변경
<UtterancesComments
repo="your-username/your-repo"
issueTerm="pathname"
useCard={true}
/>Google Analytics를 통해 게시글 조회수를 추적합니다. 조회수 데이터는 빌드 타임에 public/views.json으로 생성됩니다.
- Property ID: 숫자만 (예:
123456789) - Data API에서 조회수 가져오기용 - Measurement ID:
G-XXXXXXXXXX형식 - 프론트엔드 페이지뷰 추적용
1. Measurement ID 찾는 방법 (프론트엔드 추적용):
- Google Analytics에 접속
- 관리(톱니바퀴 아이콘) > 데이터 스트림 클릭
- 웹 스트림 선택 (또는 새로 생성)
- 측정 ID 확인 (형식:
G-XXXXXXXXXX) .env파일에VITE_GA_MEASUREMENT_ID=G-XXXXXXXXXX형식으로 설정
2. Property ID 찾는 방법 (Data API용):
- Google Analytics에 접속
- 관리(톱니바퀴 아이콘) > 속성 설정으로 이동
- 속성 ID 확인 (숫자만, 예:
123456789)- 속성 정보 섹션 상단에 표시됨
- 또는 URL에서 확인:
https://analytics.google.com/analytics/web/#/p123456789/
.env파일에GA_PROPERTY_ID=123456789형식으로 설정 (숫자만, G- 접두사 없음)
📸 위치 확인:
- Measurement ID: 관리 > 데이터 스트림 > 웹 스트림 > 측정 ID
- Property ID: 관리 > 속성 설정 > 속성 ID (속성 정보 섹션 상단)
- Google Cloud Console에 접속
- 프로젝트 선택 (또는 새로 생성)
- API 및 서비스 > 사용자 인증 정보로 이동
- + 사용자 인증 정보 만들기 > 서비스 계정 선택
- 서비스 계정 생성 후 키 탭에서 JSON 키 추가
- 다운로드한 JSON 파일을 프로젝트 루트에
ga-service-account-key.json으로 저장 .env파일에GA_SERVICE_ACCOUNT_KEY=./ga-service-account-key.json설정
ga-service-account-key.json 파일은 .gitignore에 추가하여 Git에 커밋하지 마세요!
서비스 계정이 Google Analytics 데이터에 접근하려면 반드시 다음 권한을 부여해야 합니다:
- Google Analytics에 접속
- 관리(톱니바퀴 아이콘) > 속성 액세스 관리로 이동
- + 추가 클릭
- 서비스 계정 이메일 주소 입력 (JSON 파일의
client_email필드 값, 예:blog-analytics-service@amplified-lamp-396305.iam.gserviceaccount.com) - 역할 선택:
- 뷰어 (Viewer): 조회수 데이터 읽기만 가능 (권장)
- 또는 분석자 (Analyst): 더 많은 권한
- 추가 클릭
- 위 단계를 통해 서비스 계정에 Analytics 권한을 부여했는지 확인
- 서비스 계정 이메일 주소가 정확한지 확인 (JSON 파일의
client_email확인) - Google Analytics 속성 ID(
GA_PROPERTY_ID)가 올바른지 확인
- Google Cloud Console에서 프로젝트 선택
- API 및 서비스 > 라이브러리로 이동
- "Google Analytics Data API" 검색 후 활성화
설정 > 데이터 수집 및 수정 섹션에서:
- 데이터 수집: Measurement ID만 설정하면 자동으로 활성화됩니다. 별도 설정 불필요 ✅
- 데이터 가져오기: BigQuery 연동 등 다른 소스에서 데이터를 가져오는 기능입니다. 필수 아님 ❌
- 우리는 GA Data API를 직접 사용하므로 이 설정은 필요 없습니다.
개발 모드:
# 1. 먼저 게시글 데이터 생성
npm run generate:posts
# 2. 조회수 데이터 가져오기
npm run fetch:views조회수가 0으로 나오는 경우:
.env파일에GA_PROPERTY_ID와GA_SERVICE_ACCOUNT_KEY가 올바르게 설정되었는지 확인npm run fetch:views실행 시 콘솔 로그 확인- Google Analytics에 실제 조회수 데이터가 있는지 확인 (GA 대시보드에서 확인)
- 서비스 계정에 Analytics Data API 권한이 있는지 확인
1. 실시간 조회수 확인 (Realtime 보고서):
- Google Analytics 접속
- 왼쪽 메뉴에서 보고서 > 실시간 클릭
- 페이지 및 화면 섹션에서 현재 방문 중인 페이지 확인
- URL 경로가
/post/frontend/css/css-modern-techniques형식으로 표시됨
2. 전체 조회수 확인 (보고서):
- 왼쪽 메뉴에서 보고서 > 참여도 > 페이지 및 화면 클릭
- 기간 선택 (예: 지난 30일)
- 페이지 경로별 조회수 확인
- 경로 형식:
/post/frontend/css/css-modern-techniques
3. 이벤트 확인:
- 보고서 > 참여도 > 이벤트 클릭
post_view이벤트 확인 (게시글 조회수 추적용)view이벤트 확인 (카테고리: post)
4. views.json 갱신:
조회수를 확인한 후, 다음 명령어로 views.json을 갱신하세요:
npm run fetch:views이 명령어는 GA Data API에서 최신 조회수를 가져와 public/views.json 파일을 업데이트합니다.
GitHub Actions 설정:
-
GitHub 저장소의 Settings > Secrets에서 다음 시크릿 추가:
GA_PROPERTY_ID: Google Analytics 속성 ID (숫자)GA_SERVICE_ACCOUNT_KEY: 서비스 계정 JSON 키 전체 내용 (한 줄로)
-
.github/workflows/build.yml이 자동으로 조회수 데이터를 가져와 빌드에 포함합니다.
GitHub Issues API를 통해 Utterances 댓글 개수를 가져옵니다. 댓글 개수 데이터는 빌드 타임에 public/comments.json으로 생성됩니다.
개발 모드:
npm run fetch:commentsGitHub Actions 설정:
-
GitHub 저장소의 Settings > Secrets에서 다음 시크릿 추가:
COMMENTS_GH_PAT: Personal Access Token (권한:public_repo)UTTERANCES_REPO: 저장소 경로 (예:username/repo-name)
-
.github/workflows/build.yml이 자동으로 댓글 개수 데이터를 가져와 빌드에 포함합니다.
헤더의 테마 커스터마이저를 통해 그라디언트 색상을 변경할 수 있습니다.
- 프레임워크: React 18
- 빌드 도구: Vite
- 언어: TypeScript
- 스타일링: Tailwind CSS
- 상태 관리: TanStack Query
- 라우팅: Wouter
- 코드 하이라이팅: Highlight.js
- 댓글 시스템: Utterances
MIT