Compare commits
9 Commits
ea3d23424c
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 4bf7f661e3 | |||
| 124df00f51 | |||
| e4de8ebc8b | |||
| 52e8c3be39 | |||
| 136626e7c4 | |||
| 0848cd3469 | |||
| 0b6f273132 | |||
| 266644798f | |||
| 2e8b45c69e |
@@ -29,6 +29,14 @@
|
|||||||
// (enricher 는 oauth·api_key 를 모두 apiKey-in-header 로 모델링하므로 scheme.type 만으로 구분 불가)
|
// (enricher 는 oauth·api_key 를 모두 apiKey-in-header 로 모델링하므로 scheme.type 만으로 구분 불가)
|
||||||
var djbAuthType = '';
|
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. 유틸
|
// 2. 유틸
|
||||||
// ============================================================
|
// ============================================================
|
||||||
@@ -1703,7 +1711,7 @@
|
|||||||
|
|
||||||
var bSave = $('#btn-save'); if (bSave) bSave.addEventListener('click', () => saveSpec(false));
|
var bSave = $('#btn-save'); if (bSave) bSave.addEventListener('click', () => saveSpec(false));
|
||||||
var bRegen = $('#btn-regen'); if (bRegen) bRegen.addEventListener('click', regenerate);
|
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 → 저장 (브라우저 기본 저장 대화상자 차단)
|
// Cmd/Ctrl + S → 저장 (브라우저 기본 저장 대화상자 차단)
|
||||||
document.addEventListener('keydown', function (e) {
|
document.addEventListener('keydown', function (e) {
|
||||||
@@ -2066,6 +2074,7 @@
|
|||||||
.then(function (res) {
|
.then(function (res) {
|
||||||
if (res && res.status === 'success') {
|
if (res && res.status === 'success') {
|
||||||
toast(temp ? '임시저장되었습니다' : '저장되었습니다');
|
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'); }
|
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');
|
} else toast('저장 실패: ' + (res && res.errorMsg || ''), 'error');
|
||||||
})
|
})
|
||||||
@@ -2102,6 +2111,7 @@
|
|||||||
// ============================================================
|
// ============================================================
|
||||||
function init() {
|
function init() {
|
||||||
loadInitialData().then(function () {
|
loadInitialData().then(function () {
|
||||||
|
savedSnapshot = JSON.stringify(state.data); // 초기 로드(자동생성 포함) 완료 시점을 저장 기준선으로 설정
|
||||||
renderStepper();
|
renderStepper();
|
||||||
renderForm();
|
renderForm();
|
||||||
bindGlobalEvents();
|
bindGlobalEvents();
|
||||||
|
|||||||
@@ -47,6 +47,8 @@
|
|||||||
$('#sentDate').text(data.sentDateFull || '');
|
$('#sentDate').text(data.sentDateFull || '');
|
||||||
// 서버에서 마스킹+escape 된 안전 HTML
|
// 서버에서 마스킹+escape 된 안전 HTML
|
||||||
$('#messageHtml').html(data.messageHtml || '');
|
$('#messageHtml').html(data.messageHtml || '');
|
||||||
|
// 응답내용(RESPONSE_DATA) — 원문이므로 text 로만 출력
|
||||||
|
$('#responseData').text(data.responseData || '');
|
||||||
|
|
||||||
// PENDING 건만 '실패 처리' 노출 (권한 제어는 buttonControl 이 담당)
|
// PENDING 건만 '실패 처리' 노출 (권한 제어는 buttonControl 이 담당)
|
||||||
if (data.requestStatus !== 'PENDING') {
|
if (data.requestStatus !== 'PENDING') {
|
||||||
@@ -142,6 +144,10 @@
|
|||||||
<th>메세지 내용</th>
|
<th>메세지 내용</th>
|
||||||
<td colspan="3"><div id="messageHtml" class="msg-detail"></div></td>
|
<td colspan="3"><div id="messageHtml" class="msg-detail"></div></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>응답내용</th>
|
||||||
|
<td colspan="3"><div id="responseData" class="msg-detail"></div></td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -52,6 +52,8 @@
|
|||||||
var url = '<c:url value="/onl/kjb/statistics/apiStatsHourMan.json"/>';
|
var url = '<c:url value="/onl/kjb/statistics/apiStatsHourMan.json"/>';
|
||||||
var url_view = '<c:url value="/onl/kjb/statistics/apiStatsHourMan.view"/>';
|
var url_view = '<c:url value="/onl/kjb/statistics/apiStatsHourMan.view"/>';
|
||||||
var url_minute_view = '<c:url value="/onl/kjb/statistics/apiStatsMinuteMan.view"/>';
|
var url_minute_view = '<c:url value="/onl/kjb/statistics/apiStatsMinuteMan.view"/>';
|
||||||
|
var url_left_menu = '<c:url value="/leftMenu.do"/>';
|
||||||
|
var DASHBOARD_MENU_ID = '0305001'; // apiStatsMinuteMan(대시보드) 메뉴 ID
|
||||||
|
|
||||||
var totalDonutChart, callChart;
|
var totalDonutChart, callChart;
|
||||||
|
|
||||||
@@ -162,23 +164,20 @@
|
|||||||
var hour = parseInt(statTime.substring(8, 10));
|
var hour = parseInt(statTime.substring(8, 10));
|
||||||
|
|
||||||
var startDate = year + '-' + month + '-' + day;
|
var startDate = year + '-' + month + '-' + day;
|
||||||
var startTime = (hour < 10 ? '0' + hour : hour) + ':00';
|
var hourStr = (hour < 10 ? '0' + hour : hour);
|
||||||
|
var startTime = hourStr + ':00';
|
||||||
// 1시간 후 계산 (23시인 경우 다음날 00시로 자동 계산)
|
// 해당 시간대 끝(정시~59분)으로 이동 (예: 10:00~10:59)
|
||||||
var d = new Date(parseInt(year), parseInt(month) - 1, parseInt(day), hour, 0, 0);
|
var endTime = hourStr + ':59';
|
||||||
d.setHours(d.getHours() + 1);
|
|
||||||
|
|
||||||
var endDate = d.getFullYear() + '-' +
|
|
||||||
(d.getMonth() + 1 < 10 ? '0' : '') + (d.getMonth() + 1) + '-' +
|
|
||||||
(d.getDate() < 10 ? '0' : '') + d.getDate();
|
|
||||||
var endTime = (d.getHours() < 10 ? '0' : '') + d.getHours() + ':00';
|
|
||||||
|
|
||||||
var params = '?searchStartDate=' + startDate + '&searchStartTime=' + startTime
|
var params = '?searchStartDate=' + startDate + '&searchStartTime=' + startTime
|
||||||
+ '&searchEndDate=' + endDate + '&searchEndTime=' + endTime;
|
+ '&searchEndDate=' + startDate + '&searchEndTime=' + endTime;
|
||||||
params += '&menuId='+'${param.menuId}';
|
params += '&menuId='+DASHBOARD_MENU_ID;
|
||||||
params += '&cmd='+'LIST';
|
params += '&cmd='+'LIST';
|
||||||
params += '&serviceType='+'APIGW';
|
params += '&serviceType='+'APIGW';
|
||||||
|
|
||||||
|
// 왼쪽 메뉴도 대시보드(분단위 통계) 메뉴로 전환
|
||||||
|
parent.leftFrame.location.href = url_left_menu + '?menuId=' + DASHBOARD_MENU_ID
|
||||||
|
+ '&serviceType=' + sessionStorage["serviceType"];
|
||||||
location.href = url_minute_view + params;
|
location.href = url_minute_view + params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -262,14 +262,14 @@
|
|||||||
var diffMinutes = (end - start) / (1000 * 60);
|
var diffMinutes = (end - start) / (1000 * 60);
|
||||||
|
|
||||||
if (diffMinutes > 60) {
|
if (diffMinutes > 60) {
|
||||||
// 1시간 초과 시 시작 + 1시간으로 조정
|
// 1시간 초과 시 시작시각 기준 1시간치(정시~59분)로 조정
|
||||||
endDateTime = updateEndTime(new Date(start.getTime() + 60 * 60 * 1000));
|
endDateTime = updateEndTime(new Date(start.getTime() + 59 * 60 * 1000));
|
||||||
} else {
|
} else {
|
||||||
endDateTime = formatDateTime(end);
|
endDateTime = formatDateTime(end);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 종료시간 미입력 시 시작 + 1시간으로 설정
|
// 종료시간 미입력 시 시작시각 기준 1시간치(정시~59분)로 설정
|
||||||
endDateTime = updateEndTime(new Date(start.getTime() + 60 * 60 * 1000));
|
endDateTime = updateEndTime(new Date(start.getTime() + 59 * 60 * 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
return { start: startDateTime, end: endDateTime };
|
return { start: startDateTime, end: endDateTime };
|
||||||
@@ -325,8 +325,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 조회기간을 정시 단위 1시간 구간으로 이동 (direction: -1 이전, 1 이후)
|
// 조회기간을 정시 단위 1시간 구간으로 이동 (direction: -1 이전, 1 이후)
|
||||||
// ex) 시작 08:35, 이전 클릭 -> 08:00~09:00, 다시 -> 07:00~08:00
|
// ex) 시작 08:35, 이전 클릭 -> 08:00~08:59, 다시 -> 07:00~07:59
|
||||||
// ex) 시작 08:35, 이후 클릭 -> 09:00~10:00, 다시 -> 10:00~11:00
|
// ex) 시작 08:35, 이후 클릭 -> 09:00~09:59, 다시 -> 10:00~10:59
|
||||||
function shiftTimeRange(direction) {
|
function shiftTimeRange(direction) {
|
||||||
var startDate = $("input[name=searchStartDate]").val().replace(/-/g, "");
|
var startDate = $("input[name=searchStartDate]").val().replace(/-/g, "");
|
||||||
var startTime = $("input[name=searchStartTime]").val().replace(/:/g, "");
|
var startTime = $("input[name=searchStartTime]").val().replace(/:/g, "");
|
||||||
@@ -350,7 +350,8 @@
|
|||||||
start.setHours(start.getHours() + 1);
|
start.setHours(start.getHours() + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var end = new Date(start.getTime() + 60 * 60 * 1000);
|
// 종료시각은 같은 시간대의 59분으로 설정 (예: 10:00~10:59)
|
||||||
|
var end = new Date(start.getTime() + 59 * 60 * 1000);
|
||||||
|
|
||||||
function pad(n) { return String(n).padStart(2, '0'); }
|
function pad(n) { return String(n).padStart(2, '0'); }
|
||||||
|
|
||||||
@@ -580,9 +581,9 @@
|
|||||||
|
|
||||||
$("input[name=searchStartDate]").datepicker();
|
$("input[name=searchStartDate]").datepicker();
|
||||||
|
|
||||||
// 기본값 설정 (현재 시간(분) 기준 1시간 전 ~ 현재 시간(분))
|
// 기본값 설정 (현재 시간(분) 기준 59분 전 ~ 현재 시간(분))
|
||||||
var now = new Date();
|
var now = new Date();
|
||||||
var oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
|
var oneHourAgo = new Date(now.getTime() - 59 * 60 * 1000);
|
||||||
|
|
||||||
function formatDate(d) {
|
function formatDate(d) {
|
||||||
return d.getFullYear() + '-' +
|
return d.getFullYear() + '-' +
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ import com.eactive.eai.rms.common.util.CommonConstants;
|
|||||||
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness;
|
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusiness;
|
||||||
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusinessId;
|
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusinessId;
|
||||||
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusinessService;
|
import com.eactive.eai.rms.data.entity.onl.bzwkdstcd.UserBusinessService;
|
||||||
|
import com.eactive.eai.rms.data.entity.onl.transaction.TransactionTrackingFilter;
|
||||||
|
import com.eactive.eai.rms.data.entity.onl.transaction.TransactionTrackingFilterId;
|
||||||
|
import com.eactive.eai.rms.data.entity.onl.transaction.TransactionTrackingFilterService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.unifbwk.UnifBwkTpService;
|
import com.eactive.eai.rms.data.entity.onl.unifbwk.UnifBwkTpService;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -40,6 +43,9 @@ public class BizManService extends BaseService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private UserBusinessService userBusinessService;
|
private UserBusinessService userBusinessService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private TransactionTrackingFilterService transactionTrackingFilterService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserBizUIMapper userBizUIMapper;
|
private UserBizUIMapper userBizUIMapper;
|
||||||
|
|
||||||
@@ -101,7 +107,14 @@ public class BizManService extends BaseService {
|
|||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
userBusinessService.deleteOrSave(userId, userBusinesses);
|
userBusinessService.deleteOrSave(userId, userBusinesses);
|
||||||
|
|
||||||
|
transactionTrackingFilterService.deleteAllByUserId(userId);
|
||||||
|
List<TransactionTrackingFilter> filters = userBusinesses.stream()
|
||||||
|
.map(ub -> new TransactionTrackingFilter(
|
||||||
|
new TransactionTrackingFilterId(userId, ub.getId().getEaiBzwkDstcd())))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
transactionTrackingFilterService.saveAll(filters);
|
||||||
|
|
||||||
String userBusinessServiceLists = userBusinesses.stream()
|
String userBusinessServiceLists = userBusinesses.stream()
|
||||||
.map(e -> e.getId().getEaiBzwkDstcd())
|
.map(e -> e.getId().getEaiBzwkDstcd())
|
||||||
.collect(Collectors.joining(","));
|
.collect(Collectors.joining(","));
|
||||||
|
|||||||
+3
-3
@@ -336,12 +336,12 @@ public class ApiStatsMinuteService
|
|||||||
|
|
||||||
if (StringUtils.isNotBlank(search.getSearchEndDateTime())) {
|
if (StringUtils.isNotBlank(search.getSearchEndDateTime())) {
|
||||||
endDateTime = LocalDateTime.parse(search.getSearchEndDateTime(), DATE_TIME_FORMATTER);
|
endDateTime = LocalDateTime.parse(search.getSearchEndDateTime(), DATE_TIME_FORMATTER);
|
||||||
// 1시간(60분) 초과 시 시작시간 기준 1시간 후로 강제 설정
|
// 1시간(60분) 초과 시 시작시간 기준 1시간치(정시~59분, statTime 조건이 양끝 포함이므로 -1분)로 강제 설정
|
||||||
if (java.time.Duration.between(startDateTime, endDateTime).toMinutes() > MAX_MINUTES) {
|
if (java.time.Duration.between(startDateTime, endDateTime).toMinutes() > MAX_MINUTES) {
|
||||||
endDateTime = startDateTime.plusMinutes(MAX_MINUTES);
|
endDateTime = startDateTime.plusMinutes(MAX_MINUTES - 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
endDateTime = startDateTime.plusMinutes(MAX_MINUTES);
|
endDateTime = startDateTime.plusMinutes(MAX_MINUTES - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
search.setParsedStartDateTime(startDateTime);
|
search.setParsedStartDateTime(startDateTime);
|
||||||
|
|||||||
+8
@@ -20,4 +20,12 @@ public class TransactionTrackingFilterService extends
|
|||||||
.fetch();
|
.fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteAllByUserId(String userId) {
|
||||||
|
repository.deleteAll(findAllByUserId(userId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveAll(List<TransactionTrackingFilter> filters) {
|
||||||
|
repository.saveAll(filters);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.eactive.eai.rms.ext.djb.ums.service;
|
package com.eactive.eai.rms.ext.djb.ums.service;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
@@ -11,6 +12,7 @@ import java.nio.charset.Charset;
|
|||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -42,13 +44,11 @@ public class UmsService {
|
|||||||
private static final Gson gson = new Gson();
|
private static final Gson gson = new Gson();
|
||||||
|
|
||||||
private static final String SYS_DVCD = "API"; //시스템코드
|
private static final String SYS_DVCD = "API"; //시스템코드
|
||||||
private static final String BZWK_DVCD = "95"; //업무구분코드
|
|
||||||
private static final String BZWK_CD = "999"; //업무코드
|
|
||||||
private static final String BZWK_DCLS_DVCD = "9019"; //세부구분코드
|
private static final String BZWK_DCLS_DVCD = "9019"; //세부구분코드
|
||||||
private static final String SUB_BZWK_CD = "999"; //서브업무코드 TODO: 변경할것
|
private static final String BZWK_CD = "EBK"; //업무코드
|
||||||
private static final String TEAM_DVCD = "99"; //팀구분코드 TODO: 변경해야함
|
private static final String SUB_BZWK_CD = "EBG"; //서브업무코드
|
||||||
|
|
||||||
|
|
||||||
private final MonitoringPropertyService propertyService;
|
private final MonitoringPropertyService propertyService;
|
||||||
private final MessageRequestService messageRequestService;
|
private final MessageRequestService messageRequestService;
|
||||||
|
|
||||||
@@ -62,27 +62,35 @@ public class UmsService {
|
|||||||
throw new IllegalArgumentException("messageRequest is null");
|
throw new IllegalArgumentException("messageRequest is null");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.httpConnection(messageRequest);
|
UmsResponse response = this.httpConnection(messageRequest);
|
||||||
|
|
||||||
return true;
|
// HTTP 응답코드가 2xx 일 때만 SENT, 나머지는 FAILED
|
||||||
|
boolean success = response.getHttpStatus() >= 200 && response.getHttpStatus() < 300;
|
||||||
|
|
||||||
|
messageRequest.setRequestStatus(success ? "SENT" : "FAILED");
|
||||||
|
messageRequest.setSentDate(LocalDateTime.now());
|
||||||
|
messageRequest.setResponseData(response.getResponseData());
|
||||||
|
messageRequestService.save(messageRequest);
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void httpConnection(MessageRequest messageRequest) throws Exception {
|
private UmsResponse httpConnection(MessageRequest messageRequest) throws Exception {
|
||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn = null;
|
||||||
BufferedReader br = null;
|
BufferedReader br = null;
|
||||||
log.debug("<<<HTTP Connection>>>:" + messageRequest.toString());
|
log.debug("<<<HTTP Connection>>>:" + messageRequest.toString());
|
||||||
try {
|
try {
|
||||||
String host = propertyService.getPropertyValue("Monitoring", "djb.ums."+messageRequest.getMessageType().toLowerCase()+".url", "");
|
String host = propertyService.getPropertyValue("Monitoring", "djb.ums."+messageRequest.getMessageType().toLowerCase()+".url", "");
|
||||||
|
|
||||||
URL url = new URL(host);
|
URL url = new URL(host);
|
||||||
int timeoutValue = 5 * 1000; // 타임아웃 설정을 위한 값 (단위: ms)
|
int timeoutValue = 5 * 1000; // 타임아웃 설정을 위한 값 (단위: ms)
|
||||||
// Charset charset = Charset.forName("UTF-8");
|
// Charset charset = Charset.forName("UTF-8");
|
||||||
Charset charset = Charset.forName("MS949");
|
Charset charset = Charset.forName("MS949");
|
||||||
|
|
||||||
StringBuffer sb = null;
|
StringBuffer sb = null;
|
||||||
String bodyData = this.makeBodyData(messageRequest);
|
String bodyData = this.makeBodyData(messageRequest);
|
||||||
|
|
||||||
String responseData = "";
|
String responseData = "";
|
||||||
String method = bodyData.isEmpty() ? "GET" : "POST";
|
String method = bodyData.isEmpty() ? "GET" : "POST";
|
||||||
conn = (HttpURLConnection) url.openConnection();
|
conn = (HttpURLConnection) url.openConnection();
|
||||||
@@ -92,7 +100,7 @@ public class UmsService {
|
|||||||
conn.setConnectTimeout(timeoutValue); // 연결 타임아웃 설정(5초)
|
conn.setConnectTimeout(timeoutValue); // 연결 타임아웃 설정(5초)
|
||||||
conn.setReadTimeout(timeoutValue); // 읽기 타임아웃 설정(5초)
|
conn.setReadTimeout(timeoutValue); // 읽기 타임아웃 설정(5초)
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
|
|
||||||
// POst 방식인 경우에만
|
// POst 방식인 경우에만
|
||||||
if (method.equals("POST")) {
|
if (method.equals("POST")) {
|
||||||
OutputStream os = conn.getOutputStream();
|
OutputStream os = conn.getOutputStream();
|
||||||
@@ -100,29 +108,32 @@ public class UmsService {
|
|||||||
os.write(requestData);
|
os.write(requestData);
|
||||||
os.close();
|
os.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int responseCode = conn.getResponseCode();
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("getContentType();" + conn.getContentType()); // 응답 콘텐츠 유형 구하기
|
log.debug("getContentType();" + conn.getContentType()); // 응답 콘텐츠 유형 구하기
|
||||||
log.debug("getResponsecode();" + conn.getResponseCode()); // 응답 코드 구하기
|
log.debug("getResponsecode();" + responseCode); // 응답 코드 구하기
|
||||||
log.debug("getResponseMessage():" + conn.getResponseMessage()); // 응답 메세지 구하기
|
log.debug("getResponseMessage():" + conn.getResponseMessage()); // 응답 메세지 구하기
|
||||||
}
|
}
|
||||||
|
|
||||||
// http 요청 후 응답 받은 데이타를 버퍼에 쌓는다
|
// http 요청 후 응답 받은 데이타를 버퍼에 쌓는다
|
||||||
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
|
InputStream is = (responseCode >= 200 && responseCode < 300) ? conn.getInputStream() : conn.getErrorStream();
|
||||||
br = new BufferedReader(new InputStreamReader(conn.getInputStream(), charset));
|
if (is != null) {
|
||||||
} else {
|
br = new BufferedReader(new InputStreamReader(is, charset));
|
||||||
br = new BufferedReader(new InputStreamReader(conn.getErrorStream(), charset));
|
|
||||||
|
String inputLine;
|
||||||
|
sb = new StringBuffer();
|
||||||
|
while ((inputLine = br.readLine()) != null) {
|
||||||
|
sb.append(inputLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
responseData = sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
String inputLine;
|
|
||||||
sb = new StringBuffer();
|
return new UmsResponse(responseCode, responseData);
|
||||||
while ((inputLine = br.readLine()) != null) {
|
|
||||||
sb.append(inputLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
responseData = sb.toString();
|
|
||||||
|
|
||||||
log.debug("UMS responseData:" + responseData);
|
|
||||||
} finally {
|
} finally {
|
||||||
// http 요청 및 응답 완료 후 BufferedReader를 닫는다
|
// http 요청 및 응답 완료 후 BufferedReader를 닫는다
|
||||||
if (br != null) {
|
if (br != null) {
|
||||||
@@ -133,6 +144,25 @@ public class UmsService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** UMS HTTP 호출 결과(응답코드 + 응답본문) 보관용. */
|
||||||
|
private static class UmsResponse {
|
||||||
|
private final int httpStatus;
|
||||||
|
private final String responseData;
|
||||||
|
|
||||||
|
UmsResponse(int httpStatus, String responseData) {
|
||||||
|
this.httpStatus = httpStatus;
|
||||||
|
this.responseData = responseData;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getHttpStatus() {
|
||||||
|
return httpStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getResponseData() {
|
||||||
|
return responseData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -203,7 +233,7 @@ public class UmsService {
|
|||||||
stdHeadVO.setChnl_tycd("EAI"); // 채널유형코드
|
stdHeadVO.setChnl_tycd("EAI"); // 채널유형코드
|
||||||
stdHeadVO.setHmab_dvcd("1"); // 내외구분코드 1:내부 2:외부(타발)
|
stdHeadVO.setHmab_dvcd("1"); // 내외구분코드 1:내부 2:외부(타발)
|
||||||
stdHeadVO.setIf_id(messageRequest.getEaiInterfaceId()); // 인터페이스ID
|
stdHeadVO.setIf_id(messageRequest.getEaiInterfaceId()); // 인터페이스ID
|
||||||
stdHeadVO.setTx_id(messageRequest.getServiceId()); // 거래ID
|
stdHeadVO.setTx_id(messageRequest.getEaiTxId()); // 거래ID
|
||||||
|
|
||||||
if ("MESSENGER".equals(messageRequest.getMessageType()) ) {
|
if ("MESSENGER".equals(messageRequest.getMessageType()) ) {
|
||||||
|
|
||||||
@@ -247,7 +277,7 @@ public class UmsService {
|
|||||||
// Sms 데이터
|
// Sms 데이터
|
||||||
SmsDataVO dataVO = new SmsDataVO();
|
SmsDataVO dataVO = new SmsDataVO();
|
||||||
dataVO.setSnd_dman_dt(jsonData[0]);
|
dataVO.setSnd_dman_dt(jsonData[0]);
|
||||||
dataVO.setSnd_dman_id(this.getSndDmanId(messageRequest.getMessageType()));
|
dataVO.setSnd_dman_id(this.getSndDmanId(messageRequest));
|
||||||
dataVO.setSnd_dvcd("EAI");
|
dataVO.setSnd_dvcd("EAI");
|
||||||
dataVO.setSms_msg_titl(StringUtil.chunkString(messageRequest.getSubject(), 40, false)); // MS949 40byte 초과시 절단
|
dataVO.setSms_msg_titl(StringUtil.chunkString(messageRequest.getSubject(), 40, false)); // MS949 40byte 초과시 절단
|
||||||
dataVO.setSms_msg_ctnt(messageRequest.getMessage());
|
dataVO.setSms_msg_ctnt(messageRequest.getMessage());
|
||||||
@@ -257,18 +287,20 @@ public class UmsService {
|
|||||||
dataVO.setSnd_emp_dprm_cd("132"); //요청부서코드
|
dataVO.setSnd_emp_dprm_cd("132"); //요청부서코드
|
||||||
dataVO.setLtrs_snd_tycd("2"); // 1:SMS 2:LMS/MMS
|
dataVO.setLtrs_snd_tycd("2"); // 1:SMS 2:LMS/MMS
|
||||||
dataVO.setMsg_snd_tycd("1008"); // 알림톡 메세지 종류 0000:SMS, 1000:LMS, 1008:알림톡, ....
|
dataVO.setMsg_snd_tycd("1008"); // 알림톡 메세지 종류 0000:SMS, 1000:LMS, 1008:알림톡, ....
|
||||||
//ADMIN으로 시작하면 제주은행 임직원, 나머지는 제주은행 고객용
|
//ADMIN으로 시작하면 제주은행 내부용, 나머지는 제주은행 고객용
|
||||||
if (messageRequest.getMessageCode().name().startsWith("ADMIN")) {
|
if (messageRequest.getMessageCode().name().startsWith("ADMIN")) {
|
||||||
|
dataVO.setSms_trnm_bzwk_dvcd("99"); //업무구분코드
|
||||||
|
dataVO.setSms_bzwk_dcls_dvcd(BZWK_DCLS_DVCD); //업무세분코드
|
||||||
dataVO.setAlmtk_snd_prfl_key(propertyService.getPropertyValue("Monitoring", "djb.ums.sms.almtk_snd_prtl_key.intra", "")); // 제주은행 임직원 플러스친구아이디
|
dataVO.setAlmtk_snd_prfl_key(propertyService.getPropertyValue("Monitoring", "djb.ums.sms.almtk_snd_prtl_key.intra", "")); // 제주은행 임직원 플러스친구아이디
|
||||||
} else {
|
} else {
|
||||||
|
dataVO.setSms_trnm_bzwk_dvcd("95"); //업무구분코드
|
||||||
|
dataVO.setSms_bzwk_dcls_dvcd(BZWK_DCLS_DVCD); //업무세분코드
|
||||||
dataVO.setAlmtk_snd_prfl_key(propertyService.getPropertyValue("Monitoring", "djb.ums.sms.almtk_snd_prtl_key.public", "")); // 제주은행 플러스친구아이디
|
dataVO.setAlmtk_snd_prfl_key(propertyService.getPropertyValue("Monitoring", "djb.ums.sms.almtk_snd_prtl_key.public", "")); // 제주은행 플러스친구아이디
|
||||||
}
|
}
|
||||||
dataVO.setAlmtk_tmplt_cd(BZWK_DVCD + TEAM_DVCD + BZWK_DCLS_DVCD + "001"); // 템플릿코드
|
dataVO.setAlmtk_tmplt_cd(messageRequest.getServiceId()); // 템플릿코드
|
||||||
dataVO.setAlmtk_err_ltrs_snd_yn("Y"); // 오류자문자발송여부
|
dataVO.setAlmtk_err_ltrs_snd_yn("Y"); // 오류자문자발송여부
|
||||||
dataVO.setAlmtk_btn_trnm_tycd("2"); // 카카오버튼전송방식 1-format string 2-JSON 3-XML
|
dataVO.setAlmtk_btn_trnm_tycd("2"); // 카카오버튼전송방식 1-format string 2-JSON 3-XML
|
||||||
|
|
||||||
dataVO.setSms_trnm_bzwk_dvcd(BZWK_DVCD); //업무구분코드
|
|
||||||
dataVO.setSms_bzwk_dcls_dvcd(BZWK_DCLS_DVCD); //업무세분코드
|
|
||||||
dataVO.setSms_sys_dvcd("85"); //시스템코드
|
dataVO.setSms_sys_dvcd("85"); //시스템코드
|
||||||
dataVO.setTx_dt(jsonData[0]); //거래일자
|
dataVO.setTx_dt(jsonData[0]); //거래일자
|
||||||
dataVO.setTx_tktm(jsonData[1].substring(0,6)); //거래시간
|
dataVO.setTx_tktm(jsonData[1].substring(0,6)); //거래시간
|
||||||
@@ -293,7 +325,7 @@ public class UmsService {
|
|||||||
EmailDataVO dataVO = new EmailDataVO();
|
EmailDataVO dataVO = new EmailDataVO();
|
||||||
dataVO.setUms_evnt_id(propertyService.getPropertyValue("Monitoring", "djb.ums.email.ums_evnt_id", "")); // UMS이벤트ID(필수)
|
dataVO.setUms_evnt_id(propertyService.getPropertyValue("Monitoring", "djb.ums.email.ums_evnt_id", "")); // UMS이벤트ID(필수)
|
||||||
dataVO.setSnd_dman_dt(jsonData[0]);
|
dataVO.setSnd_dman_dt(jsonData[0]);
|
||||||
dataVO.setSnd_dman_id(this.getSndDmanId(messageRequest.getMessageType()));
|
dataVO.setSnd_dman_id(this.getSndDmanId(messageRequest));
|
||||||
dataVO.setDman_seqno(1); // 발송요청순번
|
dataVO.setDman_seqno(1); // 발송요청순번
|
||||||
dataVO.setEmail_titl(messageRequest.getSubject()); // 메일제목
|
dataVO.setEmail_titl(messageRequest.getSubject()); // 메일제목
|
||||||
dataVO.setCstno(propertyService.getPropertyValue("Monitoring", "djb.ums.email.cstno", "")); // 고객번호(필수)
|
dataVO.setCstno(propertyService.getPropertyValue("Monitoring", "djb.ums.email.cstno", "")); // 고객번호(필수)
|
||||||
@@ -305,7 +337,7 @@ public class UmsService {
|
|||||||
dataVO.setSnd_emp_dprm_cd("132"); // 발신자부서코드(필수)
|
dataVO.setSnd_emp_dprm_cd("132"); // 발신자부서코드(필수)
|
||||||
dataVO.setBzwk_cd(BZWK_CD); // 업무코드
|
dataVO.setBzwk_cd(BZWK_CD); // 업무코드
|
||||||
dataVO.setSub_bzwk_cd(SUB_BZWK_CD); // 서브업무코드
|
dataVO.setSub_bzwk_cd(SUB_BZWK_CD); // 서브업무코드
|
||||||
dataVO.setSys_dvcd(SYS_DVCD); // 시스템구분코드
|
dataVO.setSys_dvcd("85"); // 시스템구분코드
|
||||||
dataVO.setTx_dt(jsonData[0]); // 거래일자
|
dataVO.setTx_dt(jsonData[0]); // 거래일자
|
||||||
dataVO.setTx_tktm(jsonData[1].substring(0,6)); // 거래시간
|
dataVO.setTx_tktm(jsonData[1].substring(0,6)); // 거래시간
|
||||||
|
|
||||||
@@ -399,20 +431,24 @@ public class UmsService {
|
|||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getSndDmanId(String messageType) {
|
private String getSndDmanId(MessageRequest messageRequest) {
|
||||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
||||||
String yyyymmdd = sdf.format(new Date());
|
String yyyymmdd = sdf.format(new Date());
|
||||||
|
|
||||||
String uuid = "";
|
String uuid = "";
|
||||||
|
|
||||||
if ("EMAIL".equals(messageType)) {
|
if ("EMAIL".equals(messageRequest.getMessageType())) {
|
||||||
uuid = SYS_DVCD + BZWK_CD + SUB_BZWK_CD + yyyymmdd + "O" + "E" ;
|
uuid = SYS_DVCD + BZWK_CD + SUB_BZWK_CD + yyyymmdd + "O" + "E" ;
|
||||||
|
|
||||||
long seq = messageRequestService.countEmailRequestsOnDate(LocalDate.now()) + 1;
|
long seq = messageRequestService.countEmailRequestsOnDate(LocalDate.now()) + 1;
|
||||||
uuid += String.format("%013d", seq);
|
uuid += String.format("%013d", seq);
|
||||||
|
|
||||||
} else if ("SMS".equals(messageType)) { //kakao 알림톡
|
} else if ("SMS".equals(messageRequest.getMessageType())) { //kakao 알림톡
|
||||||
uuid = SYS_DVCD + BZWK_DVCD + BZWK_DCLS_DVCD + yyyymmdd + "O" + "K";
|
if (messageRequest.getMessageCode().name().startsWith("ADMIN")) {
|
||||||
|
uuid = SYS_DVCD + "99" + BZWK_DCLS_DVCD + yyyymmdd + "O" + "K"; //내부용
|
||||||
|
} else {
|
||||||
|
uuid = SYS_DVCD + "95" + BZWK_DCLS_DVCD + yyyymmdd + "O" + "K"; //대고객
|
||||||
|
}
|
||||||
|
|
||||||
long seq = messageRequestService.countSmsKakaoRequestsOnDate(LocalDate.now()) + 1;
|
long seq = messageRequestService.countSmsKakaoRequestsOnDate(LocalDate.now()) + 1;
|
||||||
uuid += String.format("%013d", seq);
|
uuid += String.format("%013d", seq);
|
||||||
|
|||||||
+1
@@ -72,6 +72,7 @@ public class MessageRequestManService extends BaseService {
|
|||||||
|
|
||||||
ui.setUmsUid(e.getUmsUid());
|
ui.setUmsUid(e.getUmsUid());
|
||||||
ui.setRequestStatus(e.getRequestStatus());
|
ui.setRequestStatus(e.getRequestStatus());
|
||||||
|
ui.setResponseData(e.getResponseData());
|
||||||
ui.setEaiInterfaceId(e.getEaiInterfaceId());
|
ui.setEaiInterfaceId(e.getEaiInterfaceId());
|
||||||
ui.setServiceId(e.getServiceId());
|
ui.setServiceId(e.getServiceId());
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ public class MessageRequestUI {
|
|||||||
/* 본문 — 패턴 마스킹 + span 색상강조된 안전 HTML */
|
/* 본문 — 패턴 마스킹 + span 색상강조된 안전 HTML */
|
||||||
private String messageHtml;
|
private String messageHtml;
|
||||||
|
|
||||||
|
/* UMS 응답 내용 (RESPONSE_DATA) — 원문 그대로, 화면에서는 text 로만 출력 */
|
||||||
|
private String responseData;
|
||||||
|
|
||||||
/* 수신자 (마스킹) */
|
/* 수신자 (마스킹) */
|
||||||
private String username;
|
private String username;
|
||||||
private String email;
|
private String email;
|
||||||
|
|||||||
@@ -147,8 +147,8 @@ public class UmsDispatchService {
|
|||||||
try {
|
try {
|
||||||
transactionTemplate.execute(status -> {
|
transactionTemplate.execute(status -> {
|
||||||
try {
|
try {
|
||||||
|
// 상태(SENT/FAILED) 및 RESPONSE_DATA 저장은 umsService.send() 내부에서 처리한다.
|
||||||
umsService.send(message);
|
umsService.send(message);
|
||||||
updateMessageStatus(message, "SENT");
|
|
||||||
return null;
|
return null;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// checked exception을 RuntimeException으로 감싸 전파 → TransactionTemplate이 rollback 후 re-throw
|
// checked exception을 RuntimeException으로 감싸 전파 → TransactionTemplate이 rollback 후 re-throw
|
||||||
@@ -159,7 +159,8 @@ public class UmsDispatchService {
|
|||||||
log.error("Failed to process message: {} - Error: {}", message.getId(), e.getMessage(), e);
|
log.error("Failed to process message: {} - Error: {}", message.getId(), e.getMessage(), e);
|
||||||
try {
|
try {
|
||||||
transactionTemplate.execute(s -> {
|
transactionTemplate.execute(s -> {
|
||||||
updateMessageStatus(message, "FAILED");
|
// 응답 자체를 받지 못한 경우(네트워크/타임아웃 등) 예외 메시지를 RESPONSE_DATA 에 남긴다.
|
||||||
|
updateMessageStatus(message, "FAILED", toResponseData(e));
|
||||||
return null;
|
return null;
|
||||||
});
|
});
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
@@ -171,10 +172,19 @@ public class UmsDispatchService {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void updateMessageStatus(MessageRequest message, String status) {
|
public void updateMessageStatus(MessageRequest message, String status, String responseData) {
|
||||||
message.setRequestStatus(status);
|
message.setRequestStatus(status);
|
||||||
message.setSentDate(LocalDateTime.now());
|
message.setSentDate(LocalDateTime.now());
|
||||||
|
if (responseData != null) {
|
||||||
|
message.setResponseData(responseData);
|
||||||
|
}
|
||||||
entityManager.merge(message);
|
entityManager.merge(message);
|
||||||
entityManager.flush();
|
entityManager.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 예외를 RESPONSE_DATA 컬럼에 저장할 문자열로 변환한다. (RuntimeException 래퍼는 원인 예외로 풀어서 사용) */
|
||||||
|
private static String toResponseData(Throwable t) {
|
||||||
|
Throwable root = (t instanceof RuntimeException && t.getCause() != null) ? t.getCause() : t;
|
||||||
|
return String.valueOf(root);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<configuration scan="true" scanPeriod="10 seconds">
|
||||||
|
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />
|
||||||
|
|
||||||
|
<property name="LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] \\(%F:%L\\) %-20M -%msg%n" />
|
||||||
|
<property name="PREFIX" value="${inst.Type:-ems}" />
|
||||||
|
<property name="LOG_HOME" value="/work/eactive/djb-eapim/workspace/eapim-admin/logs" />
|
||||||
|
<property name="BACKUP_HOME" value="${LOG_HOME}/backup/" />
|
||||||
|
<property name="LOG_LEVEL" value="${LOGBACK_LOG_LEVEL:-DEBUG}" />
|
||||||
|
|
||||||
|
|
||||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="STDOUT"
|
||||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_stdout.log</file>
|
||||||
|
<rollingPolicy
|
||||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>
|
||||||
|
${LOG_HOME}/${PREFIX}_stdout.log-%d{yyyy-MM-dd}.%i
|
||||||
|
</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<appender name="ACCESS_APPENDER"
|
||||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_access.log</file>
|
||||||
|
<rollingPolicy
|
||||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>
|
||||||
|
${LOG_HOME}/${PREFIX}_access.log-%d{yyyy-MM-dd}.%i
|
||||||
|
</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<appender name="SMS_APPENDER"
|
||||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/sms.log</file>
|
||||||
|
<rollingPolicy
|
||||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>
|
||||||
|
${LOG_HOME}/sms.log-%d{yyyy-MM-dd}.%i
|
||||||
|
</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<appender name="QUERY_APPENDER"
|
||||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_query.log</file>
|
||||||
|
<rollingPolicy
|
||||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>
|
||||||
|
${LOG_HOME}/${PREFIX}_query.log-%d{yyyy-MM-dd}.%i
|
||||||
|
</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<appender name="DYNAMIC_APPENDER"
|
||||||
|
class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_dynamic.log</file>
|
||||||
|
<rollingPolicy
|
||||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>
|
||||||
|
${LOG_HOME}/${PREFIX}_dynamic.log-%d{yyyy-MM-dd}.%i
|
||||||
|
</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<appender name="HIBERNATE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_hibernate.log</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${LOG_HOME}/${PREFIX}_hibernate.log-%d{yyyy-MM-dd}.%i</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
<appender name="HOTSWAP_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
|
<file>${LOG_HOME}/${PREFIX}_hotswap.log</file>
|
||||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
|
<fileNamePattern>${LOG_HOME}/${PREFIX}_hotswap.log-%d{yyyy-MM-dd}.%i</fileNamePattern>
|
||||||
|
<maxFileSize>500MB</maxFileSize>
|
||||||
|
<maxHistory>10</maxHistory>
|
||||||
|
</rollingPolicy>
|
||||||
|
<encoder>
|
||||||
|
<charset>utf-8</charset>
|
||||||
|
<pattern>${LOG_PATTERN}</pattern>
|
||||||
|
</encoder>
|
||||||
|
</appender>
|
||||||
|
|
||||||
|
<logger name="com.eactive.eai.rms.onl.server" level="ERROR" />
|
||||||
|
<logger name="com.eactive.eai.rms.onl.dashboard" level="ERROR" />
|
||||||
|
<logger name="com.eactive.eai.rms.common.acl.user.BizDao" level="ERROR" />
|
||||||
|
<logger name="com.eactive.eai.rms.common.acl.user.BizDao" level="ERROR" />
|
||||||
|
<logger name="com.eactive.eai.rms.ext.djb.job" level="DEBUG" />
|
||||||
|
<logger name="com.eactive.eai.rms.ext.djb.apistatus" level="DEBUG" />
|
||||||
|
|
||||||
|
<logger name="org.springframework.orm.jpa.JpaTransactionManager" level="ERROR" additivity="false" />
|
||||||
|
|
||||||
|
<logger name="org.springframework" level="INFO" />
|
||||||
|
<logger name="net.sf.ehcache" level="INFO" />
|
||||||
|
|
||||||
|
|
||||||
|
<logger name="ACCESS_LOGGER" level="DEBUG" >
|
||||||
|
<appender-ref ref="ACCESS_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<logger name="SMS_LOGGER" level="DEBUG" >
|
||||||
|
<appender-ref ref="SMS_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<logger name="DYNAMIC_LOGGER" level="DEBUG" >
|
||||||
|
<appender-ref ref="DYNAMIC_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- QUERY_APPENDER start -->
|
||||||
|
<!-- Hibernate SQL & 파라미터 바인딩 -->
|
||||||
|
<logger name="org.hibernate.SQL" level="DEBUG" additivity="false">
|
||||||
|
<appender-ref ref="QUERY_APPENDER" />
|
||||||
|
<appender-ref ref="HIBERNATE_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" additivity="false">
|
||||||
|
<appender-ref ref="QUERY_APPENDER" />
|
||||||
|
<appender-ref ref="HIBERNATE_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="TRACE" additivity="false">
|
||||||
|
<appender-ref ref="QUERY_APPENDER" />
|
||||||
|
<appender-ref ref="HIBERNATE_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<!-- Hibernate 일반 로그 (DDL/init/connection 등) -->
|
||||||
|
<logger name="org.hibernate" level="INFO" additivity="false">
|
||||||
|
<appender-ref ref="HIBERNATE_APPENDER" />
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
</logger>
|
||||||
|
|
||||||
|
<!-- iBATIS 2.3.4 (commons-logging 또는 log4j-over-slf4j 통해 SLF4J 도달) -->
|
||||||
|
<logger name="com.ibatis" level="DEBUG" additivity="false">
|
||||||
|
<appender-ref ref="QUERY_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<logger name="com.eactive.eai.rms.common.base.SchemaIdConfiguredSqlMapTemplate" level="DEBUG" additivity="false">
|
||||||
|
<appender-ref ref="QUERY_APPENDER" />
|
||||||
|
</logger>
|
||||||
|
<!-- QUERY_APPENDER end -->
|
||||||
|
|
||||||
|
<!-- HotswapAgent는 자체 logger를 사용하므로 logback에 안 잡힘. hotswap-agent.properties의 LOGFILE로 직접 파일 출력 -->
|
||||||
|
|
||||||
|
<root>
|
||||||
|
<level value="INFO" />
|
||||||
|
<appender-ref ref="STDOUT" />
|
||||||
|
<appender-ref ref="CONSOLE" />
|
||||||
|
</root>
|
||||||
|
</configuration>
|
||||||
Reference in New Issue
Block a user