3D 지구본 기반 여행 시각화 애플리케이션
React 19와 Next.js 15를 기반으로 한 현대적인 웹 애플리케이션입니다. 사진의 EXIF 위치 정보를 추출하여 3D 지구본에 시각화합니다.
- Framework: Next.js 15.5.2, React 19.1.0
- Language: TypeScript (strict mode)
- Package Manager: pnpm 9.1.0
- Styling: TailwindCSS v4, CVA, clsx
- State Management: Zustand, TanStack React Query
- 3D Graphics: Globe.gl, React-Globe.gl, Three.js
- Image Processing: EXIFR, HEIC2ANY
- External APIs: Google Maps Services
- Code Quality: Biome (linting/formatting)
- Deployment: Docker (standalone output)
- Node.js 20.x 이상
- pnpm 9.x 이상
# 의존성 설치
pnpm install
# AI 어시스턴트 설정 파일 생성 (최초 1회 실행 필요)
pnpm ruler:apply.env.local 파일을 생성하고 다음 환경 변수를 설정하세요:
# Server-side only (API routes)
GOOGLE_MAPS_API_KEY=your_key_here
# Client-side (browser accessible)
NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=your_key_here# 개발 서버 실행
pnpm dev브라우저에서 http://localhost:3000을 열어 확인하세요.
# 프로덕션 빌드
pnpm build
# 프로덕션 서버 실행
pnpm startpnpm dev- 개발 서버 실행pnpm build- 프로덕션 빌드pnpm start- 프로덕션 서버 실행
pnpm lint- Biome 린트 실행 (자동 수정)pnpm format- Biome 포맷 실행 (자동 수정)pnpm check- Biome 전체 검사 (자동 수정)pnpm reporter- Biome 검사 요약 리포트pnpm ci- CI 모드로 Biome 검사
pnpm tokens:build- 디자인 토큰 빌드pnpm ruler:apply- AI 어시스턴트 설정 파일 생성
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── api/ # API routes
│ │ └── page.tsx # Main page
│ ├── components/ # React components
│ │ ├── react-globe/ # Globe 관련 컴포넌트
│ │ └── image-metadata/ # 이미지 메타데이터 컴포넌트
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # 유틸리티 함수
│ ├── constants/ # 상수 정의
│ └── types/ # TypeScript 타입 정의
├── .ruler/ # AI 어시스턴트 설정
│ ├── AGENTS.md # AI 가이드 진입점
│ ├── CONVENTIONS.md # 코드 컨벤션
│ └── GLOBBER.md # 프로젝트별 가이드
├── scripts/ # 유틸리티 스크립트
└── public/ # 정적 파일
이 프로젝트는 Ruler를 사용하여 AI 어시스턴트(Claude Code, GitHub Copilot, Cursor 등)에 일관된 가이드를 제공합니다.
프로젝트 클론 후 반드시 한 번 실행하세요:
pnpm ruler:apply이 명령어는 .ruler/ 디렉토리의 가이드를 각 AI 도구별 설정 파일로 변환합니다:
.claude/CLAUDE.md- Claude Code용.github/.copilot-instructions.md- GitHub Copilot용.cursor/CURSOR.md- Cursor용
- AGENTS.md: AI 어시스턴트 가이드 진입점
- CONVENTIONS.md: 네이밍, 코드 스타일, JSDoc 컨벤션
- GLOBBER.md: 프로젝트별 아키텍처 및 중요 규칙
주요 코딩 컨벤션:
- 변수명: camelCase
- 상수명: UPPER_SNAKE_CASE
- 컴포넌트: PascalCase
- 타입:
type사용 (interface 대신) - 이벤트 핸들러:
handle[Action][Target]또는on[Action][Target] - Boolean 변수:
is,has,should접두사
HTTPS가 필요한 기능을 개발할 때는 로컬 HTTPS 서버를 사용할 수 있습니다.
- mkcert 설치 (Mac):
brew install mkcert- 로컬 CA 등록:
mkcert -install- 기본 (HTTP):
pnpm run dev - HTTPS 버전:
pnpm run dev:https
자세한 내용은 CONVENTIONS.md를 참고하세요.
- 📸 EXIF 기반 위치 추출 - 사진의 GPS 정보 자동 추출
- 🌍 3D 지구본 시각화 - Three.js 기반 인터랙티브 지구본
- 📱 모바일 최적화 - 512px 모바일 우선 디자인
- 🎨 현대적인 UI - TailwindCSS v4 기반 디자인 시스템
- 🖼️ HEIC 지원 - iPhone HEIC 이미지 자동 변환
- 🗺️ Google Maps 연동 - 장소 정보 및 지오코딩
MIT