Temporal에서 클라이언트 개발자는 워크플로우(Workflow) 와 액티비티(Activity) 두 가지만 신경 쓰면 된다.
- 워크플로우 (Workflow): 작업의 순서를 정의하는 “관리자”
- 액티비티 (Activity): 실제 비즈니스 로직을 실행하는 “노동자”
워크플로우는 일반 함수가 아니다 — “죽지 않는 프로그램”
보통의 함수는 메모리에서 실행되고 프로그램이 종료되면 사라진다.
하지만 Temporal의 워크플로우는 절대 죽지 않는다.
- 네트워크가 끊겨도
- 서버가 재시작되어도
- 시간이 며칠, 몇 달이 지나도
Temporal 서버가 중단된 시점부터 다시 이어서 실행시킨다.
어떻게 이런 게 가능할까? — 결정론적 실행(Deterministic Execution)
Temporal의 핵심은 바로 결정론적 실행 보장이다.
동일한 입력(Input)에 대해 항상 동일한 결과(Output)을 보장한다.
즉, “멱등성(Idempotency)”이 내장되어 있다.
예를 들어 주문 처리 워크플로우를 생각해보자:
public void processOrderWorkflow() {
reserveInventory();
processPayment();
sendReceipt();
}
- 이 워크플로우가 네트워크 오류로 중단되더라도
- Temporal은 마지막 성공 지점(세이브 포인트)을 기준으로
자동으로 재실행하면서 동일한 결과를 복원한다.
즉, “다시 실행하더라도 결과는 언제나 같다.”
이게 Temporal 워크플로우의 결정론적 실행 모델이다.
시간 제약이 없다 — 장기 실행 가능한 워크플로우
워크플로우는 몇 초, 몇 분짜리 함수가 아니다.
며칠, 몇 주, 심지어 몇 달 동안도 실행 가능하다.
Temporal은 내부적으로 각 단계별 상태를 DB에 저장해두기 때문에,
스프링 배치(Spring Batch)처럼 세이브 포인트(Save Point) 에서 재개할 수 있다.
예를 들어 “3일 후 결제 확인” 같은 장기 지연 로직도
워크플로우 안에서 자연스럽게 작성할 수 있다.
Workflow.sleep(Duration.ofDays(3));
checkPaymentStatus();
버전 호환성 — 실행 중인 워크플로우는 그대로 유지된다
Temporal은 새로운 워크플로우 버전을 배포하더라도
이미 실행 중인 워크플로우는 중단되지 않고 기존 버전대로 동작한다.
이 덕분에:
- 프로세스 개선이나 코드 리팩토링이 쉬움
- 배포 중에도 안정성 유지
- 긴 워크플로우 실행에도 버전 충돌 없음
즉, “시간에 독립적인 시스템” 이다.
단점 — 예측 가능성과 외부 의존성의 제약
Temporal 워크플로우는 결정론적이어야 하기 때문에
다음과 같은 비결정적 코드 사용이 금지된다:
| System.currentTimeMillis() | 실행 시점마다 다름 |
| UUID.randomUUID() | 호출할 때마다 달라짐 |
| 외부 API 호출 | 네트워크 상태, 응답 값이 매번 달라짐 |
| 비즈니스 로직 계산 | 외부 상태에 의존 가능성 있음 |
이런 코드는 결과가 실행마다 달라질 수 있기 때문에
워크플로우 내부에선 사용 불가하다.
그래서 등장한 개념 — 액티비티(Activity)
이 문제를 해결하기 위해 Temporal은
워크플로우와 별도로 액티비티(Activity) 라는 개념을 제공한다.
| 워크플로우 | 작업의 순서와 상태를 관리하는 컨트롤러 |
| 액티비티 | 실제 외부 연산(DB, API, 파일 등)을 수행하는 작업자 |
즉,
워크플로우는 “무엇을 할지” 정의하고
액티비티는 “어떻게 할지” 수행한다.
워크플로우는 직접 DB나 외부 API를 호출하지 않고,
Temporal 서버를 통해 액티비티를 호출한다.
이때 Temporal이 자동으로 다음을 처리한다:
- 액티비티 실패 시 재시도
- 타임아웃, 백오프, 장애 복구
- 로그 및 히스토리 저장
결과적으로 워크플로우는 순수 함수처럼, 액티비티는 비즈니스 로직처럼 동작한다.
워크플로우와 액티비티 호출 흐름
[Workflow 코드]
↓
[Temporal Server] ← 상태 저장, 재시도, 장애 복구 관리
↓
[Activity Worker] ← 실제 DB/API 호출 수행
워크플로우는 액티비티를 직접 실행하지 않는다.
Temporal 서버가 중간에서 조율하며, 재시도 / 대기 / 복구 로직을 대신 관리한다.

'프로그래밍 > 대용량 시스템에 대한 이해' 카테고리의 다른 글
| 폭증하는 트래픽을 처리하고 안정적인 운영환경을 위한 Workflow (0) | 2025.11.13 |
|---|---|
| Debezium의 Best Practive 아키텍처 (0) | 2025.11.13 |
| Temporal을 활용한 워커플로우 패턴 (0) | 2025.11.06 |
| Kafka + Debezium을 활용한 CDC 활용 패턴 (0) | 2025.11.05 |
| 대용량 트래픽 아키텍쳐 정리 (0) | 2025.11.05 |