diff --git a/src/main/java/com/eactive/eai/common/authoutbound/AccessTokenManagerByDB.java b/src/main/java/com/eactive/eai/common/authoutbound/AccessTokenManagerByDB.java index 02d42f3..11113ce 100644 --- a/src/main/java/com/eactive/eai/common/authoutbound/AccessTokenManagerByDB.java +++ b/src/main/java/com/eactive/eai/common/authoutbound/AccessTokenManagerByDB.java @@ -258,7 +258,7 @@ public class AccessTokenManagerByDB implements Lifecycle { if (cached == null) { logger.debug("Token not exists for adapter group: {}", adapterGroupName); sessionManager.getOutboundAccessToken(adapterGroupName, - token -> issueToken(credential)); + token -> issueToken(credential, TokenIssueHistory.TRIGGER_SCHEDULE)); } else if (cached.getExpiration() == null) { // 만료시각이 없는 토큰은 갱신 시점을 판단할 수 없다. @@ -272,7 +272,7 @@ public class AccessTokenManagerByDB implements Lifecycle { logger.debug("Token expires before next schedule : {}, expiration date: {}", adapterGroupName, cached.getExpiration()); sessionManager.reissueOutboundAccessToken(adapterGroupName, cached.getAccessToken(), - intervalTime, token -> issueToken(credential)); + intervalTime, token -> issueToken(credential, TokenIssueHistory.TRIGGER_SCHEDULE)); } else { logger.debug( @@ -300,7 +300,10 @@ public class AccessTokenManagerByDB implements Lifecycle { } } - private AccessTokenVO issueToken(OutboundOAuthCredentialVo outboundOAuthCredentialVo) { + /** + * @param trigger 발급 이력에 남길 호출 경로 (TokenIssueHistory.TRIGGER_*) + */ + private AccessTokenVO issueToken(OutboundOAuthCredentialVo outboundOAuthCredentialVo, String trigger) { String adapterGroupName = outboundOAuthCredentialVo.getAdapterGroupName(); AccessTokenVO accessToken = null; try { @@ -335,12 +338,12 @@ public class AccessTokenManagerByDB implements Lifecycle { accessToken = (AccessTokenVO) service.execute(adapterGroupName, properties, outboundOAuthCredentialVo); } catch (Exception e) { - recordIssueHistory(adapterGroupName, TokenIssueHistory.TRIGGER_SCHEDULE, type, startTime, null, + recordIssueHistory(adapterGroupName, trigger, type, startTime, null, toFailReason(e)); throw e; } - recordIssueHistory(adapterGroupName, TokenIssueHistory.TRIGGER_SCHEDULE, type, startTime, + recordIssueHistory(adapterGroupName, trigger, type, startTime, accessToken, null); // 발급에 실패했는데도 빈 토큰을 반환하는 구현체가 있다. 그대로 캐시되면 @@ -354,12 +357,12 @@ public class AccessTokenManagerByDB implements Lifecycle { return accessToken; } else { - recordIssueHistory(adapterGroupName, TokenIssueHistory.TRIGGER_SCHEDULE, type, + recordIssueHistory(adapterGroupName, trigger, type, System.currentTimeMillis(), null, "토큰 발급 구현체를 찾을 수 없음"); logger.warn("Token service not found for type: {} and adapter group: {}", type, adapterGroupName); } } else { - recordIssueHistory(adapterGroupName, TokenIssueHistory.TRIGGER_SCHEDULE, null, + recordIssueHistory(adapterGroupName, trigger, null, System.currentTimeMillis(), null, "어댑터 설정을 찾을 수 없음"); logger.warn("No valid adapter configuration found for adapter group: {}", adapterGroupName); } @@ -429,7 +432,7 @@ public class AccessTokenManagerByDB implements Lifecycle { * 3. 주의사항 : accessToken 은 앞 UNMASKED_TOKEN_LENGTH 자만 남겨 보관한다. * * @param adapterGroupName 어댑터그룹명 - * @param trigger SCHEDULE / RETRY + * @param trigger SCHEDULE / RETRY / TRANSACTION * @param serviceClass 사용한 발급 구현체 클래스명 * @param startTime 발급 시도 시각 * @param accessToken 발급된 토큰. 실패 시 null. @@ -553,7 +556,8 @@ public class AccessTokenManagerByDB implements Lifecycle { OutboundOAuthCredentialVo outboundOAuthCredentialVo = outboundOAuthCredentialVos .get(adapterGroupName); - return issueToken(outboundOAuthCredentialVo); + // 스케줄러가 아니라 거래 스레드가 토큰이 없거나 만료된 것을 보고 발급하는 경로다. + return issueToken(outboundOAuthCredentialVo, TokenIssueHistory.TRIGGER_TRANSACTION); } }); diff --git a/src/main/java/com/eactive/eai/common/authoutbound/TokenIssueHistory.java b/src/main/java/com/eactive/eai/common/authoutbound/TokenIssueHistory.java index 4101f93..3026786 100644 --- a/src/main/java/com/eactive/eai/common/authoutbound/TokenIssueHistory.java +++ b/src/main/java/com/eactive/eai/common/authoutbound/TokenIssueHistory.java @@ -17,15 +17,18 @@ public class TokenIssueHistory { /** 스케줄러의 주기 발급 */ public static final String TRIGGER_SCHEDULE = "SCHEDULE"; - /** 거래 중 재발급 */ + /** 거래 중 재발급 (기관이 토큰을 거부한 경우) */ public static final String TRIGGER_RETRY = "RETRY"; + /** 거래 중 발급 (캐시에 토큰이 없거나 이미 만료된 경우) */ + public static final String TRIGGER_TRANSACTION = "TRANSACTION"; + private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** 발급을 시도한 시각 */ private final String issuedAt; - /** SCHEDULE | RETRY */ + /** SCHEDULE | RETRY | TRANSACTION */ private final String trigger; /** 사용한 발급 구현체 클래스명 */