inflearn logo
강의

Course

Instructor

Build a robust payment system

Ledger 및 Wallet 서비스에서 Kafka Consumer PaymentEventMessageHandler 에 typecast 문제가 발생됩니다.

Resolved

383

syh8088

77 asked

1

 

1111.png

 

 

	@Bean
	public Consumer<Message<PaymentEventMessage>> consume() {
		return message -> {


            PaymentEventMessage payload = message.getPayload();
	    LedgerEventMessage ledgerEventMessage = doubleLedgerEntryRecordUseCase.recordDoubleLedgerEntry(message.getPayload());
	    streamBridge.send("ledger", ledgerEventMessage);
	      };
        }

 

해당 로직은 Ledger 서비스의 Kafka 메시지 Consumer 역할을 맡고 있는 'consume' 메소드 입니다.

 

정상적으로 결제 confirm 완료가 되면 Kafka 에 메시지를 정상적으로 등록 된 것을 확인 하였는데요.

이 후 consumer 에서 메시지를 잘 가지고 오지만 byte[] 타입이라 PaymentEventMessage 로 타입캐스트 하는데 문제가 발생되네요..

 

33333.png

444444.png

Kafka 설정에서 Deserialize 설정만 해주면 되는 느낌인데... 구글링 해봐도... 잘 안되어서 이렇게 질문 드립니다!

2222.png

 

에러 문구

 

class [B cannot be cast to class com.example.ledgerservice.ledger.domain.PaymentEventMessage ([B is in module java.base of loader 'bootstrap'; com.example.ledgerservice.ledger.domain.PaymentEventMessage is in unnamed module of loader 'app')

spring spring-boot dbms/rdbms backend payments

Answer 1

0

yjm9505168574

안녕하세요~ 질문 남겨주셔서 감사합니다.

 

저도 이전에 이런 에러를 본 적이 있는데 직렬화 과정에서 에러가 나는 것 같아요. Spring MVC 의존성을 넣어주시면 될 것 같은데 한번 추가해 보실래요?

 

Spring MVC 에 직렬화/역직렬화에 필요한 의존성이 들어가 있어서 이걸 추가하면 될 것 같습니다.

 

한번 추가해 보시고 안되면 말씀해 주세요~

0

syh8088

안녕하세요 답변 감사합니다!

 

image

기존에는

implementation 'org.springframework.boot:spring-boot-starter-web'

추가한 상태에서 문제가 있었고

 

혹시 몰라서

implementation("org.springframework:spring-webmvc")

이 부분도 추가 해서 다시 한번 TEST 해보았지만 다시 동일한 문제가 발생되네요 ㅠ,ㅠ

0

yjm9505168574

앗 안되시나보네요. 혹시 제가 따로 코드를 실행해 볼 수 있도록 git 레파지토리 있으실까요? 중요한 시크릿 정보들은 제외해서 레파지토리 링크 주시면 제가 따로 해보고 연락드릴게요~

1

syh8088

선생님 github 아이디가

 

Jeongmin Yeo

 

맞으신가요?

 

초대해드렸습니다!

1

yjm9505168574

안녕하세요~ 살펴보니까 아래와 같이 PaymentEventMessage 에 기본 생성자가 없어서 역직렬화에 실패하고 있었어요. 이거 추가하시면 잘 될겁니다.

 

기본 생성자가 필요한 이유는 Jackson이 객체를 역직렬화할 때 자바의 리플렉션(Reflection)을 사용하여 객체를 생성하고, 이후에 각 필드에 값을 설정하기 때문이에요.

(리플렉션(Reflection)은 프로그램이 실행 중에 클래스, 메소드, 필드, 인터페이스 등을 동적으로 조사하고 수정할 수 있는 메커니즘을 말해요.)

 

기본 생성자를 추가하는 방법 이외에도 Jackson 애노테이션을 추가하는 방법도 있으니 찾아보시면 나올거에요~

 

이것 때문에 강의 진도도 못 나가셨을 것 같아요.. 고생하셨습니다.

 

image

0

syh8088

선생님 덕분에 해결했습니다 정말 감사드립니다 :)

프로그램 아키텍쳐

0

60

1

실습코드 압축해제

0

77

1

confirm 로직에서 amount를 검증하는 부분에서 질문이 있습니다.

0

52

1

Transaction Demo 질문 드립니다.

0

59

1

cdc 방식

0

81

1

seed 키 및 orderId 에 대한 질문

0

64

1

결제 이후 404 Error 발생

0

160

1

테스트 코드 중 isPaymentDone 변환

0

75

1

가상의 Checkout 기능 구현 중 질문

0

183

1

docker Mysql 설정 문의

0

105

1

allOpen 설정이 잘못된 거 같습니다.

0

114

1

recovery 동시성 처리 관련 문의

0

117

1

confluent > skip 이 더이상 안되나봅니다.

0

106

1

강의 클론 코딩한 것 public repo에 올려도 되나요?

0

330

1

멱등키에 request를 넘기는 것

0

254

1

동시성 제어 (optimistic locking) 재시도 부분 질문 드립니다.

0

172

1

결제 복구의 세부 과정을 병렬로 처리한 이유가 궁금합니다

0

222

1

전체적인 헥사고날 아키텍쳐 설명

0

275

1

주문, 결제 로직에 대해서 질문이 있습니다.

0

280

1

주문 번호 생성 방식 관련 질문 있습니다

0

925

1

R2DBC 관련해서 질문 드립니다.

0

586

3

payment 상태 업데이트 변경 메서드를 3개나 두는 이유가 궁금합니다.

0

229

2

'더 견고해지기 위해 남은 작업' 수업자료

0

298

1

혹시 코드 리뷰 신청해도 될까요...?

0

310

1