🔌 AJAX 통신 — 완전 분석

페이지와 서버 간의 모든 데이터 통신을 분석합니다. 어떤 주소로, 어떤 데이터를 보내고, 어떤 응답을 받는지 완전 정리.

📡 AJAX 개요

paper_card 페이지는 총 25개 이상의 AJAX 엔드포인트와 통신합니다. jQuery의 $.ajax()를 사용하며, 모든 통신은 비동기(Async)로 이루어집니다.

🗺️ 전체 엔드포인트 맵

📇 종이명함 관련 (핵심)

URLMethod보내는 데이터응답
[내부API]/[명함목록]GET[회원ID], [페이지], [개수], [정렬]명함 목록 HTML
[내부API]/[연락처처리]POST[액션](등록/수정/삭제), [명함정보]{result: "success"}
[내부API]/[콘텐츠처리]POST[액션], [콘텐츠ID], [화면명]처리 결과
[내부API]/[모드변경]POST[모드], [카드ID]상태 변경 결과
[내부API]/[즐겨찾기]POST[카드ID], [상태값]즐겨찾기 토글
[내부API]/[순서변경]POST[카드ID목록]순서 변경 결과
[내부API]/[게시글등록]POST[게시글정보]게시글 등록 결과

👥 연락처 & 친구

URLMethod보내는 데이터응답
[내부API]/[연락처조회]GET[소유자], [관리자], [범위], [번호개수], [페이지], [종이여부]연락처 목록 JSON
[내부API]/[친구조회]GET[회원ID], [페이지]친구 목록 HTML
[내부API]/[친구처리]POST[액션], [친구정보]친구 추가/삭제
[내부API]/[요청목록]GET[회원ID]요청 목록
[내부API]/[추천목록]GET[회원ID]추천 목록

🛒 IAM 몰 & 결제

URLMethod보내는 데이터응답
[내부API]/[상품조회]GET[개수], [위치], [화면명]상품 목록 HTML
[내부API]/[결제내역]GET[유형]결제 내역
[내부API]/[포인트결제]POST[금액], [방식]포인트 결제
[내부API]/[링크조회]GET[유형]IAM 링크

🤖 AI & 발송

URLMethod보내는 데이터응답
[내부API]/[발송처리]POST[정산유형], [결제수단], [금액], [메시지], [카드URL], [발송모드]발송 결과
[내부API]/[발송내역]GET[회원ID], [페이지]발송 내역
[내부API]/[프롬프트생성]POST[발신자정보]생성된 프롬프트
[내부API]/[채널설정]POST[채널설정값]채널 설정 저장
[내부API]/[서비스신청]POST[서비스정보]서비스 신청
[내부API]/[프로필확장]POST[프로필정보]프로필 확장

🔐 인증 & 기타

URLMethod보내는 데이터응답
[내부API]/[세션처리]POST[액션]세션 종료
[내부API]/[아이디확인]POST[아이디]중복 확인
[내부API]/[콘텐츠사용]POST[콘텐츠ID]콘텐츠 사용
[내부API]/[주소조회]GET회원 주소
[내부API]/[추가콘텐츠]GET[위치]추가 콘텐츠
[내부API]/[알림조회]GET알림 메시지

🔍 통신 패턴 분석

패턴 1: 목록 조회 (GET)

function getIamContact(card_owner, card_master, search_range, phone_count, page, paper_yn) {
    $.ajax({
        url: "[내부API]/[연락처조회]",          // ← 내부 API 주소
        type: "GET",                            // ← GET 방식
        data: {                                  // ← 쿼리 파라미터
            card_owner: card_owner,              //    '[사용자ID]'
            card_master: card_master,            //    '[관리자ID]'
            search_range: search_range,          //    검색 범위 (1~4)
            phone_count: phone_count,            //    전화번호 개수
            page: page,                          //    페이지 번호
            paper_yn: paper_yn                   //    종이명함 여부 (0/1)
        },
        dataType: "json",                        // ← JSON 응답 기대
        beforeSend: function() {
            busy = true;                         // ← 중복 요청 방지
            $("#ajax_loading").show();           // ← 로딩 표시
        },
        success: function(response) {
            // 응답 HTML을 .sample_main에 추가
            $(".sample_main").append(response.html);
        },
        complete: function() {
            busy = false;
            $("#ajax_loading").hide();
        }
    });
}

패턴 2: 데이터 변경 (POST)

// contact_submit_paper() - 종이명함 저장
function contact_submit_paper() {
    $.ajax({
        url: "[내부API]/[연락처처리]",
        type: "POST",
        data: {
            action: "[액션]",              // ← 액션 구분자
            name: $("#paper_name").val(),        // ← 폼 데이터
            job: $("#paper_job").val(),
            organization: $("#paper_organization").val(),
            mobile: $("#paper_mobile").val(),
            // ... 더 많은 필드 ...
        },
        success: function(res) {
            if (res.result === "success") {
                refresh_page();                  // ← 성공 시 갱신
            }
        }
    });
}

🌊 데이터 흐름도

                        ┌──────────────┐
                        │   사용자     │
                        │  (브라우저)  │
                        └──┬───────┬──┘
                           │       │
              클릭/입력    │       │  AJAX 응답 (JSON/HTML)
                           ▼       ▲
              ┌────────────────────────┐
              │   JavaScript 함수      │
              │                        │
              │  getIamContact()       │
              │  getIamPaper()         │
              │  contact_submit()      │
              │  settlement()          │
              │  ...                   │
              └───────────┬────────────┘
                          │
              $.ajax()    │
              POST/GET    ▼
              ┌────────────────────────┐
              │   PHP 서버             │
              │                        │
              │  [내부API]/*.php       │
              │  [내부API]/*.php           │
              │  [내부API]/[명함발송]│
              └───────────┬────────────┘
                          │
              SQL 쿼리    │
                          ▼
              ┌────────────────────────┐
              │   MySQL DB             │
              │   - paper_cards        │
              │   - contacts           │
              │   - payments           │
              │   - ai_prompts         │
              └────────────────────────┘
⚠️ 중요한 보안 포인트
  • 모든 AJAX 요청은 cur_win=paper_card 파라미터를 포함해서 서버가 현재 페이지를 식별하게 합니다.
  • busy 플래그로 중복 요청을 방지합니다 (true일 땐 새 요청 거부).
  • 로그인 상태는 PHP 세션 + AJAX 응답에서 확인합니다.
  • cur_win_name 변수는 [보안패치] 마크가 붙어있어 XSS 방지 목적입니다.

🎓 초등학생도 따라하는 AJAX 분석

1
F12 → Network 탭
크롬에서 F12 누르고 Network 탭 클릭
2
XHR 필터 적용
Network 탭 위쪽에서 "XHR" 버튼 클릭 → AJAX만 보기
3
페이지 새로고침
F5 누르면 모든 AJAX 요청이 목록에 쭉 뜹니다!
4
요청 하나 클릭
오른쪽에 Headers(요청 정보), Preview(응답 미리보기), Response(원본 응답) 탭 확인
5
Payload 확인
어떤 데이터를 서버에 보냈는지 확인 가능. 종이명함 정보가 그대로 보여요!