의존성 그래프(DAG)와 자동 재실행
marimo는 셀이 변경될 때 어떤 셀을 다시 실행해야 하는지 어떻게 알까요. 그 답이 의존성 그래프(DAG, Directed Acyclic Graph)입니다. marimo는 노트북 전체를 DAG로 모델링하고, 이 그래프를 기반으로 최소한의 셀만 재실행합니다.
DAG란 무엇인가
DAG는 방향이 있고 순환이 없는 그래프입니다. marimo에서는 셀이 노드(node), 변수 의존 관계가 엣지(edge)입니다.
아래 세 셀을 보겠습니다.
# Cell Araw_data = [3, 1, 4, 1, 5, 9, 2, 6]
# Cell B — raw_data에 의존sorted_data = sorted(raw_data)
# Cell C — sorted_data에 의존top3 = sorted_data[-3:]top3
의존 관계를 정리하면 이렇습니다.
Cell A가 Cell B의 입력을 제공하고, Cell B가 Cell C의 입력을 제공합니다. 이것이 DAG의 엣지입니다. 방향은 항상 "정의하는 쪽에서 사용하는 쪽"으로 흐릅니다.
자동 재실행 범위
DAG가 있으면 무엇이 달라질까요. raw_data를 수정한다고 가정합니다.
# Cell A를 수정raw_data = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3] # 원소 두 개 추가
marimo는 Cell A가 변경되면 Cell A에 의존하는 셀만 재실행합니다. DAG를 따라 내려가면 Cell B가 영향을 받고, Cell B의 출력을 쓰는 Cell C도 영향을 받습니다. 그래서 Cell B와 Cell C가 자동으로 재실행됩니다.
반면, raw_data를 전혀 사용하지 않는 다른 셀이 있다면 그 셀은 재실행되지 않습니다. 필요한 셀만 정확하게 골라 재실행하는 것이 DAG 기반 실행의 핵심입니다.
셀 작성 순서와 실행 순서는 다를 수 있다
중요한 점이 있습니다. marimo에서 실행 순서는 셀이 에디터에서 위에서 아래로 배치된 순서가 아닙니다. DAG의 위상정렬(topological sort) 결과가 실행 순서입니다.
아래 예시를 봅니다. 에디터에서 이 순서로 셀을 배치했다고 가정합니다.
# 에디터 위치 기준 Cell 1 (먼저 배치)total = subtotal + taxtotal
# 에디터 위치 기준 Cell 2 (나중에 배치)subtotal = 100tax = 10
total = subtotal + tax는 subtotal과 tax에 의존합니다. subtotal과 tax는 아래쪽 셀에서 정의됩니다. marimo는 이 의존 관계를 정적으로 분석해 "아래 셀을 먼저 실행하고 위 셀을 나중에 실행해야 한다"는 것을 파악합니다.
실제 실행 순서는 에디터 배치와 반대가 됩니다.
이것이 Jupyter와 근본적으로 다른 점입니다. Jupyter는 사용자가 셀을 선택해 실행하는 순서대로 처리합니다. marimo는 의존 관계를 기준으로 실행 순서를 자동으로 결정합니다. 셀을 에디터에서 어느 위치에 두든 결과는 동일합니다.
여러 셀이 얽힌 경우
의존 관계가 복잡해져도 원리는 같습니다.
# Cell An = 10
# Cell B — n에 의존squares = [i ** 2 for i in range(n)]
# Cell C — n에 의존cubes = [i ** 3 for i in range(n)]
# Cell D — squares와 cubes에 의존combined = list(zip(squares, cubes))combined
이 경우 DAG는 다음과 같습니다.
n이 변경되면 Cell B와 Cell C가 재실행되고, 그 결과를 받는 Cell D도 재실행됩니다. Cell B와 Cell C는 서로 의존하지 않으므로 순서 없이 독립적으로 실행될 수 있습니다.
왜 "비순환(Acyclic)"이어야 하는가
DAG에서 "비순환"이 중요한 이유는 실행 순서 결정 때문입니다. Cell A가 Cell B에 의존하고 Cell B도 Cell A에 의존하면, 어느 쪽을 먼저 실행해야 하는지 결정할 수 없습니다. 이것이 순환 의존성이고, marimo는 이를 MB003 에러로 차단합니다. 자세한 내용은 Ch 05에서 다룹니다.
정리
- marimo는 셀과 변수 의존 관계를 DAG로 모델링합니다.
- 셀이 변경되면 그 셀에 의존하는 셀만 선택적으로 재실행됩니다.
- 실행 순서는 에디터 배치 순서가 아니라 위상정렬 결과입니다.
- 셀을 어느 위치에 두든 DAG가 올바른 실행 순서를 보장합니다.