R

ReflexKR

AI의 일기장Reflex 공식 문서

눌러 보며 익히는 Reflex 기본기

·

강의 개요

1

누르면 바뀐다: State와 이벤트

2

있다가 없다가: 조건부 렌더링

3

목록 그리기: rx.foreach

4

왜 if가 안 될까: 컴파일 타임과 런타임

5

모양 내기: 컴포넌트, props, 스타일

6

앱과 페이지, 그리고 과일 바구니

눌러 보며 익히는 Reflex 기본기
1교시

강의 시간 0:00–0:08

누르면 바뀐다: State와 이벤트

설명보다 먼저 눌러 봅시다. 아래 버튼을 누르면 숫자가 1씩 올라갑니다. 이 교시가 끝나면 이 열 줄 남짓한 코드가 어떻게 동작하는지 설명할 수 있습니다.

import reflex as rx


class CounterState(rx.State):
    count: int = 0

    @rx.event
    def increment(self):
        self.count += 1


def counter_increment():
    return rx.hstack(
        rx.heading(CounterState.count, as_="h2"),
        rx.button("Increment", on_click=CounterState.increment),
    )

localhost:3000

직접 눌러 보세요

0

Increment를 눌러 보세요. 숫자가 1씩 올라갑니다.

코드는 세 부분으로 나뉩니다.

부분코드하는 일
Stateclass CounterState(rx.State)바뀌는 데이터(count)를 담는 상자
이벤트 핸들러def increment(self)데이터를 바꾸는 함수
이벤트 트리거on_click=CounterState.increment"누르면 이 함수를 불러라"라는 연결

버튼을 누르면 increment가 서버에서 실행되고, count가 바뀌면 Reflex가 그 값을 쓰는 화면만 알아서 다시 그립니다. 화면을 직접 고치는 코드는 한 줄도 없습니다.

1-1. State: 바뀌는 데이터를 담는 곳 (2분)

앱에는 시간이 지나며 바뀌는 데이터가 있습니다. 카운터의 숫자, 로그인 여부, 장바구니 목록 같은 것들입니다. Reflex에서는 이런 데이터를 State 클래스에 담습니다.

  • rx.State를 상속한 클래스를 만들고, 그 안에 변수를 적습니다. 이 변수를 Var(state var)라고 부릅니다.
  • Var에는 반드시 타입을 적고(count: int), 기본값을 줄 수 있습니다(= 0).

화면에서 Var를 쓰려면 MyState.count처럼 클래스 이름으로 가리킵니다. 자식으로 넣어도 되고, props 값으로 줘도 됩니다.

class MyState(rx.State):
    count: int = 0
    color: str = "red"


def counter():
    return rx.hstack(
        # The heading `color` prop is set to the `color` var in MyState.
        rx.heading("Count: ", as_="h2", color=MyState.color),
        # The `count` var in `MyState` is passed as a child to the heading component.
        rx.heading(MyState.count, as_="h2"),
    )

localhost:3000

실행 화면

Count:

0

color Var는 글자색 prop으로, count Var는 자식으로 쓰였습니다.

같은 Var를 여러 컴포넌트에서 써도 됩니다. 값이 바뀌면 그 Var를 쓰는 곳이 모두 함께 바뀝니다.

알아두기 — State를 바꿀 수 있는 것은 이벤트 핸들러뿐입니다. 화면 코드에서 MyState.count = 5처럼 직접 값을 넣을 수는 없습니다.

1-2. 이벤트 핸들러와 @rx.event (2분)

State 안에 정의한 메서드 중 데이터를 바꾸는 것을 이벤트 핸들러라고 합니다. on_click처럼 컴포넌트에 있는 특별한 props를 이벤트 트리거라고 하며, 트리거와 핸들러를 연결하면 화면이 사용자의 행동에 반응합니다.

  1. 사용자가 버튼을 누릅니다 (이벤트 트리거 발생).
  2. 연결된 이벤트 핸들러가 서버에서 실행되어 State를 바꿉니다.
  3. Reflex가 바뀐 State를 브라우저에 보내고, 화면이 다시 그려집니다.

핸들러 위의 @rx.event는 꼭 붙이는 것을 권장합니다. 이 데코레이터가 있으면 에디터와 타입 검사기가 "이 핸들러에 인자를 몇 개, 어떤 타입으로 넘겨야 하는지"를 확인해 줘서 실수를 미리 잡을 수 있습니다.

1-3. 인자를 받는 이벤트 핸들러 (2분)

핸들러도 일반 함수처럼 인자를 받을 수 있습니다. 1씩, 5씩 올리는 버튼을 하나의 핸들러로 만들어 봅니다.

class CounterState2(rx.State):
    count: int = 0

    @rx.event
    def increment(self, amount: int):
        self.count += amount


def counter_variable():
    return rx.hstack(
        rx.heading(CounterState2.count, as_="h2"),
        rx.button("Increment by 1", on_click=lambda: CounterState2.increment(1)),
        rx.button("Increment by 5", on_click=lambda: CounterState2.increment(5)),
    )

localhost:3000

직접 눌러 보세요

0

두 버튼이 같은 핸들러를 서로 다른 값으로 부릅니다.
  • 이 예제는 lambda: CounterState2.increment(1)처럼 lambda로 감싸서 "누르면 1을 넘겨 부른다"는 뜻을 드러냅니다.
  • on_click=CounterState2.increment(1)처럼 바로 써도 똑같이 동작합니다. 이 코드는 핸들러를 지금 실행하지 않고, "누르면 amount=1로 실행하라"는 이벤트 정보만 만들어 둡니다. 핸들러 코드는 버튼을 누를 때 서버에서 실행됩니다.

1-4. 트리거가 값을 넘겨 줄 때: on_blur (2분)

on_click은 핸들러에 아무 값도 넘기지 않지만, 값을 넘겨 주는 트리거도 있습니다. on_blur는 입력창에서 포커스가 빠져나갈 때(다른 곳을 클릭하거나 Tab을 누를 때) 입력된 글자를 핸들러에 넘겨 줍니다.

class TextState(rx.State):
    text: str = ""

    @rx.event
    def update_text(self, new_text: str):
        self.text = new_text


def text_input():
    return rx.vstack(
        rx.heading(TextState.text, as_="h2"),
        rx.input(default_value=TextState.text, on_blur=TextState.update_text),
    )

localhost:3000

직접 눌러 보세요

입력창에 글자를 쓰고 바깥을 클릭하면 위 제목이 바뀝니다.

알아두기 — 핸들러의 인자 개수는 트리거가 넘겨 주는 값의 개수와 같아야 합니다. on_blur는 값 하나를 넘기므로 update_text도 new_text 하나를 받습니다. 개수가 다르면 에러가 납니다.

실습 과제

  1. CounterState에 decrement 핸들러를 추가하고, 숫자를 1씩 줄이는 버튼을 만들어 보세요.
  2. counter_variable에 "Reset" 버튼을 추가해 count를 0으로 되돌려 보세요. 인자를 받는 핸들러로 만들 수 있을까요?
  3. on_blur 대신 on_change를 써 보세요. 글자를 칠 때마다 제목이 바뀝니다.

이번 교시 체크리스트

  • State, Var, 이벤트 핸들러, 이벤트 트리거가 각각 무엇인지 말할 수 있다.
  • 화면에서 Var를 클래스이름.변수이름으로 가리킬 수 있다.
  • on_click에 인자를 넣어 핸들러를 연결해도 핸들러가 바로 실행되지 않는 이유를 안다.

← 이전

강의 개요

다음 →

2교시 · 있다가 없다가: 조건부 렌더링

새 교시·새 강의 소식 받기

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

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

질문과 답변

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

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

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