ezinc 가이드 문서
Search posts...
Books

Categories

  • All Posts17
  • 3rabbitz1
  • 클립리포트6
  • Ezworks3
  • Git7
Git Static Doc Server|Build: main#277(aa06ea28)
Open Source Licenses
General•2026년 6월 25일

안동과학대 개발 참고 사항

안동과학대 프로젝트 전환 사업 개발 시 참고해야 할 사항을 정리한 문서입니다.

1. 맞춤법 표기

화면에서 년도와 같은 맞춤법이 맞지 않는 표기는 별도 변환 없이 그대로 신규 프로그램에 작성합니다.

2. 메시지 코드 변환

구 시스템에서는 다음과 같이 메시지를 호출합니다.

frmf_GetMessage("warn.00003", "업로드할 파일을");

메시지 코드 표 (gds_Message 데이터셋)

구분 호출 코드 등록 코드 메시지 내용 비고
Error error.00000 ui.error.00000 {0}
error.00001 ui.error.00001 {0} 할 수 없습니다.
error.00002 ui.error.00002 {0} 권한이 없습니다.
error.00003 ui.error.00003 {0} 초과하였습니다.
error.00004 ui.error.00004 {0} 일치하지 않습니다.
error.00005 ui.error.00005 {0} 유효하지 않습니다.
error.00006 ui.error.00006 {0} 중복되었습니다.
error.00007 ui.error.00007 {0} 오류가 발생하였습니다.
error.00008 ui.error.00008 {0} 존재합니다.
error.00009 ui.error.00009 {0} 등록되어있습니다.
error.00010 ui.error.00010 {0} 마감되었습니다.
error.00011 ui.error.00011 {0} 중지되었습니다.
error.00012 ui.error.00012 {0} 마감되지않았습니다.
Info info.00000 ui.info.00000 {0}
info.00001 ui.info.00001 {0} 처리되었습니다.
info.00002 ui.info.00002 {0} 완료되었습니다.
info.00003 ui.info.00003 {0} 할수있습니다.
info.00004 ui.info.00004 {0} 등록되었습니다.
Quest quest.00000 ui.quest.00000 {0} Confirm창
quest.00001 ui.quest.00001 {0} 삭제 하시겠습니까?
quest.00002 ui.quest.00002 {0} 저장 하시겠습니까?
quest.00003 ui.quest.00003 {0} 실행 하시겠습니까?
quest.00004 ui.quest.00004 {0} 취소 하시겠습니까?
quest.00005 ui.quest.00005 {0} 진행 하시겠습니까?
quest.00006 ui.quest.00006 {0} 하시겠습니까?
Warn warn.00000 ui.warn.00000 {0}
warn.00001 ui.warn.00001 {0} 필수입력값입니다.
warn.00002 ui.warn.00002 {0} 입력하십시오.
warn.00003 ui.warn.00003 {0} 선택하십시오
warn.00004 ui.warn.00004 {0} 존재하지 않습니다.
warn.00005 ui.warn.00005 {0} 변경되었습니다.
warn.00006 ui.warn.00006 {0} 확인해주십시오.
warn.00007 ui.warn.00007 {0} 추가해주십시오.
warn.00008 ui.warn.00008 {0} 저장하십시오.
warn.00009 ui.warn.00009 {0} 삭제하십시오.
warn.00010 ui.warn.00010 {0} 조회하십시오.
warn.00011 ui.warn.00011 {0} 사용하십시오.
Default default.00000 ui.default.00000 {0}

동작 원리

frmf_GetMessage(msgNo, args) 호출 시:

  1. msgNo에 "ui." 접두사를 붙여 gds_Message에서 메시지를 조회합니다.
  2. args 문자열로 {0}, {1} 등의 플레이스홀더를 치환합니다. 복수 인자는 ^로 구분합니다.[1]
  3. msgNo의 Prefix(quest, error, warn, info)에 따라 팝업 유형이 결정됩니다.
Prefix 팝업 유형 아이콘
quest Confirm (확인/취소) question
error Alert error
info Alert information
warn Alert warning
그 외 Alert default

3. 신규 시스템(tis) 메시지 변환 규칙

신규 시스템에서는 frmf_GetMessage 대신 this.pop.alert / this.pop.confirm을 사용하며, 메시지 코드 대신 문자열 리터럴을 직접 전달합니다.

Alert 변환

// 구 시스템
frmf_GetMessage("warn.00003", "업로드할 파일을");

// 신규 시스템
this.pop.alert("업로드할 파일을 선택하십시오.");

Confirm 변환

this.pop.confirm은 Promise를 반환하므로 async-await으로 처리합니다.

// 구 시스템
if (frmf_GetMessage("quest.00001", "선택 항목을")) {
    this.fn_delete();
}

// 신규 시스템
this.fn_delete = async function() {
    const confirmResult = await this.pop.confirm({
        id  : "popConfirmDelete",
        msg : "선택 항목을 삭제 하시겠습니까?"
    });

    if (confirmResult.data) {
        // 삭제 처리
    }
};

4. 즉시 삭제(DB 삭제) 처리

titlebar_config.xjs에서 프로젝트 전역으로 deleteOnSave=false가 설정되어 있어, 삭제 버튼 클릭 시 즉시 서버에 삭제를 요청합니다.

NOTE

EzTitlebar에 deleteSqlId 및 targetGrid 속성이 지정되어 있어야 즉시 삭제가 동작합니다. 특정 화면에서 저장 시점에 일괄 삭제하려면 해당 EzTitlebar의 deleteOnSave를 true로 설정합니다.

커스텀 트랜잭션으로 즉시 삭제 구현

deleteSqlId 속성을 사용하지 않고 스크립트에서 직접 삭제를 처리하는 경우, 화면 구조에 따라 아래와 같이 구현합니다.

IMPORTANT

tx.remove는 데이터셋의 삭제 버퍼에 있는 행만 서버로 전송합니다. 따라서 deleteCheckedRows() 또는 deleteRow()로 로컬 행을 먼저 삭제 상태로 변경한 뒤 트랜잭션을 호출해야 합니다.


[유형 1] 공통 툴바 연동 (fn_canremove → fn_remove)

공통 프레임워크가 fn_canremove → fn_remove 순서로 호출합니다. $mpt.confirmRemove를 fn_canremove에서 호출하여 대상 검증 및 컨펌을 처리합니다.

다건 삭제 (체크박스)
this.fn_canremove = function(obj, e) {
    return $mpt.confirmRemove(this.tit_main);
};

this.fn_remove = async function() {
    this.tit_main.getCheckBox().deleteCheckedRows();
    return await this.fn_removeMain();
};

this.fn_removeMain = async function() {
    try {
        const result = await this.tx.remove({
            action : "basic",
            svcId  : "delete_list",
            sqlId  : "dev_0101_u01.d01",
            inDs   : "ds_main"
        });
    } catch (e) {
        $logger.error(e);
    }
};
단건 삭제 (선택 행)
this.fn_canremove = function(obj, e) {
    return $mpt.confirmRemove(this.ds_main);
};

this.fn_remove = async function() {
    this.ds_main.deleteRow(this.ds_main.rowposition);
    return await this.fn_removeMain();
};

this.fn_removeMain = async function() {
    try {
        const result = await this.tx.remove({
            action : "basic",
            svcId  : "delete_list",
            sqlId  : "dev_0101_u01.d01",
            inDs   : "ds_main"
        });
    } catch (e) {
        $logger.error(e);
    }
};

[유형 2] 화면 내부 타이틀바 연동 (canremove → onremove 오버라이드)

화면에 배치된 EzTitlebar의 이벤트를 직접 연동합니다. canremove 핸들러에서 $mpt.confirmRemove로 검증하고, onremove를 오버라이드하여 삭제를 실행합니다.

TIP

async 함수로 작성하면 자동으로 Promise가 반환되어 프레임워크와의 비동기 흐름이 정상 연계됩니다.

다건 삭제 (체크박스)
// [ PART 4 ] 사용자 TitleBar 버튼 함수, 이벤트
this.tit_main_onload = function(obj:nexacro.EzTitlebar, e:nexacro.EzTitlebarEventInfo) {
    obj.onremove = this.fn_removeMain.bind(this);
};

this.tit_main_canremove = function(obj:nexacro.EzTitlebar, e:nexacro.EzTitlebarEventInfo) {
    return $mpt.confirmRemove(obj);
};

// [ PART 5 ] Transaction 함수
this.fn_removeMain = async function() {
    this.tit_main.getCheckBox().deleteCheckedRows();

    try {
        const result = await this.tx.remove({
            action : "basic",
            svcId  : "delete_list",
            sqlId  : "dev_0101_u01.d01",
            inDs   : "ds_main"
        });
    } catch (e) {
        $logger.error(e);
    }
};
단건 삭제 (선택 행)
// [ PART 4 ] 사용자 TitleBar 버튼 함수, 이벤트
this.tit_main_onload = function(obj:nexacro.EzTitlebar, e:nexacro.EzTitlebarEventInfo) {
    obj.onremove = this.fn_removeMain.bind(this);
};

this.tit_main_canremove = function(obj:nexacro.EzTitlebar, e:nexacro.EzTitlebarEventInfo) {
    return $mpt.confirmRemove(this.ds_main);
};

// [ PART 5 ] Transaction 함수
this.fn_removeMain = async function() {
    this.ds_main.deleteRow(this.ds_main.rowposition);

    try {
        const result = await this.tx.remove({
            action : "basic",
            svcId  : "delete_list",
            sqlId  : "dev_0101_u01.d01",
            inDs   : "ds_main"
        });
    } catch (e) {
        $logger.error(e);
    }
};

5. setCombo mode:“A” — 구 시스템 LIKE 쿼리 대응

이 프로젝트의 구 시스템 SQL에는 콤보 검색 조건이 LIKE로 작성되어 있습니다. mode:"A"는 해당 쿼리를 수정하지 않고 그대로 사용할 수 있도록 hotfix.xjs에 추가한 기능입니다.

mode:"A" 설정 시 콤보 첫 항목(전체)의 code 값이 "%"로 삽입됩니다. "전체"를 선택하면 LIKE '%'가 되어 전체 조회, 특정 값을 선택하면 LIKE '코드값'으로 해당 항목만 조회됩니다.

mode 첫 번째 항목 code 값
"a" 전체 "" (빈 문자열)
"A" 전체 "%"

사용 예

this.fn_setCombo = function() {
    return this.combo.setCombo({
        action : "com",
        svcId  : "combo",
        comps  : [
            {
                comp    : this.div_search.form.cmb_regionCd,
                mode    : "A",
                sqlId   : "@comcd.s01",
                param   : "UP_CD='CS019'",
                mapping : { code : "CD", data : "CD_NM" },
            },
        ],
    });
};

SQL은 구 시스템 그대로 LIKE 조건을 유지합니다.

AND REGION_CD LIKE #{REGION_CD}
-- 전체 선택 시  → LIKE '%'   (전체 조회)
-- 특정값 선택 시 → LIKE '11'  (해당 항목만 조회)

  1. 예: frmf_GetMessage("error.00001", "학번^이름") → {0}에 학번, {1}에 이름이 치환됩니다. ↩︎

Previousnexacro-bridge-가이드NextGit 원격 저장소 주소 변경
← Back to all posts