# 배움터 인사 정보 일일 자동 동기화 로직 통합 및 최적화 작성일: 2026-04-20 대상 파일: `www/edu/bbs/entry.php`, `www/edu/ajax/get_users_info.php` ## 1. 배경 및 목적 - 현재 인사 정보 수집(`get_users_info.php`)과 진입 처리(`entry.php`)가 분리되어 있음. - 이를 통합하여 매일 배움터 첫 접속자가 자동으로 ERP API 데이터를 수집하고 DB를 동기화하도록 구성한다. - 이후 접속자는 동기화를 건너뛰고 기존 로그인/세션/리다이렉트 흐름을 유지한다. ## 2. 요구사항 정리 ### 2.1 동기화 체크 - `entry.php`에서 DB 연결 직후 `edu_users_daily_logs`를 조회한다. - 조건: `CAST(injection_at AS DATE) = CURDATE()`. - 오늘 실행 이력이 없으면 `is_done === 0`으로 판단. ### 2.2 조건부 실행 - `is_done === 0`일 때만 아래 2단계를 수행: 1. `get_users_info.php`를 호출해 외부 ERP API 데이터를 `edu_users_temp`에 적재. 2. `CALL proc_edu_users_daily(?)` 실행으로 `temp -> edu_users` 반영. ### 2.3 예외 처리 - 대량 데이터(약 1.2만 건) 처리에서 타임아웃이 발생하지 않도록 `set_time_limit(0)` 적용 상태를 점검. - 동기화 실패는 별도 로그로 남기되, 사용자 로그인/세션 생성/리다이렉트를 차단하지 않도록 `try-catch`로 분리. ### 2.4 브라우저 판별 개선 - 접속 로그 브라우저 판별에서 Whale을 Chrome보다 먼저 체크. - 판별 우선순위 예시: `Whale -> Edge -> Chrome -> Firefox -> Safari`. ## 3. 통합 처리 시퀀스 1. `entry.php` POST 파라미터 검증. 2. DB 연결. 3. 오늘 동기화 이력 확인(`edu_users_daily_logs`). 4. 이력 없음: - ERP API 수집 실행(`get_users_info.php`) - 일일 반영 프로시저 실행(`proc_edu_users_daily`) - 실패 시 로그 후 계속 진행. 5. 사용자 조회(`edu_users`). 6. 세션 초기화/재생성 후 세션 값 저장. 7. 접속 로그 저장(Whale 우선 판별 반영). 8. 기존 `intro_flag` 분기 유지: - `1` -> `/edu/skin/index.php` - `0` -> `intro_flag` 업데이트 후 `/edu/skin/intro.php` ## 4. 유지해야 할 기존 동작 - `intro_flag` 기반 리다이렉트 분기 로직 유지. - 사용자 조회 키(`member_id`, `sys_comp_code`) 유지. - 기존 세션 초기화 및 재발급(`session_unset`, `session_regenerate_id`) 유지. ## 5. 운영 안정화 포인트 - 첫 접속자 실행 중 동시 요청(레이스 컨디션) 방지를 위해 DB 레벨 동기화 잠금 전략 검토. - 동기화 스크립트의 표준 출력(`echo`)이 entry 응답 헤더에 영향을 주지 않도록 구조 분리 권장. - 동기화 실패 시 사용자 진입은 허용하되, 알람/로그로 운영자 추적 가능해야 함. ## 6. 기대 결과 - 하루 첫 접속자만 동기화를 수행. - 이후 접속자는 동기화를 건너뛰고 빠르게 진입. - 목표 데이터 최신성은 일일 기준으로 자동 확보. - 사용자 진입 안정성(로그인 차단 방지) 보장. ## 7. 검증 체크리스트 1. 당일 첫 접속 시 동기화 실행 여부 확인. 2. 동일 날짜 두 번째 접속부터 동기화 미실행 확인. 3. 동기화 실패 상황에서 로그인/리다이렉트 정상 진행 확인. 4. Whale 접속 로그가 Chrome이 아닌 Whale로 저장되는지 확인. 5. `intro_flag` 분기 동작이 기존과 동일한지 확인.