결제 서비스의 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. 공통 처리 패턴
모든 메서드는 다음과 같은 공통된 패턴을 따릅니다:
- 요청 데이터 변환
- 데이터베이스 엔티티 처리
- PG사 API 호출
- 에러 처리
- 결과 업데이트
- 콜백 실행
- 응답 반환
에러 처리 전략
if (response.isError()) {
runnable.errorRunnable().run(entity.getUuid().toString(), response);
return ErrorResponse.from(/*...*/);
}
- 모든 PG사 통신에서 에러 체크
- 에러 발생 시 별도 콜백 실행
- 트랜잭션 롤백 처리
- 클라이언트에 적절한 에러 응답 반환
보안 처리
- AES 암호화를 통한 콜백 해시 검증
- 민감한 결제 정보 보호
- API 키 기반의 인증 처리
트랜잭션 관리
- 전용 트랜잭션 매니저 사용
- 결제 데이터의 정합성 보장
- 실패 시 롤백 처리
이러한 구현을 통해 PaymentAdapter는:
- 결제 처리의 안정성 보장
- 외부 시스템과의 견고한 통합
- 에러 상황에 대한 안전한 처리
- 트랜잭션 정합성 유지
- 보안 요구사항 충족
등을 달성하고 있습니다.