인프런 커뮤니티 질문&답변

리나님의 프로필 이미지
리나

작성한 질문수

견고한 결제 시스템 구축

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

해결된 질문

작성

·

214

·

수정됨

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')

답변 1

0

여정민님의 프로필 이미지
여정민
지식공유자

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

 

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

 

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

 

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

리나님의 프로필 이미지
리나
질문자

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

 

image

기존에는

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

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

 

혹시 몰라서

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

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

여정민님의 프로필 이미지
여정민
지식공유자

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

리나님의 프로필 이미지
리나
질문자

선생님 github 아이디가

 

Jeongmin Yeo

 

맞으신가요?

 

초대해드렸습니다!

여정민님의 프로필 이미지
여정민
지식공유자

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

 

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

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

 

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

 

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

 

image

리나님의 프로필 이미지
리나
질문자

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

리나님의 프로필 이미지
리나

작성한 질문수

질문하기