자바와 스프링의 비동기 처리 - 1편: CompletableFuture 톺아보기
·
Backend/Spring Boot
Introduce 스프링에서 비동기 처리를 위해 흔히 `@Async` 를 사용하곤 한다.나 역시 프로젝트에서 `@Async` 를 적용하여 일부 후속 로직들을 메인 로직과 분리하여 실행하고 있었다. 그런데 얼마 전 면접장에서 다음과 같은 질문을 받았다.@Async 로 실행된 메서드에서 예외가 발생하면 어떻게 처리하나요?혹시 CompletableFuture 를 사용해본 경험이 있으신가요? 나는 이 질문에 대해 명확하게 답변하지 못하였다. 제대로 답변하지 못하는 모습을 보니 스스로 내가 비동기에 대해서 잘 모르고 사용하는 구나라는 생각이 들었고, `CompletableFuture` 이 무엇인지 이해해보는 시간을 가지게 되었다. 이번 글에서는 java의 기본 비동기 처리 도구인 Future 를 알아보고, 이를 ..
스프링 이벤트를 발행하여 트랜잭션과 관심사 분리하기
·
Backend/Spring Boot
Introduce 내가 개발중인 서비스에서 특정 상품을 결제하면 FCM을 통해 결제한 유저에게 알림을 전송하는 비즈니스 로직이 있다.결제 내역을 바탕으로 사용자에게 알림을 전송해야 함으로 결제 처리와 알림 전송이 같은 트랜잭션에 묶이게 된다. 현재 비즈니스 로직의 흐름을 살펴보면 1. 사용자가 상품을 주문한다.2. 상품을 조회하고, 결제를 진행한다.3. 재고를 차감하고, 결제 내역을 저장한다.4. 결제가 완료되면 사용자에게 FCM을 전송하고, 알림내역을 저장한다. 다음과 같은 순서로 동작한다. 그리고 다음 로직들은 같은 트랜잭션으로 묶여있다. 결제는 외부 API를 통해 이루어진다. 그러므로 우리 서비스의 트랜잭션과는 무관하다.그런데 만약 FCM 알림 저장 과정에서 예외가 발생하면, 전체 트랜잭션이 롤백..