marimo 셀 실행 원리 — 코드와 결과를 항상 일치시키기

marimo 셀 실행 원리 — 코드와 결과를 항상 일치시키기

marimo는 내 코드 변경에 반응해요. 셀 하나를 실행하면, 그 셀이 정의한 변수를 참조하는 다른 모든 셀이 최신 데이터로 자동 실행되죠. 전통적 노트북에서 흔한 "셀을 순서대로 안 돌려서 변수가 없다"는 버그가 원천적으로 사라져요.

출처: https://docs.marimo.io/guides/reactivity/

셀을 어떻게 분석하나

marimo는 각 셀을 실행하지 않고 정적으로 분석해요. 그리고 두 가지를 알아냅니다.

  • reference: 셀이 읽지만 정의하지 않는 전역 변수
  • definition: 셀이 정의하는 전역 변수

그다음 셀들 사이에 방향성 비순환 그래프(DAG)를 만들어요. 한 셀이 실행되면 그 결과를 쓰는 자식 셀들이 자동으로 실행 대상이 돼요.

실행 규칙: 셀 하나가 실행되면, 그 셀이 정의한 전역 변수를 참조하는 모든 셀이 자동으로 다시 실행돼요. 반대로 marimo는 변수 변경(예: foo.bar = 10)이나 객체 mutation은 추적하지 않아요. 그래서 my_list.append(42) 같은 mutation은 다른 셀을 재실행하지 못해요. 한 셀에서 정의하고 다른 셀에서 mutation하는 건 피하세요. 데이터프레임에 열을 추가한다면 그 mutation을 정의한 셀 안에서 하거나, 새 변수를 만드는 게 낫습니다.

# 이렇게 (정의한 셀에서 mutation)
df = pd.DataFrame({"my_column": [1, 2]})
df["another_column"] = [3, 4]

실행 순서

셀의 실행 순서는 화면에서의 위치가 아니라 셀들 사이의 의존 관계로 정해져요. 스프레드시트처럼 생각하면 돼요. 헬퍼 함수를 노트북 맨 아래에 두어도, 그걸 쓰는 셀이 위에 있으면 알아서 먼저 실행돼요.

셀을 지우면 변수도 사라진다

셀을 지우면 그 셀이 정의한 전역 변수가 프로그램 메모리에서 지워져요. 이전에 그 변수를 참조하던 셀은 자동으로 재실행·무효화돼요. 전통 노트북에서 "지운 셀의 변수가 어딘가에 남아있는" 버그를 없애는 핵심이에요.

전역 변수 이름은 유일해야 한다

marimo는 모든 전역 변수가 오직 하나의 셀에서만 정의되도록 요구해요. 함수·클래스·import된 이름도 모두 변수로 취급돼요. 이 규칙 덕분에 코드와 출력이 항상 일치해요.

셀 비활성화

때로는 의존 셀을 자동 실행하지 않고 한 부분만 편집하고 싶을 때가 있어요. 셀을 **비활성화(disable)**하면 그 셀과 의존 셀이 실행되지 않아요. 비활성화된 동안 조상 셀이 실행됐다면, 다시 활성화하면 자동으로 실행돼요.

더 알아보기

의존성 그래프를 시각화하는 도구(dataflow)와 런타임 설정(자동 실행·지연 모드)은 Understanding dataflowRuntime configuration 가이드에서 다뤄요.