ClOr

ClOr

백엔드 실무 트러블슈팅과 AI 에이전트 구조 분석을 기록합니다.

Claude Code 해부학 (완결)

51만 줄 소스코드를 19편에 걸쳐 분석한 완결 시리즈

전체 시리즈 보기 →

백엔드 트러블슈팅

실무에서 겪은 장애와 해결 과정 기록

전체 시리즈 보기 →

최신 글

article thumbnail
WebClient .block() → Kotlin Coroutine 전환기: suspend · @Transactional 충돌 해결
백엔드 트러블슈팅 2026. 3. 29. 03:14

📑 목차들어가며문제: .block()이 위험한 이유선택: RxJava 3 vs Kotlin Coroutine전환 과정1단계: EngineApiClient 전환 (성공)2단계: Service/Controller 전파 (suspend 전염)3단계: suspend + @TenantTransactional 충돌 (롤백)최종 결정: 범위를 좁힌다결과배운 점들어가며사내 업무 자동화 프로젝트에서 Camunda 엔진 API 호출이 전부 WebClient의 .block()으로 처리되고 있었다. 동시 요청이 몰리면 Tomcat 스레드풀이 고갈될 위험이 있어 비동기 전환이 필요했다.이전 세대에서는 RxJava 3을 사용했지만, Kotlin 프로젝트에서는 Coroutine을 선택했다. 그런데 suspend 함수와 @Tran..

article thumbnail
Reactor 파이프라인 설계기: External Task 200건 동시 처리 · ConnectableFlux 삽질
백엔드 트러블슈팅 2026. 3. 29. 03:10

📑 목차들어가며환경문제: 동기 처리 병목 + 락 만료설계: Reactor 스트림 합성ConnectableFlux 기반 폴링flatMap(200) 동시성 제어처리 스트림 + 락 갱신 스트림 합성Step 순차 실행 보장에러 격리: onErrorResume의 함정파이프라인 레벨 (정답)Step 레벨 (함정)결과배운 점들어가며Camunda BPM의 External Task 패턴은 프로세스 엔진과 외부 시스템 호출을 분리하는 강력한 아키텍처다. 하지만 ERP/RPA 같은 외부 호출이 수십 초씩 걸리는 환경에서 동기 처리는 전체 파이프라인을 막아버린다.이전 고객사 BPM 프로젝트에서 Project Reactor를 활용하여 200건 동시 처리가 가능한 파이프라인을 설계한 과정을 공유한다.환경Spring Boot 2..

article thumbnail
Kafka 동기화 삽질기 4편: 멀티테넌시 + @Async에서 ThreadLocal이 사라지는 문제
백엔드 트러블슈팅 2026. 3. 29. 02:35

시리즈 목차1편: 트랜잭션 중첩 문제2편: batchInsert & Lock Wait Timeout3편: Reconciliation4편: ThreadLocal 소실 (현재 글)📑 목차이전 편 요약증상: "Tenant context not set"원인: ThreadLocal은 스레드를 넘어가지 않는다해결 1: @Async — TaskDecorator로 컨텍스트 전파Before (컨텍스트 소실)After (TaskDecorator 적용)해결 2: Coroutine — CoroutineContext로 전파두 방식 비교함정: MDC도 같이 사라진다결과배운 점이전 편 요약1~3편에서 트랜잭션 중첩, Lock Wait Timeout, reconciliation을 모두 해결했다. 동기화 로직은 완벽해 보였다. 그래..

article thumbnail
Kafka 동기화 삽질기 3편: Reconciliation — "없는 것"을 처리하는 기술
백엔드 트러블슈팅 2026. 3. 29. 02:27

시리즈 목차1편: 트랜잭션 중첩 문제2편: batchInsert & Lock Wait Timeout3편: Reconciliation (현재 글)4편: 멀티테넌시 + @Async에서 ThreadLocal이 사라지는 문제📑 목차이전 편 요약증상: "퇴사한 사람이 아직 활성 상태입니다"문제 정의: Reconciliation의 부재설계: 삭제 전략을 데이터 유형별로 분리구현: Chunk 단위 Reconciliation핵심 코드주의: chunk 단위 수신 시 타이밍 문제결과배운 점이전 편 요약1편에서 트랜잭션 중첩, 2편에서 Lock Wait Timeout을 해결했다. 동기화는 드디어 안정적으로 돌아가기 시작했다. 이제 끝난 줄 알았다.증상: "퇴사한 사람이 아직 활성 상태입니다"운영팀에서 이상한 리포트가 올라..