From 124df00f51f6f412417783d786ead0f579f6e862 Mon Sep 17 00:00:00 2001 From: "Rinjae(gf63)" Date: Fri, 11 Sep 2026 18:38:50 +0900 Subject: [PATCH] =?UTF-8?q?-=20Gradle=20=EC=8B=A4=ED=96=89=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80=20(clean,=20compileJava)=20-=20A?= =?UTF-8?q?PI=20=ED=8E=B8=EC=A7=91=EA=B8=B0=20=EB=8B=AB=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=84=20=EB=B3=80=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC/=ED=99=95=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20=EC=A0=80=EC=9E=A5=20=EC=84=B1=EA=B3=B5/?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=EB=A1=9C=EB=93=9C=20=EC=8B=9C=EC=A0=90=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EC=8A=A4=EB=83=85=EC=83=B7=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B0=8F=20UI=20=EC=B2=98=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WebContent/js/djb/apispec/app.js | 12 +- .../resources/logback-rinjae_gf63_linux.xml | 184 ++++++++++++++++++ 2 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/logback-rinjae_gf63_linux.xml diff --git a/WebContent/js/djb/apispec/app.js b/WebContent/js/djb/apispec/app.js index cdc4a13..6ef3052 100644 --- a/WebContent/js/djb/apispec/app.js +++ b/WebContent/js/djb/apispec/app.js @@ -29,6 +29,14 @@ // (enricher 는 oauth·api_key 를 모두 apiKey-in-header 로 모델링하므로 scheme.type 만으로 구분 불가) var djbAuthType = ''; + // 마지막 저장(또는 최초 로드) 시점의 state.data 스냅샷 — 닫기 전 미저장 변경 여부 판별용. + var savedSnapshot = null; + function isDirty() { return savedSnapshot !== null && JSON.stringify(state.data) !== savedSnapshot; } + function closeEditor() { + if (isDirty() && !window.confirm('저장하지 않은 변경사항이 있습니다. 저장하지 않고 닫으시겠습니까?')) return; + window.close(); + } + // ============================================================ // 2. 유틸 // ============================================================ @@ -1703,7 +1711,7 @@ var bSave = $('#btn-save'); if (bSave) bSave.addEventListener('click', () => saveSpec(false)); var bRegen = $('#btn-regen'); if (bRegen) bRegen.addEventListener('click', regenerate); - var bClose = $('#btn-close'); if (bClose) bClose.addEventListener('click', () => window.close()); + var bClose = $('#btn-close'); if (bClose) bClose.addEventListener('click', closeEditor); // Cmd/Ctrl + S → 저장 (브라우저 기본 저장 대화상자 차단) document.addEventListener('keydown', function (e) { @@ -2066,6 +2074,7 @@ .then(function (res) { if (res && res.status === 'success') { toast(temp ? '임시저장되었습니다' : '저장되었습니다'); + savedSnapshot = JSON.stringify(state.data); // 저장 성공 시점을 새 저장 기준선으로 갱신 var badge = $('#hdr-source'); if (badge) { badge.textContent = '저장본'; badge.className = 'ml-1 px-2 py-0.5 text-[11px] rounded-full bg-emerald-50 text-emerald-700 border border-emerald-200'; badge.classList.remove('hidden'); } } else toast('저장 실패: ' + (res && res.errorMsg || ''), 'error'); }) @@ -2102,6 +2111,7 @@ // ============================================================ function init() { loadInitialData().then(function () { + savedSnapshot = JSON.stringify(state.data); // 초기 로드(자동생성 포함) 완료 시점을 저장 기준선으로 설정 renderStepper(); renderForm(); bindGlobalEvents(); diff --git a/src/main/resources/logback-rinjae_gf63_linux.xml b/src/main/resources/logback-rinjae_gf63_linux.xml new file mode 100644 index 0000000..8f24e17 --- /dev/null +++ b/src/main/resources/logback-rinjae_gf63_linux.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + utf-8 + %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n + + + + + ${LOG_HOME}/${PREFIX}_stdout.log + + + ${LOG_HOME}/${PREFIX}_stdout.log-%d{yyyy-MM-dd}.%i + + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + + ${LOG_HOME}/${PREFIX}_access.log + + + ${LOG_HOME}/${PREFIX}_access.log-%d{yyyy-MM-dd}.%i + + 500MB + + + utf-8 + ${LOG_PATTERN} + + + + ${LOG_HOME}/sms.log + + + ${LOG_HOME}/sms.log-%d{yyyy-MM-dd}.%i + + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + ${LOG_HOME}/${PREFIX}_query.log + + + ${LOG_HOME}/${PREFIX}_query.log-%d{yyyy-MM-dd}.%i + + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + ${LOG_HOME}/${PREFIX}_dynamic.log + + + ${LOG_HOME}/${PREFIX}_dynamic.log-%d{yyyy-MM-dd}.%i + + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + ${LOG_HOME}/${PREFIX}_hibernate.log + + ${LOG_HOME}/${PREFIX}_hibernate.log-%d{yyyy-MM-dd}.%i + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + ${LOG_HOME}/${PREFIX}_hotswap.log + + ${LOG_HOME}/${PREFIX}_hotswap.log-%d{yyyy-MM-dd}.%i + 500MB + 10 + + + utf-8 + ${LOG_PATTERN} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file