신규 페이지: - 회계관리: 거래처, 예상비용, 청구서, 발주서 - 게시판: 공지사항, 자료실, 커뮤니티 - 고객센터: 문의/FAQ - 설정: 계정, 알림, 출퇴근, 팝업, 구독, 결제내역 - 리포트 (차트 시각화) - 개발자 테스트 URL 페이지 기능 개선: - HR 직원관리/휴가관리/카드관리 강화 - IntegratedListTemplateV2 확장 - AuthenticatedLayout 패딩 표준화 - 로그인 페이지 UI 개선 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
7.1 KiB
7.1 KiB
모바일 출퇴근 시스템 구현 체크리스트
Last Updated: 2025-12-18
개요
- 목적: 모바일 기기에서 GPS 기반 출퇴근 기록
- 대상: 특정 사용자 (하드코딩)
- 조건: 지정된 현장 좌표 100m 반경 내에서만 출퇴근 가능
기술 스택
- 지도 API: Google Maps JavaScript API (카카오맵에서 변경)
- API 키:
.env.local에NEXT_PUBLIC_GOOGLE_MAPS_API_KEY저장 - 현장 좌표:
37.557358, 126.864414(본사) - 반경: 100m
Phase 1: 환경 설정 ✅
- Google Maps API 키 .env.local에 추가
- @types/google.maps 패키지 설치
Phase 2: 페이지 구조 ✅
/hr/attendance라우트 생성 (기존 protected 레이아웃 활용)- 모바일 전용 레이아웃 (AuthenticatedLayout 모바일 모드 활용)
- 페이지 컴포넌트 기본 구조
Phase 3: 지도 컴포넌트 ✅
- GoogleMap 컴포넌트 생성 (
src/components/attendance/GoogleMap.tsx) - 현장 좌표에 100m 파란 원(Circle) 표시
- 현재 위치 마커 표시 (빨간색)
- GPS watchPosition으로 실시간 위치 추적
- 개발 환경 GPS 시뮬레이션 (localhost에서 본사 근처 50m로 자동 설정)
Phase 4: 출퇴근 로직 ✅
- GPS 거리 계산 함수 (Haversine formula)
- 100m 반경 체크 → 버튼 활성화/비활성화
- 출근 상태 관리 (출근전/출근중/퇴근완료)
- 현재 시간 실시간 표시
Phase 5: 완료 화면 ✅
- 출근 완료 화면 구현 (
src/components/attendance/AttendanceComplete.tsx)- ✓ 체크 아이콘
- "출근 완료" 텍스트 (빨간색)
- 시간 표시 (HH:MM:SS)
- 날짜 표시 (YYYY년 MM월 DD일 요일)
- 위치 표시 (본사)
- 확인 버튼
- 퇴근 완료 화면 구현 (동일 컴포넌트 재사용)
Phase 6: 모바일 감지 & 리다이렉트 ⏳
- User-Agent 기반 모바일 감지
- 특정 사용자 하드코딩 체크
- 로그인 후 자동 리다이렉트 로직
- 별도 모바일 레이아웃 (헤더/사이드바 제거)
- 웹에서 접근 차단 (모바일 전용)
Phase 7: API 연동 ⏳
- 출퇴근 기록 API 설계
- 출근 API (
POST /api/attendance/check-in) - 퇴근 API (
POST /api/attendance/check-out) - 오늘 출퇴근 상태 조회 API (
GET /api/attendance/today) - 현장 좌표 API에서 가져오기 (하드코딩 제거)
Phase 8: 사용자 정보 연동 ⏳
- 로그인 사용자 정보 연동 (TEST_USER 제거)
- 출퇴근 가능 사용자 권한 체크
- 현장별 사용자 배정 로직
생성된 파일
| 파일 | 설명 |
|---|---|
src/components/attendance/GoogleMap.tsx |
Google Maps 컴포넌트 (원, 마커, GPS 추적) |
src/components/attendance/AttendanceComplete.tsx |
출퇴근 완료 화면 |
src/app/[locale]/(protected)/hr/attendance/page.tsx |
출퇴근 메인 페이지 |
테스트 URL
http://localhost:3000/ko/hr/attendance
모바일 테스트: Chrome DevTools → Toggle Device Toolbar (Ctrl+Shift+M)
하드코딩 설정값 (추후 API로 대체 필요)
// 현장 좌표 (본사) - page.tsx:12-17
const SITE_LOCATION = {
name: '본사',
lat: 37.557358,
lng: 126.864414,
radius: 100, // meters
};
// 테스트용 사용자 정보 - page.tsx:19-23
const TEST_USER = {
name: '홍길동',
department: '부서명',
position: '직급명',
};
개발 중 해결한 이슈
1. Hydration 에러
- 원인: 서버/클라이언트 HTML 불일치 (Date, localStorage 등)
- 해결:
mounted상태 체크 +suppressHydrationWarning속성
2. Google Maps API 중복 로드
- 원인: React 컴포넌트 리렌더링 시 스크립트 중복 추가
- 해결:
window.googleMapsLoading플래그 + 기존 스크립트 체크
3. GPS 권한 거부 (localhost)
- 원인: HTTPS가 아닌 환경에서 GPS 권한 제한
- 해결: 개발 환경 감지 후 테스트 좌표로 시뮬레이션
const isDevelopment =
hostname === 'localhost' ||
hostname === '127.0.0.1' ||
hostname.startsWith('192.168.') ||
process.env.NODE_ENV === 'development';
UI 스펙 (스크린샷 기반)
출퇴근 메인 화면
┌─────────────────────────────┐
│ < 🏠 ⚙️⚙️⚙️ ☰ │ ← 헤더 (AuthenticatedLayout)
├─────────────────────────────┤
│ 출퇴근하기 │ ← 타이틀
├─────────────────────────────┤
│ │
│ ┌───────────────────┐ │
│ │ │ │
│ │ 🔵 (100m 원) │ │ ← Google Maps
│ │ 📍 │ │
│ │ │ │
│ └───────────────────┘ │
│ │
├─────────────────────────────┤
│ 👤 홍길동 │
│ 부서명 직급명 │
│ │
│ 08:43:15 (빨간색) │ ← 실시간 시간
├─────────────────────────────┤
│ [ 출근하기 ] [ 퇴근하기 ]│ ← 버튼
└─────────────────────────────┘
완료 화면
┌─────────────────────────────┐
│ < 🏠 ⚙️⚙️⚙️ ☰ │
├─────────────────────────────┤
│ 출근하기 │
├─────────────────────────────┤
│ │
│ ✓ │ ← 체크 아이콘 (원형)
│ │
│ 출근 완료 │ ← 빨간색
│ 08:43:15 │
│ │
│ 2025년 12월 15일 (월) │
│ │
│ 📍 본사 │
│ │
├─────────────────────────────┤
│ [ 확인 ] │
└─────────────────────────────┘
다음 작업 TODO
- Phase 6 진행: 모바일 전용 레이아웃 + User-Agent 감지
- API 설계: 백엔드 팀과 출퇴근 API 협의
- 테스트: 실제 모바일 기기에서 GPS 테스트 (HTTPS 환경)
참고 사항
- MVP 버전: API 연동 없이 하드코딩으로 동작 확인 (현재 상태)
- 추후 개선: 출퇴근 기록 API, 현장 좌표 DB 저장, 사용자 권한 체크
- Phase 6 (모바일 감지 & 리다이렉트)는 MVP 테스트 후 진행