📇 종이명함 등록·수정·삭제 (CRUD) 완전 분석

종이명함을 등록(Create), 수정(Update), 삭제(Delete)하는 모든 함수와 데이터 흐름을 상세히 분석합니다.

전체 CRUD 개요

작업트리거함수모달AJAX
📸 앱 카메라 등록+ 버튼 (앱)add_paper_card()-- (네이티브)
✏️ 직접 입력 등록create_paper() 호출create_paper() → save_paper()#paper_list_edit_modalPOST [내부API]/[명함관리]
🔧 수정리스트 항목 클릭(리스트 항목 data 로드) → save_paper()#paper_list_edit_modalPOST [내부API]/[명함관리]
🗑️ 개별 삭제리스트 삭제 아이콘delete_paper(id)-POST [내부API]/[명함관리]
🗑️ 일괄 삭제체크박스 선택 + 삭제버튼paper_del()-POST [내부API]/[연락처처리]

1. 등록 (Create)

방법 A: 앱 카메라 등록 — add_paper_card()

function add_paper_card() {
    try {
        callAppBridge('goCardCamera');   // Android: AppScript.goCardCamera()
    } catch (e) {                       // iOS: webkit.messageHandlers['goCardCamera']
        alert("휴대폰에서 이용해주세요.");
    }
}

이 함수는 오직 앱(Android/iOS WebView)에서만 동작합니다. 데스크탑에서는 alert만 표시됩니다. 앱 내에서 실행되면 네이티브 카메라를 열어 명함을 촬영하고, 촬영된 이미지는 서버로 전송되어 OCR 처리됩니다.

#paper_plus 버튼은 기본적으로 display:none이며, 앱 환경에서만 표시됩니다.

방법 B: 직접 입력 등록 — create_paper() → save_paper()

function create_paper() {
    // 1. 모든 입력 필드 초기화 (빈 값으로)
    $("#paper_name").val("");       // 이름
    $("#paper_job").val("");        // 직책
    $("#paper_org").val("");        // 기관명
    $("#paper_addr").val("");       // 주소
    $("#paper_phone1").val("");     // 전화1
    $("#paper_phone2").val("");     // 전화2
    $("#paper_mobile").val("");     // 휴대폰
    $("#paper_fax").val("");        // 팩스
    $("#paper_email1").val("");     // 이메일
    $("#paper_email2").val("");     // 홈페이지
    $("#paper_memo").val("");       // 메모
    $("#paper_contact_idx").val("");// 연락처 인덱스
    $("#paper_display_top").prop("checked", false); // 내 명함등록 체크 해제

    // 2. AI 알림 숨김
    var n = document.getElementById('paper_ai_notice');
    if (n) n.style.display = 'none';

    // 3. 모달 표시
    $("#paper_list_edit_modal").modal("show");
}

save_paper() — 실제 저장 함수

function save_paper() {
    // 1. 중복 저장 방지 (세마포어)
    if (window._saving_paper) return;
    window._saving_paper = true;

    // 2. 모든 입력값 수집
    var data = {
        seq: $("#paper_seq").val(),       // 수정 시 기존 ID
        name: $("#paper_name").val(),
        job: $("#paper_job").val(),
        org_name: $("#paper_org").val(),
        address: $("#paper_addr").val(),
        phone1: $("#paper_phone1").val(),
        phone2: $("#paper_phone2").val(),
        mobile: $("#paper_mobile").val(),
        fax: $("#paper_fax").val(),
        email: $("#paper_email1").val(),
        website: $("#paper_email2").val(),  // 홈페이지는 email2 필드 사용
        memo: $("#paper_memo").val(),
        display_top: $("#paper_display_top").prop("checked") ? 1 : 0,
        img_url: $("#paper_img_url").val()
    };

    // 3. AJAX POST 전송
    $.ajax({
        type: "POST",
        url: "[내부API]/[명함관리]",
        data: data,
        dataType: "json",
        success: function(resp) {
            alert("저장되었습니다.");
            $("#paper_list_edit_modal").modal("hide");
            refresh_page(); // 페이지 새로고침
        }
    });
}

2. 수정 (Update)

수정은 리스트의 각 항목을 클릭할 때 발생합니다. 각 리스트 항목에는 data-* 속성으로 모든 정보가 저장되어 있고, 클릭 시 이 데이터를 모달의 입력 필드에 채워 넣습니다. 이후 save_paper()가 호출되면 seq 값이 있으므로 서버에서 UPDATE 쿼리가 실행됩니다.

3. 삭제 (Delete)

개별 삭제 — delete_paper(id)

function delete_paper(id) {
    if (confirm('삭제하시겠습니까?')) {
        $.ajax({
            type: "POST",
            url: "[내부API]/[명함관리]",
            dataType: "json",
            data: { seq: id, del: 'Y' },
            success: function(data) {
                if (checkMobile()) callAppBridge('setClearCache'); // 앱 캐시 삭제
                alert('삭제되었습니다.');
                $("#paper_list_" + id).remove(); // DOM에서 제거
                if ($(".paper_list").length == 0) {
                    $("#papercard_list").html("

종이명함이 없습니다.

"); } } }); } }

일괄 삭제 — paper_del()

function paper_del() {
    var formData = new FormData();
    formData.append('mode', "del");
    // 체크된 모든 명함의 ID 수집
    for (i = 0; i < $("input[name=paper_chk]:checked").length; i++) {
        formData.append('contact_idx[]', $("input[name=paper_chk]:checked").eq(i).val());
    }
    $.ajax({
        type: "POST",
        url: "[내부API]/[연락처처리]",
        data: formData,
        contentType: false,
        processData: false,
        success: function(data) {
            alert(data);
            // DOM에서 삭제된 항목들 제거
            var del_count = $("input[name=paper_chk]:checked").length;
            for (i = 0; i < del_count; i++) {
                $("input[name=paper_chk]:checked").eq(0).parents(".list-item").remove();
            }
        }
    });
}
⚠️ 주의사항: 삭제는 되돌릴 수 없습니다! 삭제 전에 반드시 confirm() 대화상자로 사용자 확인을 받습니다. 또한 앱 환경에서는 callAppBridge('setClearCache')를 호출해 로컬 캐시도 함께 삭제합니다.

초등학생을 위한 CRUD 설명