본문 바로가기

Spring34

WebClient + Retry + CircuitBreaker WebClient 를 이용할 때, Retry 기능과 CircuitBreaker 기능을 추가할 수 있다. 구체적인 방법과 함께 테스트 코드는 어떻게 만드는지 알아보자. 먼저 전체 코드를 간단히 훑어보고 뒤에서 자세히 설명하겠다. 응답 status code 가 501 이상이면, CircuitBreakerException 을 만들어서 넘긴다. 하지만 timeout 에러면 0.5초 간격으로 1번 retry 를 수행한다. retry 를 수행해도 에러가 발생하면 RetryExhaustedException 으로 감싸져서 나오기 때문에 onErrorMap 으로 잡아서 cause 를 빼내 뒤로 전달한다. .exchangeToMono(clientResponse -> { if (clientResponse.rawStatusC.. 2022. 9. 24.
WebClient 사용할때 주의 (8편) 1. WebClient config 기본 구조 설명 WebClient 를 사용하기 위해선 WebClientBuilder 를 활용해 만드는데 clientConnector 인자로 ReactorClientHttpConnector 객체를 생성해 넣어준다. return webClientBuilder.baseUrl(apiClientProperties.getUrl()) .clientConnector( // ReactorClientHttpConnector 를 넣어줘야함 ) .build(); cf) ReactorClientHttpConnector 객체를 생성하기 위해선 reactorResourceFactory 가 필요한데, 따로 빈 등록해야한다. 물론 없어도 객체 생성이 가능하지만 내가 만든 코드에서는 필요했다. @Be.. 2022. 9. 18.
Kafka 이벤트 발행과 DB 저장(redis) 트랜잭션 EDA 환경에서 일반적으로 kafka 이벤트 발행과 db 저장은 한 transaction 으로 묶을 수 없다. 물론 RDB 를 사용한다면 뒤에 서술할 Transactional Outbox Pattern 을 활용할 수 있다. 하지만 내가 속한 프로젝트는 redis in-memory nosql db 를 사용했다. 그래서 다른 방식으로 transaction 문제를 해결했다. cf) kafka transaction 에 대해서 더 자세히 알고 싶다면 이전 글에서 자세히 설명했다. 계좌이체 준비 예제 핵심부분만 추려서 코드를 재구성해, 계좌이체 준비 예제로 설명하려 한다. 먼저 아래 prepareAccountTransfer 메서드는 전달받은 processId와 userNo 를 갖고 AccountTransfer 객체.. 2022. 3. 9.
WebClient 사용할때 주의 (7편) webClient 사용할 때 주의사항까진 아니지만 리스트 형태의 response body 를 받는 방법에 대해서 간단히 정리했다. 가끔 Mono 형태로 리턴 webClient 코드를 볼 때가 있다. flatMapIterable 메서드로 Flux 를 사용하는게 좋다. public Flux getData() { return this.webClient.get() .uri(uriBuilder -> uriBuilder .path("/data") .build() ) .retrieve() .bodyToMono(DataApiResponse.class) .flatMapIterable(DataApiResponse::getContent); } @Value public class DataApiResponse { List co.. 2022. 3. 7.
ObjectMapper 1. serialize/deserialize 이슈 EDA 기반에서 메세지들의 serialize/deserialize 는 특히 더 주의해야한다. 시스템들이 분산 되어 있기 때문이다. 예를 들어 아래 그림 System1 에서 serialize 하고 메세지를 발행하는 로직에서 메세지 관련 객체를 수정했다. 하지만 다른 조직 시스템인 System2, System3 은 배포 타이밍이 다를 수 있고 또 변경 대상이 반영 안되서 consume 하는데 규칙이 안맞으면 장애가 발생할 수 있다. 그래서 objectMapper 관리를 잘 해야 한다. 1-1. FAIL_ON_UNKNOWN_PROPERTIES FAIL_ON_UNKNOWN_PROPERTIES 옵션은 항상 신경써야한다. FAIL_ON_UNKNOWN_PROPERTI.. 2022. 1. 15.
kafka transaction(exactly once semantic) kafka transaction 설명에 앞서 kafka 통신을 위한 기본적인 코드부터 설명하려 한다. 테스트 코드에서 EmbeddedKafkaBroker 를 활용해 broker 역할을 대신했다. 그리고 json 데이터를 보내기 위해 objectMapper 를 생성했다. 마지막으로 데이터 전달을 위해 Product 객체를 생성했다. public class KafkaTest { static EmbeddedKafkaBroker BROKER; static final String TOPIC_NAME = "ybs-topic"; ObjectMapper objectMapper = JsonMapper.builder().build(); static { // broker 갯수 1개, 파티션 갯수 1개 BROKER = new.. 2022. 1. 9.