diff --git a/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/MessageReceiveService.java b/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/MessageReceiveService.java new file mode 100644 index 0000000..45c212b --- /dev/null +++ b/boot/modules/acquiring/src/main/java/com/klaro/acquirecore/acquiring/service/MessageReceiveService.java @@ -0,0 +1,121 @@ +package com.klaro.acquirecore.acquiring.service; + +import com.klaro.acquirecore.acquiring.codec.MessageCodec; +import com.klaro.acquirecore.acquiring.codec.ParsedMessage; +import com.klaro.acquirecore.acquiring.dto.AcquireMessageDto; +import com.klaro.acquirecore.acquiring.dto.AcquireResponseDto; +import com.klaro.acquirecore.acquiring.repository.AcquireTransactionRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Optional; + +/** + * 매입 전문수신 서비스 (TX_SERVICE → @Service) + * legacy/app/online/mg_recv_svc.pgc 전환 + */ +@Service +public class MessageReceiveService { + + private static final Logger log = LoggerFactory.getLogger(MessageReceiveService.class); + + private final MessageCodec messageCodec; + private final AcquireTransactionRepository transactionRepository; + + public MessageReceiveService(MessageCodec messageCodec, + AcquireTransactionRepository transactionRepository) { + this.messageCodec = messageCodec; + this.transactionRepository = transactionRepository; + } + + /** + * 전문 수신 및 처리 + * @param rawMessage 원시 전문 데이터 + * @return 처리 결과 DTO + */ + public AcquireResponseDto receiveAndProcess(byte[] rawMessage) { + log.info("전문 수신 시작 - 길이: {}", rawMessage.length); + + try { + // 1. 전문 언팩 (codec) + ParsedMessage parsed = messageCodec.unpack(rawMessage); + log.debug("전문 언팩 완료 - TX_CODE: {}", parsed.getTxCode()); + + // 2. DTO 변환 + AcquireMessageDto messageDto = toDto(parsed); + + // 3. 거래 처리 + AcquireResponseDto response = processTransaction(messageDto); + + log.info("전문 처리 완료 - 응답코드: {}", response.getResultCode()); + return response; + + } catch (Exception e) { + log.error("전문 처리 오류", e); + return AcquireResponseDto.error("9999", "전문 처리 실패: " + e.getMessage()); + } + } + + /** + * 거래 처리 로직 + */ + private AcquireResponseDto processTransaction(AcquireMessageDto dto) { + String txCode = dto.getTxCode(); + + switch (txCode) { + case "TX001": + return processTx001(dto); + case "TX002": + return processTx002(dto); + case "TX003": + return processTx003(dto); + default: + log.warn("알 수 없는 거래코드: {}", txCode); + return AcquireResponseDto.error("9998", "알 수 없는 거래코드: " + txCode); + } + } + + private AcquireResponseDto processTx001(AcquireMessageDto dto) { + log.debug("TX001 처리: {}", dto.getMerchantId()); + // 매입 요청 처리 + return AcquireResponseDto.success("0000", dto.getTxId()); + } + + private AcquireResponseDto processTx002(AcquireMessageDto dto) { + log.debug("TX002 처리: {}", dto.getMerchantId()); + // 매입 취소 처리 + return AcquireResponseDto.success("0000", dto.getTxId()); + } + + private AcquireResponseDto processTx003(AcquireMessageDto dto) { + log.debug("TX003 처리: {}", dto.getMerchantId()); + // 매입 조회 처리 + return AcquireResponseDto.success("0000", dto.getTxId()); + } + + /** + * ParsedMessage → AcquireMessageDto 변환 + */ + private AcquireMessageDto toDto(ParsedMessage parsed) { + AcquireMessageDto dto = new AcquireMessageDto(); + dto.setTxId(parsed.getTxId()); + dto.setTxCode(parsed.getTxCode()); + dto.setMerchantId(parsed.getMerchantId()); + dto.setAmount(parsed.getAmount()); + dto.setCardNumber(parsed.getCardNumber()); + dto.setApprovalCode(parsed.getApprovalCode()); + dto.setMessageType(parsed.getMessageType()); + dto.setReceiveTime(LocalDateTime.now()); + return dto; + } + + /** + * 거래ID로 거래 정보 조회 + */ + public Optional findByTxId(String txId) { + return transactionRepository.findByTxId(txId) + .map(this::toDto); + } +}