package com.eactive.ext.kjb.obp; import com.eactive.ext.kjb.common.KjbObpException; import com.eactive.ext.kjb.common.KjbProperty; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @Slf4j public class KjbObpModule { private static final String FAKE_PARTNER_CODE = "999999-99"; private static KjbObpModule _instance; private final KjbProperty property; private final ObpClient client; public static synchronized KjbObpModule getInstance(KjbProperty kjbProperty) { if (_instance == null) { _instance = new KjbObpModule(kjbProperty); } return _instance; } private KjbObpModule(KjbProperty kjbProperty) { if (kjbProperty == null) { throw new IllegalArgumentException("KjbProperty cannot be null"); } this.property = kjbProperty; this.client = ObpClient.getInstance(kjbProperty); } /** * 사업자등록번호로 partnerCode 조회 * @param bizNo 사업자등록번호 (숫자 외 문자 자동 제거) * @return partnerCode * @throws KjbObpException 조회 실패 시 */ public String queryPartnerCode(String bizNo) throws KjbObpException { bizNo = ObpUtil.onlyDigit(bizNo); if (StringUtils.isEmpty(bizNo)) { throw new IllegalArgumentException("BizNo is empty."); } if (bizNo.length() != 10) { throw new IllegalArgumentException("BizNo must be 10 digits. (input: " + bizNo + ")"); } // 가상모드: URL 미설정 시 가상 파트너코드 반환 if (!client.isRealMode()) { log.info("[OBP] 가상모드 - 가상 partnerCode 반환: {}", FAKE_PARTNER_CODE); return FAKE_PARTNER_CODE; } String path = String.format(property.getObpUrlOrganizationFmt(), bizNo); log.debug("[OBP] queryPartnerCode - bizNo: {}, path: {}", bizNo, path); ObpResponse response = client.get(path); if (response.getStatus() != 200) { log.warn("[OBP] queryPartnerCode failed - status: {}, body: {}", response.getStatus(), response.getBody()); throw new KjbObpException(response.getStatus(), "OBP 조회 실패: " + response.getBody()); } ObpOrganization org = ObpOrganization.fromResponse(response); if (org == null) { throw new KjbObpException("OBP 응답 파싱 실패"); } if (!org.hasPartnerCode()) { throw new KjbObpException("partnerCode가 없습니다. bizNo: " + bizNo); } return org.getPartnerCode(); } /** * ObpClient 반환 (직접 API 호출용) */ public ObpClient getClient() { return client; } }