반응형

이전 글: 2022.02.11 - [개발/spring] - [axon] query handler - clone coding

 

[axon] query handler - clone coding

이전 글: 2022.02.04 - [개발/spring] - [axon] event upcasting - clone coding [axon] event upcasting - clone coding 이전 글: 2022.01.25 - [개발/spring] - [axon] query/replay 성능개선 - clone coding [..

bangpurin.tistory.com

클론 코딩 참고 블로그는 다음과 같다: https://cla9.tistory.com/21?category=814447 

 

17. Query 어플리케이션 구현(Query) - 3

1. 서론 이번 포스팅에서는 Scatter-Gather Query를 구현하겠습니다. Scatter-Gather Query는 동일한 Query를 수행하는 Query Handler가 여러 App에 존재할 경우 모든 App에 Query를 요청하여 결과를 취합받아 최..

cla9.tistory.com

 

지난 시간에 이어 쿼리 핸들링에 대한 이야기이다.

총 세 가지 방법이 있는데 두 가지는 지난 시간에 코딩하였고 오늘은 마지막 방법인 Scatter-Gather Query를 구현한다.

위 블로그를 따라 구현하다보면 마지막 서버 실행 부분에 아래와 같이 circular reference 관련 에러가 난다.

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'org.axonframework.config.Configurer': Requested bean is currently in creation: Is there an unresolvable circular reference?

예전 글에서도 본 적 있는 에런데 아래와 같은 설정을 추가하면 된다. springboot2.6부터 circular reference 가 기본 설정에서 제외되었기 때문이다.

spring: 
  main:
    allow-circular-references: true

 

앱을 모두 실행하고 테스트 해봤을 때 로그를 확인해본다.

1. 쿼리 서비스 흐름

HolderAccountController.getAccountInfoScatterGather -> QueryServiceImpl.getAccountInfoScatterGather -> holderID / 잔액을 dto로 만들어서 제주/서울에게 넘긴 후 결과를 LoanLimitResult.class로 받아오라고 명령 -> 서울/제주의 QueryHandler 가 받아서 처리 -> Query Service에서는 두 곳에서의 응답이 다 오기를 기다리고 결과를 조합하여 리스트로 내려줌

Hibernate: select holderacco0_.holder_id as holder_i1_1_, holderacco0_.account_cnt as account_2_1_, holderacco0_.address as address3_1_, holderacco0_.name as name4_1_, holderacco0_.tel as tel5_1_, holderacco0_.total_balance as total_ba6_1_ from mv_account holderacco0_ where holderacco0_.holder_id=?
///////서울 제주로 요청 보냄

//////응답1 서울
15:57:34.506 DEBUG 8092 --- [ault-executor-1] o.a.a.c.query.AxonServerQueryBus         : Received query response [message_identifier: "204f7d62-8f12-4df7-881d-339387ab3fa2"
payload {
  type: "com.cqrs.loan.LoanLimitResult"
  data: "<com.cqrs.loan.LoanLimitResult><holderID>e5775054-4265-46ef-8116-297ac22f480d</holderID><bankName>SeoulBank</bankName><balance>7980</balance><loanLimit>11970</loanLimit></com.cqrs.loan.LoanLimitResult>"
}
meta_data {
  key: "traceId"
  value {
    text_value: "b540735f-c8a3-48da-96a7-9e90aa752966"
  }
}
meta_data {
  key: "correlationId"
  value {
    text_value: "b540735f-c8a3-48da-96a7-9e90aa752966"
  }
}
request_identifier: "b540735f-c8a3-48da-96a7-9e90aa752966"
]
//////응답2 제주
15:57:34.507 DEBUG 8092 --- [ault-executor-1] o.a.a.c.query.AxonServerQueryBus         : Received query response [message_identifier: "16efaa5a-e221-4740-85b2-ff5478d8ed4e"
payload {
  type: "com.cqrs.loan.LoanLimitResult"
  data: "<com.cqrs.loan.LoanLimitResult><holderID>e5775054-4265-46ef-8116-297ac22f480d</holderID><bankName>JejuBank</bankName><balance>7980</balance><loanLimit>9576</loanLimit></com.cqrs.loan.LoanLimitResult>"
}
meta_data {
  key: "traceId"
  value {
    text_value: "b540735f-c8a3-48da-96a7-9e90aa752966"
  }
}
meta_data {
  key: "correlationId"
  value {
    text_value: "b540735f-c8a3-48da-96a7-9e90aa752966"
  }
}
request_identifier: "b540735f-c8a3-48da-96a7-9e90aa752966"
]

2. 제주

15:57:34.464 DEBUG 8162 --- [ueryProcessor-0] c.c.jeju.component.AccountLoanComponent  : >>> handling LoanLimitQuery(holderID=e5775054-4265-46ef-8116-297ac22f480d, balance=7980)

3. 서울

15:57:34.464 DEBUG 8163 --- [ueryProcessor-0] c.c.s.component.AccountLoanComponent     : >>> handling LoanLimitQuery(holderID=e5775054-4265-46ef-8116-297ac22f480d, balance=7980)

 

결과 화면

 

 

728x90
반응형

+ Recent posts