오늘 만든 앱은 상태(State) → 화면(Var) → 이벤트(핸들러) → 상태 변경이라는 하나의 고리로 돌아갑니다. Reflex 앱은 아무리 커져도 이 고리가 늘어날 뿐입니다.
| 개념 | 코드에서 | 기억할 한 줄 |
|---|---|---|
| 컴포넌트 | rx.box(자식, 속성=값) | 위치 인자는 자식, 키워드 인자는 속성 |
| 페이지 | app.add_page(index, on_load=...) | 페이지 하나 = 함수 하나 |
| State | class State(rx.State) | 타입 어노테이션 필수, 세션별 서버 메모리 |
| Var | State.users.length() | 화면 함수 안에서는 값이 아니라 표현식 |
| 반복·조건 | rx.foreach, rx.cond | Var에는 for, if 대신 |
| 이벤트 | @rx.event def add_user(self, ...) | 상태를 바꾸는 유일한 방법, 진짜 파이썬 |
| 폼 | rx.form(on_submit=...) + name= | name이 form_data의 키 |
| 제어 컴포넌트 | open= + on_open_change= | 세터는 직접 정의 (0.10) |
| computed var | @rx.var def ...() -> 타입 | 다른 상태에서 계산되는 값 |
| 차트 | rx.recharts.bar_chart(data=...) | 데이터는 list[dict] |
| 증상 | 원인 | 해결 |
|---|---|---|
TypeError: object of type '...Var' has no len() | 화면 함수에서 Var에 len() | .length() |
VarTypeError: Cannot convert Var ... to bool | Var에 if / and / or | rx.cond(...) |
VarTypeError: Cannot iterate over Var | Var에 for | rx.foreach(...) |
AttributeError: ... has no attribute 'set_xxx' | 자동 세터가 있다고 가정 (예전 자료) | @rx.event로 세터 직접 정의 |
| 취소 버튼을 눌러도 데이터가 추가됨 | 폼 안 버튼의 기본 type이 submit | type="button" |
TypeError: __init__() got an unexpected keyword argument | 입력의 name과 dataclass 필드 이름 불일치 | 이름을 똑같이 맞춤 |
| 대화상자가 열리지 않음 | open=만 있고 on_open_change 없음 | 둘을 짝으로 |
| 차트가 비어 있음 | 차트 데이터를 채우는 시점이 없음 | on_load 등록 또는 computed var |
디버깅 습관 3가지
uv run reflex compile --dry로 먼저 검사합니다. 서버를 띄우지 않고 화면 코드의 문법·Var 오류를 빠르게 찾습니다.print()를 넣습니다. 핸들러는 서버에서 도는 파이썬이라 print(form_data)가 서버 터미널에 찍힙니다. 화면 함수 안의 print는 앱 시작 때 한 번만 찍힙니다.난이도 순입니다. 각 과제는 오늘 배운 개념 하나를 더 깊게 씁니다.
rx.icon("trash-2"))을 두고, 누르면 해당 고객을 지웁니다. 힌트: on_click=lambda: State.delete_user(user.email)처럼 인자를 넘깁니다.value= + on_change=(제어 컴포넌트)로 연결한 뒤, computed var로 걸러낸 목록을 테이블에 보여줍니다. on_change=State.set_search.debounce(300)으로 입력이 멈춘 뒤에만 검색해 보세요.rx.toast.error를 돌려주고 대화상자를 닫지 않습니다.Customer 테이블을 만들고, on_load에서 읽고 add_user에서 씁니다. 새로고침이나 서버 재시작 후에도 고객이 남아 있어야 합니다. uv add "reflex[db]"로 설치하며, Reflex 0.10에서는 rx.Model 대신 SQLModel을 직접 쓰는 것이 권장입니다.@rx.page(route="/customers/[id]")처럼 동적 경로를 만들고 고객 상세 페이지를 추가합니다.models.py, state.py, components/, pages/로 나눠 규모가 커져도 관리하기 쉽게 만듭니다.reflex run --env prod로 운영 모드를 확인하고, Reflex Cloud나 직접 서버(Docker)로 배포합니다.rx.Model, rx.App(theme=...) 등 바뀐 API를 쓸 수 있으니 버전을 확인하고 읽습니다.새 교시·새 강의 소식 받기
이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.
R
ReflexKR
눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.
ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.
© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
질문과 답변
이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.