자바와 스프링의 비동기 처리 - 2편: CompletableFuture의 예외 처리와 타임 아웃
·
Backend/Spring Boot
Introduce 자바와 스프링의 비동기 처리 - 1편: CompletableFuture 톺아보기Introduce 스프링에서 비동기 처리를 위해 흔히 `@Async` 를 사용하곤 한다.나 역시 프로젝트에서 `@Async` 를 적용하여 일부 후속 로직들을 메인 로직과 분리하여 실행하고 있었다. 그런데 얼마 전 면woojjam.tistory.com먼저 해당 글을 읽기 전에 이전 글을 읽고 오는것을 추천한다. `CompletableFuture` 는 비동기 작업을 간결하게 표현할 수 있게 도와주지만, 비동기 환경에서는 예외가 어디서, 어떻게 발생했는지 추적하거나 디버깅 하기도 어렵기에 이를 처리하는것이 쉽지 않다. 그렇다고 예외처리를 해놓지 않으면 다음과 같은 상황이 발생할 수 있다.비동기 로직 중 하나가 실패..
자바와 스프링의 비동기 처리 - 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 알림 저장 과정에서 예외가 발생하면, 전체 트랜잭션이 롤백..
동시성 문제에 대한 고찰, 점진적으로 접근하기
·
Backend/Spring Boot
🔎 본 글을 읽기 앞서 해당 게시글을 먼저 참고 해주시길 바랍니다.해당 게시글은 추후 내용이 변경될 수 있습니다. 해당 게시글에서 설명하지 않는 사전 지식들은 이미 알고있다고 가정하고 작성된 글입니다. [DB] 트랜잭션과 동시성 제어Introduce결제 시스템을 구축하면서 동시성 문제를 경험한 적이 있다. 여러 사용자가 동시에 결제를 시도할 때, 예상하지 못한 데이터 불일치와 정합성 문제가 발생했으며, 이를 해결하기 위해 다woojjam.tistory.com일시설명25.03.08- 게시글 작성25.03.09- Synchronized 분산 테스트 추가25.03.16- Pesimistic Lock 내용 추가25.03.28- Optimistic Lock 내용 추가 및 데드락 추가 Introduce 회사에서 ..