Home > Back-End > 결제 서비스 MSA 아키텍쳐 전환 > 2. 결제 서비스 어댑터 구현체 설계

2. 결제 서비스 어댑터 구현체 설계
Spring Boot 3.4.0 Java 21 Interface Port and Adapter Pattern Implementation

결제 서비스의 PaymentPort 인터페이스를 구현한 PaymentAdapter 클래스에 대해 설명합니다. 이 클래스는 실제 결제 처리를 수행하는 구현체로서, 외부 결제 시스템과의 통신을 담당합니다.

클래스 구조

@Service
@Transactional(transactionManager = "paymentTransactionManager")
@RequiredArgsConstructor
public class PaymentAdapter implements PaymentPort {
    private final MyPgProducer producer;
    private final PaymentService paymentService;
    private final ObjectMapper objectMapper;
    private final AES aesCrypto;
    // ...
}

주요 특징

1. 스프링 컴포넌트 설정

  • @Service: 스프링의 서비스 계층 컴포넌트로 등록
  • @Transactional: 결제 트랜잭션 관리를 위한 설정 (paymentTransactionManager 사용)
  • @RequiredArgsConstructor: 의존성 주입을 위한 생성자 자동 생성

2. 의존성 구성

  • MyPgProducer: PG사 시스템과의 통신을 담당하는 컴포넌트
  • PaymentService: 결제 정보 영속성 관리를 위한 서비스
  • ObjectMapper: JSON 데이터 변환을 위한 유틸리티
  • AES: 암호화/복호화를 위한 유틸리티

주요 메서드 구현

1. payment() - 결제 처리 구현

@Override
public PaymentResponse payment(PaymentPayload payload, PaymentAdapterRunnable<BaseResponse> runnable) {
    PaymentRequest request = PaymentRequest.from(payload);
    Payment entity = paymentService.update(request.toEntity());
    runnable.createUuidRunnable().run(entity.getUuid().toString());
    // ...
}
  • 결제 요청 데이터를 PG사 요구 형식으로 변환
  • 결제 정보를 데이터베이스에 저장
  • UUID 생성 및 처리 결과 콜백 실행
  • 에러 발생 시 별도 처리

2. sendBill() - 결제 청구서 발송

  • 결제 청구서 데이터 생성 및 PG사 전송
  • 응답 결과에 따른 처리 분기
  • 성공/실패 시나리오에 대한 콜백 처리
  • 결제 정보 업데이트 및 응답 생성

3. callback() - 결제 콜백 처리

@Override
public PaymentCallbackResponse callback(PaymentCallbackRequest payload, String hash) {
    ApiHistories histories = producer.requestLogging(payload, CALLBACK_PAYMENT.getUri());
    Payment entity = paymentService.findPaymentByCallbackHash(decryptCallbackHash(hash));
    // ...
}
  • 콜백 요청 로깅
  • 해시값을 통한 결제 정보 검증
  • 결제 상태 업데이트
  • 응답 생성 및 로깅

4. 공통 처리 패턴

모든 메서드는 다음과 같은 공통된 패턴을 따릅니다:

  1. 요청 데이터 변환
  2. 데이터베이스 엔티티 처리
  3. PG사 API 호출
  4. 에러 처리
  5. 결과 업데이트
  6. 콜백 실행
  7. 응답 반환

에러 처리 전략

if (response.isError()) {
    runnable.errorRunnable().run(entity.getUuid().toString(), response);
    return ErrorResponse.from(/*...*/);
}
  • 모든 PG사 통신에서 에러 체크
  • 에러 발생 시 별도 콜백 실행
  • 트랜잭션 롤백 처리
  • 클라이언트에 적절한 에러 응답 반환

보안 처리

  • AES 암호화를 통한 콜백 해시 검증
  • 민감한 결제 정보 보호
  • API 키 기반의 인증 처리

트랜잭션 관리

  • 전용 트랜잭션 매니저 사용
  • 결제 데이터의 정합성 보장
  • 실패 시 롤백 처리

이러한 구현을 통해 PaymentAdapter는:

  1. 결제 처리의 안정성 보장
  2. 외부 시스템과의 견고한 통합
  3. 에러 상황에 대한 안전한 처리
  4. 트랜잭션 정합성 유지
  5. 보안 요구사항 충족

등을 달성하고 있습니다.