5 Commits

Author SHA1 Message Date
curry772 495241c5d0 org.apache.hc.client5.http logger 중복 출력 문제 처리
- additive : false
- add console appender
2026-07-29 15:38:08 +09:00
curry772 f5a653ca6a 마스킹 : 코드 상수 추가 및 mask 메소드 추가 2026-07-20 16:25:43 +09:00
curry772 2929fc753f BIZ_ERROR_DESC_VALUE 추가 2026-06-18 08:52:02 +09:00
curry772 52b968e8f8 STDMESSAGE_ERROR_CODE 프러퍼티 그룹 설정 변경 시 리로드 기능 수정 2026-06-17 14:15:13 +09:00
curry772 27e9cd7d67 거래별 로그(sift logger)에 http client 로거도 추가 2026-06-17 14:06:16 +09:00
3 changed files with 177 additions and 32 deletions
@@ -898,7 +898,7 @@ public class Logger implements LogKeys {
String adapterLogLevel = pmanager.getProperty(LOGGER_ADAPTER_PREFIX, LOG_LEVEL); String adapterLogLevel = pmanager.getProperty(LOGGER_ADAPTER_PREFIX, LOG_LEVEL);
hc5Logger.setLevel(Level.toLevel(adapterLogLevel)); hc5Logger.setLevel(Level.toLevel(adapterLogLevel));
hc5Logger.setAdditive(true); hc5Logger.setAdditive(false);
String appenderNames = pmanager.getProperty(LOGGER_ADAPTER_PREFIX, APPENDER); String appenderNames = pmanager.getProperty(LOGGER_ADAPTER_PREFIX, APPENDER);
if(appenderNames!=null) { if(appenderNames!=null) {
@@ -914,6 +914,12 @@ public class Logger implements LogKeys {
} }
} }
String console = loggerInfo.getProperty(CONSOLE);
if((console!=null) && console.equals("on")) {
hc5Logger.addAppender(consoleAppender);
System.out.println("@ add ConsoleAppender to " + logger.getName());
}
// * 거래 파일 로그 추가 코드 // * 거래 파일 로그 추가 코드
// MDC txId가 있을 때만 SiftingAppender로 기록하는 필터 // MDC txId가 있을 때만 SiftingAppender로 기록하는 필터
// (txId 없는 일반 로그가 default.log로 쌓이는 것 방지) // (txId 없는 일반 로그가 default.log로 쌓이는 것 방지)
@@ -935,7 +941,7 @@ public class Logger implements LogKeys {
// SIFT appender를 추가할 대상 로거 목록 // SIFT appender를 추가할 대상 로거 목록
// → ESBFW, ADAPTER, DEFAULT 등 거래 처리에 관여하는 로거 추가 // → ESBFW, ADAPTER, DEFAULT 등 거래 처리에 관여하는 로거 추가
String[] siftTargetLoggers = { LOGGER_ESBFW, LOGGER_ADAPTER, LOGGER_DEFAULT String[] siftTargetLoggers = { LOGGER_ESBFW, LOGGER_ADAPTER, LOGGER_DEFAULT, "org.apache.hc.client5.http"
// 필요 시 LOGGER_TRAN, LOGGER_NET 등 추가 // 필요 시 LOGGER_TRAN, LOGGER_NET 등 추가
}; };
@@ -437,4 +437,102 @@ public final class MaskingUtils {
} }
return sb.toString(); return sb.toString();
} }
public static final int ResidentNumber = 11;
public static final int DriverLicense = 12;
public static final int Passport = 13;
public static final int ForeignerNumber = 14;
public static final int AccountNumber = 21;
public static final int CardNumber = 22;
public static final int CardExpiry = 23;
public static final int Cvv = 24;
public static final int Password = 31;
public static final int PhoneNumber = 41;
public static final int MobileNumber = 41;
public static final int FaxNumber = 41;
public static final int Email = 42;
public static final int KoreanName = 43;
public static final int EnglishName = 44;
public static final int JibunAddress = 45;
public static final int RoadAddress = 46;
public static final int Ip = 51;
public static final int All = 99;
/**
* 마스킹 타입코드에 맞추어 마스킹 처리
*
* @param str
* @param maskOffset
* @return
*/
public static String mask(String str, int maskOffset) {
switch (maskOffset) {
case ResidentNumber:
return maskResidentNumber(str);
case DriverLicense:
return maskDriverLicense(str);
case Passport:
return maskPassport(str);
case ForeignerNumber:
return maskForeignerNumber(str);
case AccountNumber:
return maskAccountNumber(str);
case CardNumber:
return maskCardNumber(str);
case CardExpiry:
return maskCardExpiry(str);
case Cvv:
return maskCvv(str);
case Password:
return maskPassword(str);
// PhoneNumber(41) = MobileNumber(41) = FaxNumber(41): 값이 같아
// case 레이블을 각각 선언하면 컴파일 에러(중복 case)이므로 하나로 통합.
// maskPhoneNumber가 전화/휴대폰/팩스 형식을 모두 처리함.
case PhoneNumber:
return maskPhoneNumber(str);
case Email:
return maskEmail(str);
case KoreanName:
return maskKoreanName(str);
case EnglishName:
return maskEnglishName(str);
case JibunAddress:
return maskJibunAddress(str);
case RoadAddress:
return maskRoadAddress(str);
case Ip:
return maskIpAddress(str);
case All:
return stars(str.length());
default:
return str;
}
}
} }
@@ -10,12 +10,16 @@ public class STDMessageErrorKeys {
private static final String STDMESSAGE_ERROR_CODE ="STDMESSAGE_ERROR_CODE"; private static final String STDMESSAGE_ERROR_CODE ="STDMESSAGE_ERROR_CODE";
private static final String SUCCESS_CODE ="SUCCESS_CODE"; private static final String SUCCESS_CODE ="SUCCESS_CODE";
private static final String SUCCESS_MSG ="SUCCESS_MSG"; private static final String SUCCESS_MSG ="SUCCESS_MSG";
private static final String SUCCESS_DESC ="SUCCESS_DESC";
private static final String SYSTEM_ERROR_CODE ="SYSTEM_ERROR_CODE"; private static final String SYSTEM_ERROR_CODE ="SYSTEM_ERROR_CODE";
private static final String SYSTEM_ERROR_MSG ="SYSTEM_ERROR_MSG"; private static final String SYSTEM_ERROR_MSG ="SYSTEM_ERROR_MSG";
private static final String SYSTEM_ERROR_DESC ="SYSTEM_ERROR_DESC";
private static final String TIMEOUT_ERROR_CODE ="TIMEOUT_ERROR_CODE"; private static final String TIMEOUT_ERROR_CODE ="TIMEOUT_ERROR_CODE";
private static final String TIMEOUT_ERROR_MSG ="TIMEOUT_ERROR_MSG"; private static final String TIMEOUT_ERROR_MSG ="TIMEOUT_ERROR_MSG";
private static final String TIMEOUT_ERROR_DESC ="TIMEOUT_ERROR_DESC";
private static final String BIZ_ERROR_CODE ="BIZ_ERROR_CODE"; private static final String BIZ_ERROR_CODE ="BIZ_ERROR_CODE";
private static final String BIZ_ERROR_MSG ="BIZ_ERROR_MSG"; private static final String BIZ_ERROR_MSG ="BIZ_ERROR_MSG";
private static final String BIZ_ERROR_DESC ="BIZ_ERROR_DESC";
private static final String DUP_LOGIN_ERROR_CODE ="DUP_LOGIN_ERROR_CODE"; private static final String DUP_LOGIN_ERROR_CODE ="DUP_LOGIN_ERROR_CODE";
private static final String DUP_LOGIN_ERROR_MSG ="DUP_LOGIN_ERROR_MSG"; private static final String DUP_LOGIN_ERROR_MSG ="DUP_LOGIN_ERROR_MSG";
private static final String NOT_LOGIN_ERROR_CODE ="NOT_LOGIN_ERROR_CODE"; private static final String NOT_LOGIN_ERROR_CODE ="NOT_LOGIN_ERROR_CODE";
@@ -28,44 +32,72 @@ public class STDMessageErrorKeys {
private static final String UUID_MISMATCH_ERROR_MSG ="UUID_MISMATCH_ERROR_MSG"; private static final String UUID_MISMATCH_ERROR_MSG ="UUID_MISMATCH_ERROR_MSG";
private static final String VALID_VALUE_ERROR_CODE ="VALID_VALUE_ERROR_CODE"; private static final String VALID_VALUE_ERROR_CODE ="VALID_VALUE_ERROR_CODE";
private static final String VALID_VALUE_ERROR_MSG ="VALID_VALUE_ERROR_MSG"; private static final String VALID_VALUE_ERROR_MSG ="VALID_VALUE_ERROR_MSG";
private static final String VALID_VALUE_ERROR_DESC ="VALID_VALUE_ERROR_DESC";
private static final String RATELIMIT_ERROR_CODE ="RATELIMIT_ERROR_CODE"; private static final String RATELIMIT_ERROR_CODE ="RATELIMIT_ERROR_CODE";
private static final String RATELIMIT_ERROR_MSG ="RATELIMIT_ERROR_MSG"; private static final String RATELIMIT_ERROR_MSG ="RATELIMIT_ERROR_MSG";
private static final String RATELIMIT_ERROR_DESC ="RATELIMIT_ERROR_DESC";
private static final String RESTRICT_ERROR_CODE ="RESTRICT_ERROR_CODE";
private static final String RESTRICT_ERROR_MSG ="RESTRICT_ERROR_MSG";
private static final String RESTRICT_ERROR_DESC ="RESTRICT_ERROR_DESC";
//사이트별 에러코드 //사이트별 에러코드
public static String SUCCESS_CODE_VALUE ;//성공코드 public static volatile String SUCCESS_CODE_VALUE ;//성공코드
public static String SUCCESS_MSG_VALUE ;//성공메시지 public static volatile String SUCCESS_MSG_VALUE ;//성공메시지
public static String SYSTEM_ERROR_CODE_VALUE ;//시스템 에러코드 public static volatile String SUCCESS_DESC_VALUE ;//성공메시지
public static String SYSTEM_ERROR_MSG_VALUE ;//시스템 에러메시지 public static volatile String SYSTEM_ERROR_CODE_VALUE ;//시스템 에러코드
public static String BIZ_ERROR_CODE_VALUE ;//업무 에러코드 public static volatile String SYSTEM_ERROR_MSG_VALUE ;//시스템 에러메시지
public static String BIZ_ERROR_MSG_VALUE ;//업무 에러메시지 public static volatile String SYSTEM_ERROR_DESC_VALUE ;//시스템 에러메시지
public static String TIMEOUT_ERROR_CODE_VALUE ;//타임아웃 에러코드 public static volatile String BIZ_ERROR_CODE_VALUE ;//업무 에러코드
public static String TIMEOUT_ERROR_MSG_VALUE ;//타임아웃 에러메시지 public static volatile String BIZ_ERROR_MSG_VALUE ;//업무 에러메시지
public static String DUP_LOGIN_ERROR_CODE_VALUE ;//중복로그인 에러코드 public static volatile String BIZ_ERROR_DESC_VALUE ;//업무 에러메시지
public static String DUP_LOGIN_ERROR_MSG_VALUE ;//중복로그인 에러메시지 public static volatile String TIMEOUT_ERROR_CODE_VALUE ;//타임아웃 에러코드
public static String NOT_LOGIN_ERROR_CODE_VALUE ;//미로그인 에러코드 public static volatile String TIMEOUT_ERROR_MSG_VALUE ;//타임아웃 에러메시지
public static String NOT_LOGIN_ERROR_MSG_VALUE ;//미로그인 에러메시지 public static volatile String TIMEOUT_ERROR_DESC_VALUE ;//타임아웃 에러메시지
public static String APPROVE_ERROR_CODE_VALUE ;//책임자승인 에러코드 public static volatile String DUP_LOGIN_ERROR_CODE_VALUE ;//중복로그인 에러코드
public static String APPROVE_ERROR_MSG_VALUE ;//책임자승인 에러메시지 public static volatile String DUP_LOGIN_ERROR_MSG_VALUE ;//중복로그인 에러메시지
public static String APPROVE_NOT_FOUND_ERROR_CODE_VALUE ;//책임자 승인자가 존재하지 않는 에러코드 public static volatile String NOT_LOGIN_ERROR_CODE_VALUE ;//미로그인 에러코드
public static String APPROVE_NOT_FOUND_ERROR_MSG_VALUE ;//책임자 승인자가 존재하지 않는 에러메시지 public static volatile String NOT_LOGIN_ERROR_MSG_VALUE ;//미로그인 에러메시지
public static String UUID_MISMATCH_ERROR_CODE_VALUE ;//UUID가 같지 않은 에러코드 public static volatile String APPROVE_ERROR_CODE_VALUE ;//책임자승인 에러코드
public static String UUID_MISMATCH_ERROR_MSG_VALUE ;//UUID가 같지 않은 에러메시지 public static volatile String APPROVE_ERROR_MSG_VALUE ;//책임자승인 에러메시지
public static String VALID_VALUE_ERROR_CODE_VALUE ;//유효값 에러코드 public static volatile String APPROVE_NOT_FOUND_ERROR_CODE_VALUE ;//책임자 승인자가 존재하지 않는 에러코드
public static String VALID_VALUE_ERROR_MSG_VALUE ;//유효값 에러메시지 public static volatile String APPROVE_NOT_FOUND_ERROR_MSG_VALUE ;//책임자 승인자가 존재하지 않는 에러메시지
public static String RATELIMIT_ERROR_CODE_VALUE ;//유량제어 에러코드 public static volatile String UUID_MISMATCH_ERROR_CODE_VALUE ;//UUID가 같지 않은 에러코드
public static String RATELIMIT_ERROR_MSG_VALUE ;//유량제어 에러메시지 public static volatile String UUID_MISMATCH_ERROR_MSG_VALUE ;//UUID가 같지 않은 에러메시지
public static volatile String VALID_VALUE_ERROR_CODE_VALUE ;//유효값 에러코드
public static volatile String VALID_VALUE_ERROR_MSG_VALUE ;//유효값 에러메시지
public static volatile String VALID_VALUE_ERROR_DESC_VALUE ;//유효값 에러메시지
public static volatile String RATELIMIT_ERROR_CODE_VALUE ;//유량제어 에러코드
public static volatile String RATELIMIT_ERROR_MSG_VALUE ;//유량제어 에러메시지
public static volatile String RATELIMIT_ERROR_DESC_VALUE ;//유량제어 에러메시지
public static volatile String RESTRICT_ERROR_CODE_VALUE ;//거래제한 에러코드
public static volatile String RESTRICT_ERROR_MSG_VALUE ;//거래제한 에러메시지
public static volatile String RESTRICT_ERROR_DESC_VALUE ;//거래제한 에러메시지
//기존 오류코드는 900400 과 900401만 사용했음 //기존 오류코드는 900400 과 900401만 사용했음
static { static {
PropManager manager = PropManager.getInstance(); PropManager manager = PropManager.getInstance();
loadValues(manager);
// STDMESSAGE_ERROR_CODE 그룹 리로드 시 자동 갱신
manager.addPropertyChangeListener(evt -> {
if (STDMESSAGE_ERROR_CODE.equals(evt.getPropertyName())) {
loadValues(PropManager.getInstance());
}
});
}
private static synchronized void loadValues(PropManager manager) {
SUCCESS_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SUCCESS_CODE,"900000"); SUCCESS_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SUCCESS_CODE,"900000");
SUCCESS_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SUCCESS_MSG,"정상 처리되었습니다."); SUCCESS_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SUCCESS_MSG,"정상 처리되었습니다.");
SUCCESS_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SUCCESS_DESC,SUCCESS_MSG_VALUE);
SYSTEM_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SYSTEM_ERROR_CODE,"900400"); SYSTEM_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SYSTEM_ERROR_CODE,"900400");
SYSTEM_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SYSTEM_ERROR_MSG,"시스템오류가 발생하였습니다."); SYSTEM_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SYSTEM_ERROR_MSG,"시스템오류가 발생하였습니다.");
SYSTEM_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,SYSTEM_ERROR_DESC,SYSTEM_ERROR_MSG_VALUE);
TIMEOUT_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,TIMEOUT_ERROR_CODE,"900401"); TIMEOUT_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,TIMEOUT_ERROR_CODE,"900401");
TIMEOUT_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,TIMEOUT_ERROR_MSG,"타임아웃오류가 발생하였습니다."); TIMEOUT_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,TIMEOUT_ERROR_MSG,"타임아웃오류가 발생하였습니다.");
TIMEOUT_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,TIMEOUT_ERROR_DESC,TIMEOUT_ERROR_MSG_VALUE);
BIZ_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,BIZ_ERROR_CODE,"900402"); BIZ_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,BIZ_ERROR_CODE,"900402");
BIZ_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,BIZ_ERROR_MSG,"업무오류가 발생하였습니다."); BIZ_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,BIZ_ERROR_MSG,"API오류가 발생하였습니다.");
BIZ_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,BIZ_ERROR_DESC,BIZ_ERROR_MSG_VALUE);
DUP_LOGIN_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,DUP_LOGIN_ERROR_CODE,"900403"); DUP_LOGIN_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,DUP_LOGIN_ERROR_CODE,"900403");
DUP_LOGIN_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,DUP_LOGIN_ERROR_MSG,"중복로그인오류가 발생하였습니다."); DUP_LOGIN_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,DUP_LOGIN_ERROR_MSG,"중복로그인오류가 발생하였습니다.");
NOT_LOGIN_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,NOT_LOGIN_ERROR_CODE,"900404"); NOT_LOGIN_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,NOT_LOGIN_ERROR_CODE,"900404");
@@ -78,8 +110,17 @@ public class STDMessageErrorKeys {
UUID_MISMATCH_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,UUID_MISMATCH_ERROR_MSG,"MCI 세션ID가 같지않은 오류가 발생하였습니다."); UUID_MISMATCH_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,UUID_MISMATCH_ERROR_MSG,"MCI 세션ID가 같지않은 오류가 발생하였습니다.");
VALID_VALUE_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,VALID_VALUE_ERROR_CODE,"900408"); VALID_VALUE_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,VALID_VALUE_ERROR_CODE,"900408");
VALID_VALUE_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,VALID_VALUE_ERROR_MSG,"유효값 오류가 발생하였습니다."); VALID_VALUE_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,VALID_VALUE_ERROR_MSG,"유효값 오류가 발생하였습니다.");
VALID_VALUE_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,VALID_VALUE_ERROR_DESC,VALID_VALUE_ERROR_MSG_VALUE);
RATELIMIT_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RATELIMIT_ERROR_CODE,"900409"); RATELIMIT_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RATELIMIT_ERROR_CODE,"900409");
RATELIMIT_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RATELIMIT_ERROR_MSG,"RateLimiter Overflow"); RATELIMIT_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RATELIMIT_ERROR_MSG,"RateLimiter Overflow");
RATELIMIT_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RATELIMIT_ERROR_DESC,RATELIMIT_ERROR_MSG_VALUE);
RESTRICT_ERROR_CODE_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RESTRICT_ERROR_CODE,"900410");
RESTRICT_ERROR_MSG_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RESTRICT_ERROR_MSG,"거래제한");
RESTRICT_ERROR_DESC_VALUE = manager.getProperty(STDMESSAGE_ERROR_CODE,RESTRICT_ERROR_DESC,RESTRICT_ERROR_MSG_VALUE);
}
public static void reload() {
loadValues(PropManager.getInstance());
} }
private STDMessageErrorKeys() { private STDMessageErrorKeys() {