⏱️ 페이지 생명주기 (Lifecycle) 완전 분석
페이지가 로드되고, 실행되고, 소멸될 때까지 어떤 순서로 코드가 실행되는지 초 단위로 분석합니다.
전체 실행 타임라인
T+0ms 브라우저가 URL(/?cur_win=paper_card)로 HTTP GET 요청 전송
T+50ms 서버가 index.php 실행, PHP 세션 복원, 사용자 인증 확인
T+80ms PHP가 HTML 생성 시작 ( 태그 출력)
T+90ms CSS 파일 10개 로드 시작 (병렬, 브라우저가 처리)
T+100ms 종료, 시작
T+310ms ★ DOMContentLoaded 이벤트 발생
└── 등록된 jQuery ready 핸들러들 실행
T+310ms jQuery.ready() #1 실행
├── for(i=0;i<3;i++):
│ ├── #alertid0, #alertid1, #alertid2 확인
│ └── 쿠키에 해당 알림ID 없으면 showIframeModal()
T+315ms ★★★ jQuery.ready() #2 실행 (메인 초기화)
├── cur_win_name = "paper_card" 설정
├── key1_gwc_show == '4' 확인 → 분기
│ ├── [일반모드] wecon_search_div 표시, scroll="overflow-y:hidden"
│ └── [와이드모드] 레이아웃 조정, 미디어 높이 계산
├── bottom_wt = $("#bottom").width()
├── checkMobile() 호출 → 화면 크기에 따라 카드 너비 설정
│ ├── 모바일: 카드 49% (2열)
│ └── 데스크탑: 카드 24% (4열)
└── console.log('paper_card', '')
T+350ms HTML 파싱 완료, body 렌더링 시작
├── 헤더 표시 (position:fixed, top:0)
├── footer_menu 표시 (position:fixed, bottom:0)
└── #middle 영역: 검색창, 정렬, +버튼, 리스트 영역
T+400ms ★ AJAX 데이터 로딩 시작
├── getIamPaper('[사용자ID]','[관리자ID]','','0',1) 호출
│ └── GET → [내부API]/[명함목록]
│ 파라미터: card_owner=[사용자ID], page=1 등
│ 응답: HTML (명함 리스트)
│ → #papercard_list에 삽입
└── displaySample(lim, off) 호출
└── GET → [내부API]/[콘텐츠조회]
파라미터: limit, offset, sample_type=paper_card
응답: HTML → .sample_main에 추가
T+600ms 서버 응답 도착, 리스트 렌더링 완료
└── 사용자에게 종이명함 목록 표시
T+1000ms 이후: 사용자 인터랙션 대기 상태
├── 스크롤 이벤트 → panelGroupState 처리
├── 클릭 이벤트 → 각종 함수 호출
├── 검색어 입력 → paper_submit()
├── +버튼 클릭 → add_paper_card() (앱에서만)
├── 편집 클릭 → create_paper() or edit_papersender()
└── 결제 버튼 → settlement()
T+2000ms sign_toggle() 첫 번째 실행
└── .blink 요소 색상 토글 (#0fc5b5 ↔ #ec0e03)
T+4000ms sign_toggle() 두 번째 실행
T+6000ms sign_toggle() 세 번째 실행
... (2초마다 계속 반복)
생명주기 5단계
1단계: 요청 & 인증 (0~80ms)
브라우저가 URL로 HTTP GET 요청을 보내면, 서버의 PHP(index.php)가 실행됩니다. PHP는 세션을 확인하고 로그인 상태를 검증합니다. HTML 생성에 필요한 사용자 정보(사용자ID, 카드소유자, 사이트설정 등)를 PHP 변수로 준비합니다.
2단계: 리소스 로딩 (80~250ms)
CSS 10개와 JS 11개 파일을 순차적으로 로드합니다. 주요 의존성 순서: jQuery → main.js → bootstrap.js → rlatjd.js → chat.js. 이 단계에서 전역 유틸리티 함수들이 정의됩니다.
3단계: 초기화 (250~350ms)
가장 중요한 단계입니다. 인라인 스크립트가 실행되며: ① 전역 변수 선언, ② 80+ 비즈니스 함수 정의, ③ jQuery ready 핸들러 등록, ④ sign_toggle 인터벌 시작, ⑤ DOM 요소 접근 및 스타일 조정.
4단계: 데이터 로딩 (350~600ms)
AJAX 요청으로 실제 데이터를 서버에서 가져옵니다. getIamPaper()가 명함 목록 HTML을 받아와 #papercard_list에 렌더링합니다. 이 시점에 사용자가 실제 콘텐츠를 보게 됩니다.
5단계: 상호작용 (600ms ~ 페이지 이탈)
완전히 로드된 상태에서 사용자 입력을 기다립니다. 이벤트 리스너가 클릭, 스크롤, 키보드 입력을 감지하고 적절한 함수를 호출합니다. sign_toggle은 2초마다 계속 실행되며 온라인 상태 표시등을 점멸시킵니다.
💡 초등학생을 위한 비유: 이 과정은 마치 레고로 성을 쌓는 것과 같아요. ① 먼저 설명서를 보고(요청), ② 필요한 블록들을 꺼내고(리소스 로딩), ③ 블록들을 분류해서 준비하고(초기화), ④ 블록을 조립해서 성을 만들고(데이터 로딩), ⑤ 다 만든 성으로 놀기 시작하는 거예요(상호작용)!
주요 포인트
- jQuery.ready()는 두 번 등록됩니다: #1은 알림팝업, #2는 메인 초기화
- sign_toggle()은 페이지가 열려있는 동안 계속 2초 간격으로 실행됩니다 (CPU 사용 주의)
- checkMobile()은 User-Agent를 분석해 모바일 여부를 판단합니다 (서버사이드가 아닌 클라이언트사이드)
- key1_gwc_show는 PHP에서 주입되는 값으로, 와이드 레이아웃 모드를 결정합니다
- 실제 데이터는 AJAX로 비동기 로딩되므로, DOM 로드 완료 != 데이터 표시 완료