iBetter Books
수정

marimo란

marimo는 Python 노트북 환경입니다. Jupyter와 겉모습은 비슷하지만 실행 모델이 근본적으로 다릅니다. 셀을 실행하면 그 셀의 변수에 의존하는 다른 셀들이 자동으로 함께 갱신됩니다. 위젯 값을 바꾸면 관련 계산이 즉시 반응합니다. 이것이 marimo의 반응형(reactive) 실행입니다.

Jupyter의 hidden state 문제

Jupyter를 오래 사용하다 보면 반드시 마주치는 문제가 있습니다. 셀을 여러 번 실행하거나 중간 셀을 건너뛰면 변수가 예상치 못한 값을 가지게 됩니다. 한 번 실행한 셀을 삭제해도 그 셀에서 만든 변수는 커널 메모리에 남아 있습니다. 이를 hidden state라고 합니다.

예를 들어 다음과 같은 상황이 발생합니다.

# 셀 Adata = load_data()        # 셀 A 실행# 셀 A를 수정해 data 대신 raw_data를 사용하도록 바꾼 뒤 삭제# 그래도 data 변수는 커널에 여전히 존재한다# 나중에 data를 참조하는 셀은 오류 없이 실행되지만 결과가 틀린다

재현성 문제로 이어집니다. 노트북을 처음 실행하는 사람은 내 환경에서 얻은 것과 다른 결과를 보게 됩니다.

marimo가 이를 해결하는 방식

marimo는 노트북 전체를 DAG(방향성 비순환 그래프)로 모델링합니다. 각 셀이 노드이고, 변수 의존 관계가 엣지입니다.

  • 셀을 수정하면 그 셀이 정의한 변수에 의존하는 하위 셀이 자동으로 재실행됩니다.
  • 셀을 삭제하면 그 셀이 만든 변수가 메모리에서 즉시 제거됩니다.
  • 변수 하나는 반드시 하나의 셀에서만 정의해야 합니다. 중복 정의는 에러로 처리됩니다.

결과적으로 실행 순서와 무관하게 항상 같은 출력을 보장합니다.

3대 가치

반응형 실행: 셀 하나를 바꾸면 연관된 셀들이 자동으로 따라갑니다. 위젯을 조작하면 의존 셀이 즉시 반응합니다. 별도의 콜백 코드를 작성할 필요가 없습니다.

순수 .py 파일 저장: Jupyter는 JSON 형식의 .ipynb로 저장합니다. marimo는 표준 Python 파일(.py)로 저장합니다. 셀 출력은 파일에 포함되지 않습니다. git diff가 코드만 보여줍니다. 코드 리뷰가 깔끔해집니다. python notebook.py로 스크립트처럼 직접 실행할 수도 있습니다.

재현성: 실행 순서에 의존하지 않습니다. 어떤 환경에서 실행해도 동일한 입력에 동일한 출력을 얻습니다.

marimo의 포지셔닝

marimo 팀은 marimo가 여러 도구를 단일 환경으로 대체할 수 있다고 표방합니다.

기존 도구 marimo의 대응 기능
Jupyter Notebook 반응형 노트북 편집 (marimo edit)
Streamlit 앱 배포 모드 (marimo run)
Jupytext 순수 .py 저장 (기본 동작)
ipywidgets 내장 mo.ui 위젯
Papermill .py 파일을 스크립트처럼 직접 실행

이것이 기존 도구들을 완전히 대체한다는 의미는 아닙니다. 각 도구가 적합한 상황이 다릅니다. 이에 대해서는 Ch 02에서 구체적으로 다룹니다.

기본 동작 확인

# 설치pip install marimo# 노트북 에디터 실행marimo edit my_notebook.py# 앱으로 실행 (편집 불가, 사용자용)marimo run my_notebook.py

marimo 노트북은 다음 구조의 .py 파일입니다.

import marimoapp = marimo.App()@app.celldef _():    x = 10    return (x,)@app.celldef _(x):          # x에 의존하므로 x가 바뀌면 자동 재실행된다    result = x * 2    return (result,)

셀 파라미터와 return 문은 marimo가 자동으로 관리합니다. 에디터에서 작성할 때는 일반 Python 코드만 작성하면 됩니다.