안동과학대 개발 참고 사항
안동과학대 프로젝트 전환 사업 개발 시 참고해야 할 사항을 정리한 문서입니다.
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) 호출 시:
msgNo에"ui."접두사를 붙여gds_Message에서 메시지를 조회합니다.args문자열로{0},{1}등의 플레이스홀더를 치환합니다. 복수 인자는^로 구분합니다.[1]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' (해당 항목만 조회)
예:
frmf_GetMessage("error.00001", "학번^이름")→{0}에학번,{1}에이름이 치환됩니다. ↩︎