페이지 네비게이션 트리
index.html (루트)
├── about.html ← 사이트소개 (헤더 버튼) [신규]
├── updates.html ← 업데이트 소식 (헤더 버튼) [신규]
├── competition.html ← 경쟁률 조회
│ ├── hub/electric.html ← 직렬허브 (퀵네비 칩)
│ └── salary.html ← 기관별 연봉 (팝업 버튼) [신규]
├── evidence/sample.html ← 성적분석
│ └── hub/electric.html ← 직렬허브 (퀵네비 칩)
├── evidence/sample-report.html ← 합격예측·진단 리포트
│ ├── evidence/aptitude.html ← 인적성 자가진단 (⑦단계 버튼)
│ └── [영상 팝업] ← YouTube 모달 (letter popup step2) [신규]
├── schedule.html ← 시험일정
├── university-board.html ← 대학활동
├── library-pdf.html ← 자료실
├── job-board.html ← 채용공고
├── public-jobs.html ← 공공기관 정규직 채용공고 [업데이트]
├── salary.html ← 공공기관 연봉 + 45개 기관 [업데이트]
├── cert-dist.html ← 직무별 자격증 분포 [신규]
├── gtelp-score.html ← 점수대비표
├── gov/index.html ← 기관별 채용공고 (퀵링크 하단 배너)
│ ├── gov/cat-*.html ← 카테고리 허브
│ └── gov/<slug>.html ← 기관별 랜딩 (40개) → competition.html
├── inst/index.html ← 공기업 준비 가이드 허브 (53개 기관) [신규]
│ └── inst/jobs/ ← 기관별 채용공고 SEO (33개) [신규]
├── newsletter/index.html ← 뉴스레터 매거진 [신규]
│ └── newsletter/view.html ← 발행본 상세 [신규]
├── package.html ← IBT 패키지
│ └── staff/index.html ← 대학관계자용 버튼
├── student.html ← IBT 무료신청
├── mobile.html ← 모바일 허브
│ ├── competition.html
│ ├── evidence/sample.html
│ └── student.html
├── mypage.html ← 마이페이지
│ ├── evidence/sample.html ← 점수확인 탭
│ ├── library-pdf.html ← 자료실 탭
│ └── challenge/index.html ← 합격챌린지 버튼
├── community/
│ ├── community_index.html ← 목록
│ │ ├── community_write.html
│ │ └── community_post.html
│ └── community_write.html ← 수정 모드 (?id=)
├── challenge/index.html ← 합격챌린지
├── hub/
│ ├── electric.html
│ ├── computer.html
│ ├── mechanical.html
│ └── admin.html
├── businessHR/index.html ← 해외인재 플랫폼 [신규]
│ └── businessHR/profiles/ ← 인재 프로필 SEO 75개 [신규]
├── GHR_website/index.html ← G-TELP HR 웹사이트 [신규]
└── admin-k9x3.html ← 관리자 (비공개)
페이지 간 직접 링크 관계
| 출발 페이지 | 도착 페이지 | 경로 | 비고 |
| index.html | about.html | 헤더 버튼 | 신규 |
| index.html | updates.html | 헤더 버튼 / 배너 | 신규 |
| index.html | competition.html | 히어로 버튼 | |
| index.html | evidence/sample.html | 히어로 버튼 | |
| index.html | evidence/sample-report.html | 합격예측 프로모 배너 (하단) | 신규 |
| index.html | newsletter/index.html | 탑 캐러셀 4번째 슬라이드 + ACADEMIA 섹션 | 신규 |
| index.html | mypage.html | 로그인 버튼 | |
| index.html | challenge/index.html | 플로팅 버튼 | |
| index.html | community/community_index.html | 플로팅(후기쓰면커피) | |
| competition.html | hub/electric.html | 퀵네비 칩 | |
| competition.html | salary.html | 기관 팝업 → 연봉 알아보기 버튼 | 신규 |
| competition.html | evidence/sample-report.html | 3초 추천 팝업 (세션 1회) | |
| evidence/sample-report.html | evidence/aptitude.html | ⑦ 인적성검사 시작 버튼 | |
| evidence/aptitude.html | evidence/sample-report.html | 결과 후 '리포트로 돌아가기' | localStorage ncs_apt 전달 |
| evidence/sample-report.html | [YouTube 영상 팝업] | 응원 편지 → 응원 영상 버튼 | 신규 |
| package.html | staff/index.html | 히어로 '대학관계자용' 버튼 | |
| staff/index.html | evidence/sample-report.html | 프로모 배너 (상단) | |
| mypage.html | evidence/sample.html | 점수확인 탭 | |
| mypage.html | library-pdf.html | 자료실 탭 | |
| mypage.html | challenge/index.html | 사이드바 버튼 | |
| community_index.html | community_write.html | 글쓰기 버튼 | |
| community_index.html | community_post.html | 게시글 클릭 | ?id= |
| community_post.html | community_write.html | 수정 버튼 (본인만) | ?id= |
| gov/<slug>.html | competition.html | 경쟁률 확인 버튼 | |
| businessHR/index.html | businessHR/profiles/*.html | 인재 프로필 카드 클릭 | 신규 |
| GHR_website/index.html | ibtcc.kr/student.html (상담신청) | 문의하기·채용대행 버튼 | 신규 |
| hub/*.html | challenge/index.html | (트리거만, 링크 없음) | localStorage |
| student.html | evidence/sample-report.html | 하단 인라인 CTA | 신규 |
| gtelp-score.html | evidence/sample-report.html | 하단 인라인 CTA | 신규 |
| salary.html | inst/<기관>.html | NCS 연습문제·인적성 버튼 | 신규 |
주요 데이터 흐름
인적성 자가진단 데이터 흐름 (ncs_apt localStorage)
sample-report.html ⑦ 버튼
│
▼
aptitude.html (6문항 응답) ── 제출 ──→ localStorage `ncs_apt` = {scores:{6축}, ts}
│
▼ (돌아가기)
sample-report.html ── aptGet() 읽기 ──→ ⑦ 상태 '완료' + 인적성 차트 육각 레이더
백엔드/Supabase 미사용. 동일 오리진 localStorage로만 전달.
응원 멘토의 편지 팝업 데이터 흐름 신규
evidence/sample-report.html
└── runAnalysis() 실행
├── d.qualified (합격권 기관) 확인
├── state.insts (선택 기관) 확인
└── 선택 기관이 합격권 미달일 때:
├── nearEntry.diff (합격컷 차이) 계산
├── PASS_MAP[기관명] → 난이도·합격선·평균·자격증·직렬 칩 생성
└── setTimeout 4000ms
└── #cta-modal 표시 (Step1: 봉투 애니메이션)
└── "편지 열기" 클릭
├── spTrack('letter:open') → page_views INSERT
└── Step2: 편지 내용 슬라이드업
└── "응원 영상" 버튼 클릭
└── YouTube iframe src 주입 → 영상 팝업
모바일→PC 진단 값 인계 신규
모바일에서 evidence/sample-report.html 입력
└── '간편 진단 즉시하기' 버튼 → URL 파라미터 또는 QR 코드 생성
└── PC에서 동일 URL 접속 → 입력값 자동 복원
뉴스레터 발행 흐름 신규
관리자 → 뉴스레터 제작 탭
└── HTML + 이미지 업로드 → Supabase Storage
└── newsletter_items 테이블 INSERT
├── newsletter/index.html → 목록 표시
├── newsletter/view.html → 상세 렌더링
└── index.html ACADEMIA 섹션 → 최신 3개 노출 (없으면 자동 숨김)
businessHR 인재 프로필 생성 흐름 신규
businessHR/index.html 등록 폼
└── Supabase INSERT (비자·학업현황·직무·언어 등)
└── generate_profiles.py 실행
└── businessHR/profiles/*.html 75개 생성 (SEO 정적 페이지)
미션 트리거 관계
[트리거 페이지] [감지] [결과]
competition.html ──────────────→ mission_competition ──→ +20 EXP
(DOMContentLoaded)
evidence/sample.html ──────────→ mission_score ─────────→ +50 EXP
(analyze() 실행 후)
hub/electric.html ─────────────→ mission_hub ───────────→ +20 EXP
hub/computer.html ─────────────→ mission_hub
hub/mechanical.html ───────────→ mission_hub
hub/admin.html ────────────────→ mission_hub
(DOMContentLoaded)
company/index.html ────────────→ mission_bookmark ──────→ +30 EXP
(toggleFav — ★ 등록 시만)
challenge/index.html ──────────→ attendance (출석) ─────→ +10 EXP
(로그인 후 자동)
페이지 ↔ Supabase 테이블 의존성
index.html
index.html
├── READ popup_ads ← 팝업광고
├── READ youtube_shorts ← 유튜브 쇼츠
├── READ newsletter_items ← ACADEMIA 섹션 최신 3개 [신규]
└── RPC consultation_count() ← 누적 신청수 (개수만)
competition.html
competition.html
├── READ alio_jobs ← 경쟁률 데이터
├── READ alio_source_cache ← 원본 캐시
├── READ pass_statistics ← 합격점수
├── WRITE pass_statistics ← 합격점수 제보
├── READ job_postings ← 채용공고 연동
└── WRITE page_views ← 방문 추적
evidence/sample-report.html 의존성 확장
evidence/sample-report.html
├── READ pass_cut_public ← 합격컷 집계 뷰 [신규]
├── READ pass_cert_public ← 합격 자격증 집계 뷰 [신규]
├── READ pass_exp_public ← 합격 경험 집계 뷰 [신규]
├── READ pass_specs_public ← 합격자 스펙 집계 뷰 [신규]
├── READ alio_jobs ← 경쟁률 (직군별 instRatio)
├── WRITE page_views ← 방문 추적 + :letter:open 이벤트 [신규]
└── WRITE session_views_test ← 세션 정밀 추적
staff/index.html 의존성 확장
staff/index.html
├── RPC staff_login ← 공용 비번 로그인 검증
├── READ pass_cut_public ← ①합격컷 탭 [신규]
├── READ alio_jobs ← ②경쟁률 분석 탭 [신규]
├── READ job_calendar ← ③채용 일정 탭 [신규]
└── READ pass_cert_public ← ④합격 자격증 탭 [신규]
newsletter/ 신규
newsletter/index.html
└── READ newsletter_items ← 발행본 목록
newsletter/view.html
└── READ newsletter_items ← 발행본 상세 (?id=)
businessHR/index.html 신규
businessHR/index.html
├── READ/WRITE hr_profiles ← 인재 프로필 등록·조회
├── READ hr_companies ← CRM 기업 목록
├── WRITE hr_companies ← 기업 등록·수정
└── WRITE page_views ← 방문 추적 (admin businessHR 통계 탭)
inst/index.html 신규
inst/index.html
├── READ exam_questions ← 기관별 기출문제 (5문항 이상)
├── READ pass_cut_public ← 기관 합격컷 정보
└── WRITE page_views ← inst/ 방문 추적 (admin 통계)
admin-k9x3.html 의존성 대폭 확장
admin-k9x3.html
├── READ/WRITE student_applications
├── READ/WRITE consultations
├── READ/WRITE school_programs
├── READ/WRITE university_news
├── READ/WRITE staff_job_postings
├── READ/WRITE job_postings
├── READ/WRITE company_news
├── READ/WRITE youtube_shorts
├── READ/WRITE popup_ads
├── READ/WRITE university_sites ← 수집 사이트 관리
├── READ/WRITE pass_statistics ← 합격제보 관리
├── READ/WRITE pass_cut_public ← 기관별 합격컷 표
├── READ/WRITE exam_questions ← 기출문제 탭 [신규]
├── READ tutor_logs ← AI 튜터 질문 로그 [신규]
├── READ/WRITE tutor_qa ← AI 튜터 Q&A [신규]
├── READ/WRITE newsletter_items ← 뉴스레터 제작 탭 [신규]
├── READ/WRITE site_updates ← 업데이트 관리 탭 [신규]
├── READ/WRITE insight_reports ← 인사이트 탭 [신규]
├── READ page_views ← 통계 + businessHR 통계 탭
├── READ session_views_test ← 이동경로 분석 탭 (RPC 집계)
├── READ download_logs
└── READ auth.users ← 회원관리
기타 페이지
university-board.html
├── READ school_programs ← 대학활동 (type: 활동)
├── READ university_news ← 대학소식 (type: 소식)
└── READ staff_job_postings ← 직원채용 (type: 채용, school_name 일치 시만)
community_index.html
└── READ community_posts ← 목록 (is_deleted=false)
community_write.html
├── WRITE community_posts ← 글쓰기 (INSERT)
├── UPDATE community_posts ← 수정 (본인만)
└── WRITE Storage(community-images)
community_post.html
├── READ community_posts ← 상세
└── RPC soft_delete_post ← 소프트삭제
challenge/index.html
├── READ/WRITE challenge_users ← EXP·레벨·스트릭·미션
├── WRITE exp_logs
├── WRITE attendance
└── READ challenge_users ← 리더보드 (현재 숨김)
mypage.html
├── READ pass_statistics
├── READ university_news ← 랜덤 9개
├── READ job_postings ← 채용달력
├── READ alio_jobs ← 마이데이터
└── WRITE page_views
updates.html [신규]
└── READ site_updates ← 업데이트 소식 목록
인증(Auth) 의존성
Supabase Auth
├── 로그인 필요 (미로그인 시 리다이렉트 또는 모달)
│ ├── community_write.html → community_index.html으로 리다이렉트
│ ├── challenge/index.html → 로그인 모달
│ └── mypage.html → 로그인 모달
│
├── 로그인 시 기능 확장 (미로그인도 기본 조회 가능)
│ ├── competition.html → ★ 즐겨찾기 활성화
│ ├── evidence/sample.html → ★ 즐겨찾기 활성화
│ └── community_index.html → 글쓰기 버튼 활성화
│
├── 공용 비밀번호 로그인 (Supabase RPC, 세션 유지)
│ └── staff/index.html → staff_login RPC → pass_cut_public + alio_jobs 등
│
└── 관리자 전용 (이메일 화이트리스트 + 진짜 Supabase Auth, 2026-06-03~)
├── admin-k9x3.html → signInWithPassword 세션 필수 (PII RLS 조회용)
└── marketing-intel.html → 이메일+비번 Auth 게이트
RLS 의존성
is_admin() = (auth.jwt()->>'email' = 'a9723992@gmail.com')
consultations / student_applications
├── INSERT : anon 허용 ← student.html, competition.html
├── SELECT : is_admin()만 ← admin-k9x3.html (진짜 세션 필요)
└── UPDATE/DELETE : is_admin()만
consultation_count() RPC (SECURITY DEFINER, anon 실행 가능)
└── index.html 히어로 "누적 신청수" — 개수만 노출
pass_specs (개인정보 다차원 스펙)
├── INSERT : anon 허용 ← 합격데이터 변환 탭 (관리자)
├── SELECT : is_admin()만
└── 공개: pass_specs_public 집계뷰만 (개별행 비노출)
공유 localStorage 키
| 키 | 기록 페이지 | 읽기 페이지 | 용도 |
mission_competition | competition.html | challenge/index.html | 미션 완료 날짜 |
mission_score | evidence/sample.html | challenge/index.html | 미션 완료 날짜 |
mission_bookmark | company/index.html | challenge/index.html | 미션 완료 날짜 |
mission_hub | hub/*.html | challenge/index.html | 미션 완료 날짜 |
ncs_apt | evidence/aptitude.html | evidence/sample-report.html | 인적성 6축 점수 전달 |
gtelp_notrack | evidence/sample.html | 모든 추적 페이지 | 관리자 방문 제외 |
ibtcc-user-auth | Supabase SDK | challenge/index.html | 인증 토큰 |
크롤러 파이프라인 의존성
수집시작.bat
└── server.py (127.0.0.1:8765)
├── /detect → agent_selector.py
│ └── READ/WRITE university_sites (셀렉터 자동 저장)
│
├── /run → agent_automation.py
│ ├── agent_collector.py
│ │ └── READ university_sites (수집 대상 목록)
│ ├── agent_comparator.py
│ │ └── READ school_programs (중복 비교, is_deleted 포함)
│ └── agent_publisher.py
│ └── WRITE school_programs (새 글만 INSERT)
│
└── /tbl-recruit → businessHR 현지채용공고 수집 [신규]
└── WRITE hr_jobs (또는 staff_job_postings)
pSEO 정적 페이지 생성 의존성
gov/ (기관별 채용공고, 40개)
works/govjobs/data.json → gen_seo_pages.py → gov/*.html + sitemap.xml
inst/ (공기업 준비 가이드, 53개 기관 + 33개 채용공고) [신규]
inst/index.html (수동 관리, 기출문제 5문항+ 기관)
businessHR/profiles/ (인재 프로필, 75개) [신규]
businessHR/generate_profiles.py → businessHR/profiles/*.html
sitemap.xml 통합 현황:
├── gov/ 40개 기관 + 카테고리 4 + index 1
├── jobs/ 896개 채용공고 페이지 [신규]
├── inst/ 53개 기관 + 33개 채용공고
└── 기타 방문자 페이지 약 40개
총: 2312 URL
Vercel Cron 의존성
| 스케줄 | 파일 | 대상 테이블 | 동작 |
| UTC 15:05 (KST 00:05) | api/challenge-cron.js | challenge_users | 일일 미션 초기화 (missions_today 리셋, 스트릭 계산) |
세션 정밀 이동경로 추적 (session_views_test)
- 기존
page_views(페이지별 합계)와 완전 별개 테이블, 병렬 기록
- 컬럼: visitor_id(localStorage 영구) / session_id(sessionStorage, 30분 무활동 시 새 세션) / seq(순번) / page / referrer / dwell_seconds / ua / visited_at
- 적용: 방문자 페이지 39개 + community/posts 생성기 템플릿. 관리자·분석·테스트 페이지 제외
- 관리자: admin-k9x3.html → 이동경로 분석 탭 (RPC 서버 집계로 전환, 속도 대폭 개선)
- 검증: 멀티홉 세션 9페이지 seq 1→9 정확 기록 확인 완료