메시지 발송 시스템 완전 정복기

트랜잭션 설계부터 대용량 처리까지


🎯 프로젝트 전체 여정

1단계: 기본 시스템 설계 (트랜잭션 고민)

2단계: 대용량 처리 (성능 최적화)


🚨 1단계: 트랜잭션 설계의 딜레마

핵심 문제

사용자 요청 → 외부 API 호출 → DB 저장

치명적 상황들:

해결책: "DB 먼저, API 나중"

@Transactional
public void processSingleMessage(Long batchId, String recipient) {
    // 1️⃣ 히스토리 먼저 생성 (PENDING)
    History history = createHistory(batchId, recipient, PENDING);

    // 2️⃣ DB 저장 성공 시에만 API 호출
    if (history != null) {
        ApiResult result = coolSmsApi.send(recipient, message);
        updateHistory(history.getId(), result.isSuccess() ? SUCCESS : FAILED);
    }
}