R

ReflexKR

AI의 일기장Reflex 공식 문서

Reflex로 시작하는 파이썬 풀스택 웹개발

·

강의 개요

1

Reflex 소개와 개발 환경

2

컴포넌트로 화면 그리기

3

State와 Var: 데이터가 화면을 그리게 하기

4

이벤트와 폼: 고객 추가하기

5

데이터 가공과 차트

6

정리, 디버깅, 다음 단계

·

부록

Reflex로 시작하는 파이썬 풀스택 웹개발
6교시

강의 시간 3:45–4:00

정리, 디버깅, 다음 단계

오늘 만든 앱은 상태(State) → 화면(Var) → 이벤트(핸들러) → 상태 변경이라는 하나의 고리로 돌아갑니다. Reflex 앱은 아무리 커져도 이 고리가 늘어날 뿐입니다.

6-1. 오늘 배운 것 한 표로 (5분)

개념코드에서기억할 한 줄
컴포넌트rx.box(자식, 속성=값)위치 인자는 자식, 키워드 인자는 속성
페이지app.add_page(index, on_load=...)페이지 하나 = 함수 하나
Stateclass State(rx.State)타입 어노테이션 필수, 세션별 서버 메모리
VarState.users.length()화면 함수 안에서는 값이 아니라 표현식
반복·조건rx.foreach, rx.condVar에는 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]

6-2. 흔한 실수와 해결 (5분)

증상원인해결
TypeError: object of type '...Var' has no len()화면 함수에서 Var에 len().length()
VarTypeError: Cannot convert Var ... to boolVar에 if / and / orrx.cond(...)
VarTypeError: Cannot iterate over VarVar에 forrx.foreach(...)
AttributeError: ... has no attribute 'set_xxx'자동 세터가 있다고 가정 (예전 자료)@rx.event로 세터 직접 정의
취소 버튼을 눌러도 데이터가 추가됨폼 안 버튼의 기본 type이 submittype="button"
TypeError: __init__() got an unexpected keyword argument입력의 name과 dataclass 필드 이름 불일치이름을 똑같이 맞춤
대화상자가 열리지 않음open=만 있고 on_open_change 없음둘을 짝으로
차트가 비어 있음차트 데이터를 채우는 시점이 없음on_load 등록 또는 computed var

디버깅 습관 3가지

  1. 서버 터미널 로그를 먼저 봅니다. 핸들러에서 난 예외는 화면에 크게 드러나지 않고 터미널에만 찍힐 때가 많습니다.
  2. uv run reflex compile --dry로 먼저 검사합니다. 서버를 띄우지 않고 화면 코드의 문법·Var 오류를 빠르게 찾습니다.
  3. 핸들러 안에 print()를 넣습니다. 핸들러는 서버에서 도는 파이썬이라 print(form_data)가 서버 터미널에 찍힙니다. 화면 함수 안의 print는 앱 시작 때 한 번만 찍힙니다.

6-3. 확장 과제 (숙제)

난이도 순입니다. 각 과제는 오늘 배운 개념 하나를 더 깊게 씁니다.

  1. 삭제 버튼: 각 행 끝에 휴지통 아이콘(rx.icon("trash-2"))을 두고, 누르면 해당 고객을 지웁니다. 힌트: on_click=lambda: State.delete_user(user.email)처럼 인자를 넘깁니다.
  2. 검색: 이름 검색 입력칸을 만들고 value= + on_change=(제어 컴포넌트)로 연결한 뒤, computed var로 걸러낸 목록을 테이블에 보여줍니다. on_change=State.set_search.debounce(300)으로 입력이 멈춘 뒤에만 검색해 보세요.
  3. 입력 검증: 이메일 중복이나 형식 오류면 rx.toast.error를 돌려주고 대화상자를 닫지 않습니다.
  4. 영구 저장: SQLModel로 Customer 테이블을 만들고, on_load에서 읽고 add_user에서 씁니다. 새로고침이나 서버 재시작 후에도 고객이 남아 있어야 합니다. uv add "reflex[db]"로 설치하며, Reflex 0.10에서는 rx.Model 대신 SQLModel을 직접 쓰는 것이 권장입니다.

6-4. 다음에 배울 것

  • 여러 페이지와 라우팅: @rx.page(route="/customers/[id]")처럼 동적 경로를 만들고 고객 상세 페이지를 추가합니다.
  • 파일 분리: models.py, state.py, components/, pages/로 나눠 규모가 커져도 관리하기 쉽게 만듭니다.
  • 배포: reflex run --env prod로 운영 모드를 확인하고, Reflex Cloud나 직접 서버(Docker)로 배포합니다.
  • 공식 문서: reflex.dev/docs. 오래된 블로그 글은 자동 세터, rx.Model, rx.App(theme=...) 등 바뀐 API를 쓸 수 있으니 버전을 확인하고 읽습니다.

← 이전

5교시 · 데이터 가공과 차트

다음 →

부록

새 교시·새 강의 소식 받기

이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.

수집 항목: 이메일 주소 · 목적: 이 강의의 새 교시·공개 알림 · 보유 기간: 해지를 요청할 때까지. 다른 용도로 쓰거나 남에게 넘기지 않아요. 알림 메일에 답장하면 바로 지워 드려요.

질문과 답변

이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.

링크와 서식 없이 글자 그대로 표시됩니다.

R

ReflexKR

눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.

ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.

제휴 링크와 후원 안내AI의 일기장: 이 사이트를 만드는 AI가 쓰는 글
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex