"로그인은 됐는데 페이지 이동하면 로그아웃돼요. 장바구니 담았는데 새로고침하면 사라지고... 데이터를 어디에 저장해야 하는 건지 모르겠어요."

맞아요. AI한테 "저장해줘"만 하면 매번 다른 곳에 저장돼요. 어떤 건 메모리에만 있어서 새로고침하면 날아가고, 어떤 건 브라우저에만 저장돼서 다른 기기에선 안 보이고... 데이터가 어디에 있는지 모르니까 이런 일이 생기는 거예요.

왜 이런 일이 생길까요?

"어디에 저장할지" 안 말해줘서 그래요. 데이터(상태)를 어디에 둘지 정하지 않으면, AI가 알아서 적당한 곳에 넣어요. 근데 그게 여러분이 원하는 곳이 아닐 수 있어요.

18편에서 디자인 패턴을 배웠죠? 코드를 어떻게 짤지요. 근데 코드 구조만 알면 부족해요. 데이터를 어디에 둘지도 정해야 해요.

이걸 **상태 관리(State Management)**라고 해요.

상태 관리 개념을 알면 AI한테 **"로그인 상태는 전역으로, 폼 데이터는 로컬로 관리해줘"**라고 정확히 말할 수 있어요. 그러면 데이터가 날아가거나 동기화 안 되는 문제가 없어요.

중요한 건, AI가 만들어주면 끝이 아니에요.

로그인 기능 만들었으면 로그인해보고, 페이지 이동해보고, 새로고침해보고. 이 "확인 → 피드백" 과정이 없으면 나중에 다 꼬여요.


이 글을 읽고 나면

  • 상태(State)가 뭔지, 왜 관리가 필요한지 알 수 있어요
  • 전역 상태와 로컬 상태를 구분할 수 있어요
  • 상황에 따라 어디에 상태를 둘지 판단할 수 있어요
  • AI한테 "이 데이터는 전역으로, 저 데이터는 로컬로" 말할 수 있어요

상태(State)가 뭔가요?

**상태(State)**는 앱이 기억하는 데이터예요.


PART 4 복습: 디자인 패턴에서 상태 관리로

18편에서 코드를 어떻게 짤지를 배웠죠?

오늘 배울 것은: 그 상태를 어디에 둘지

  • 18편: 코드 구조를 어떻게? → 싱글톤 / 팩토리 / 옵저버
  • 19편(오늘): 상태를 어디에? → 전역 / 로컬 / DB / 브라우저

비유하면:

  • 디자인 패턴 = 물건을 어떻게 정리할까? (서랍장 / 옷장 / 책장)
  • 상태 관리 = 어디에 둘까? (방 / 거실 / 창고)

왜 상태 관리가 필요한가요?

상태를 제대로 관리 안 하면 이런 일이 생겨요.


상태를 둘 수 있는 곳 4가지

데이터를 저장할 수 있는 곳은 4가지예요.

상태 저장소 4가지 유형


1. 메모리 (로컬 상태)

**메모리(로컬 상태)**는 컴포넌트 안에서만 쓰는 데이터예요.

로컬 상태 예시: 검색창


2. 전역 상태 (Global State)

전역 상태앱 전체에서 쓰는 데이터예요.

전역 상태 예시: 로그인


3. 브라우저 저장소 (localStorage)

localStorage브라우저에 저장되는 데이터예요.

localStorage 예시: 다크모드


4. 서버 DB (Database)

**DB(데이터베이스)**는 서버(백엔드)에 저장되는 데이터예요.

DB 예시: 게시글


전역 상태 vs 로컬 상태

헷갈릴 수 있으니 정리해볼게요.


상태 저장 위치 결정 가이드

어떤 데이터를 어디에 저장할까요?

예시로 정리:


AI한테 이렇게 요청하세요

상태 관리 개념을 알면 AI한테 어디에 저장할지 정확히 말할 수 있어요.

상황 1: 로그인 기능

나쁜 예 (저장 위치 안 말함)

나: "Next.js로 로그인 기능 만들어줘"

→ AI가 알아서 만드는데, 새로고침하면 로그아웃될 수도 있어요.

좋은 예 (전역 상태 + localStorage)

나: "Next.js + Supabase로 로그인 기능 만들 건데,

    1. 상태 관리:
       - 로그인 정보는 전역 상태로 관리 (zustand 써줘)
       - 앱 전체에서 접근 가능하게
       - 헤더, 사이드바, 메인에서 다 쓸 거야

    2. 새로고침 대응:
       - 액세스 토큰은 localStorage에 저장
       - 앱 시작할 때 localStorage 확인해서
         토큰 있으면 자동 로그인

    3. 로그아웃:
       - 전역 상태 null로 초기화
       - localStorage도 삭제

    옵저버 패턴으로 로그인 상태 바뀌면
    모든 컴포넌트 자동 업데이트되게 해줘."

상황 2: 장바구니

나쁜 예

나: "장바구니 기능 만들어줘"

좋은 예 (로그인 여부에 따라 다르게)

나: "쇼핑몰 장바구니 만들 건데, 상태 관리 두 가지로 나눠줘.

    1. 비로그인 사용자:
       - 장바구니 데이터를 localStorage에 저장
       - 이 브라우저에서만 유지
       - 전역 상태로 앱 전체 공유

    2. 로그인 사용자:
       - Supabase의 cart 테이블에 저장 (user_id 연결)
       - 다른 기기에서도 접근 가능
       - 로그인하면 localStorage 데이터를 DB로 이동

    장바구니 담기, 삭제, 수량 변경하면
    옵저버 패턴으로 장바구니 아이콘, 목록, 총액 동시 업데이트."

상황 3: 게시글 작성

나쁜 예

나: "게시글 작성 페이지 만들어줘"

좋은 예 (단계별 상태 관리)

na: "게시글 작성 페이지 만들 건데, 상태를 단계별로 관리해줘.

    1. 작성 중 (로컬 상태):
       - 입력 중인 제목, 내용은 로컬 상태로 (메모리)
       - Container-Presenter 패턴으로
         PostEditorContainer에서 상태 관리

    2. 임시 저장 (localStorage):
       - "임시 저장" 버튼 누르면 localStorage에 저장
       - 키: draft_post_{timestamp}
       - 페이지 들어올 때 임시 저장본 있으면 복구 물어보기

    3. 작성 완료 (DB):
       - "등록" 버튼 누르면 Supabase posts 테이블에 저장
       - 필드: title, content, user_id, created_at
       - 저장 성공하면 localStorage 임시 저장본 삭제

    에러 처리도 해줘:
    - 네트워크 끊겼을 때 localStorage에 자동 저장
    - 복구 기능"

실제 대화 예시

AI랑 상태 관리 설계하면서 대화할 때 이렇게 해요.

┌───────────────────────────────────────────────────────────────────────┐ │ 1단계: 기능 설계 및 상태 관리 방향 결정 │ ├───────────────────────────────────────────────────────────────────────┤ │ │ │ 나: "할 일 관리 앱 만들 건데, Next.js + Supabase 쓸 거야." │ │ │ │ AI: "할 일 데이터를 어디에 저장할까요? │ │ 옵션: │ │ 1. localStorage (오프라인 가능, 이 기기만) │ │ 2. Supabase DB (다른 기기 동기화, 로그인 필요)" │ │ │ │ 나: "Supabase DB로 가자. 다른 기기에서도 봐야 하니까. │ │ 근데 로그인 전에도 쓸 수 있게 임시로 localStorage 쓰고, │ │ 로그인하면 DB로 옮겨줘." │ │ │ └───────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────┐ │ 2단계: 상태 관리 구조 협의 │ ├───────────────────────────────────────────────────────────────────────┤ │ │ │ AI: "상태 관리는 어떻게 할까요? │ │ 1. 전역 상태 (zustand, React Context) │ │ 2. 로컬 상태 + props로 전달 │ │ 3. React Query로 서버 상태 관리" │ │ │ │ 나: "zustand로 전역 상태 관리해줘. │ │ │ │ 전역 상태: │ │ - todos: 할 일 목록 │ │ - addTodo, deleteTodo, toggleTodo 액션 │ │ │ │ 옵저버 패턴으로 todos 바뀌면 │ │ TodoList, TodoCounter 자동 업데이트되게. │ │ │ │ 입력 폼은 로컬 상태로 (메모리). │ │ 추가 버튼 누를 때만 전역 상태 업데이트." │ │ │ └───────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────┐ │ 3단계: 구현 및 기능 단위 확인 │ ├───────────────────────────────────────────────────────────────────────┤ │ │ │ AI: "zustand store 만들고, 컴포넌트 연결했어요." │ │ │ │ [기능 단위로 직접 확인] │ │ 1. 할 일 추가 │ │ → 입력하고 추가 버튼 클릭 │ │ → 목록에 바로 뜸 ✅ │ │ → Counter도 자동 업데이트 ✅ │ │ │ │ 2. 새로고침 │ │ → 어? 데이터 날아가네? │ │ │ │ 나: "새로고침하면 데이터 날아가는데? │ │ Supabase todos 테이블에 저장하고, │ │ 앱 시작할 때 DB에서 불러와서 전역 상태에 넣어줘." │ │ │ │ AI: "todos 테이블 만들고 CRUD API 연결할게요. │ │ 컴포넌트 마운트될 때 DB에서 가져와서 zustand에 넣겠습니다." │ │ │ │ [다시 확인] │ │ - 할 일 추가 → DB에 저장 → 목록 업데이트 ✅ │ │ - 새로고침 → DB에서 불러옴 → 유지됨 ✅ │ │ - 다른 탭에서 열기 → 같은 데이터 ✅ │ │ │ │ 💡 핵심: │ │ - 전역 상태 (zustand): 앱 안에서 공유 │ │ - DB (Supabase): 영구 저장 + 다른 기기 동기화 │ │ - 로컬 상태 (입력 폼): 잠깐 쓰고 버림 │ │ → 데이터 성격에 맞게 위치 나눔! │ │ │ └───────────────────────────────────────────────────────────────────────┘


코드 문법 몰라도 돼요

💡 잠깐, zustand? React Context? 이게 뭔데요?

괜찮아요. 개념만 알면 돼요.

여러분이 알아야 할 것:
✅ 로컬 상태 = 컴포넌트 안에서만 씀 (검색창)
✅ 전역 상태 = 앱 전체에서 씀 (로그인)
✅ localStorage = 브라우저 저장 (다크모드)
✅ DB = 서버 저장 (게시글)

여러분이 몰라도 되는 것:
❌ zustand 코드 문법
❌ React Hook 구현 디테일
❌ localStorage API 사용법

→ AI한테 "전역 상태로 관리해줘" 하면 됨.
→ "localStorage에 저장해줘" 하면 됨.
→ "Supabase todos 테이블에 저장해줘" 하면 됨.

주의사항: 조합이 중요해요

⚠️ 하나만 쓰는 게 아니라 조합해서 써요


다음 단계: AI한테 설계 지시하는 법

상태 관리 개념까지 배웠으면, 이제 PART 4의 마지막이에요.

PART 4에서 배운 것:
16편: 자료구조 - 데이터를 어떻게 조직할까?
17편: 아키텍처 - 전체 구조를 어떻게 잡을까?
18편: 디자인 패턴 - 코드를 어떻게 짤까?
19편: 상태 관리 - 데이터를 어디에 둘까?

다음 편(20편): 이 모든 걸 조합해서 AI한테 설계 지시하기
              → 실전 대화 예시로 처음부터 끝까지

오늘의 핵심 정리


셀프체크

이 글을 이해했다면 아래 질문에 답할 수 있어요:

  • 검색창 입력 내용은 어디에 저장하면 좋을까요? (페이지 나가면 날아가도 됨)
  • 다크모드 설정은? (새로고침해도 유지, 기기별로 달라도 됨)
  • 게시글 데이터는? (다른 기기에서도 봐야 함)
  • 로그인 상태는? (앱 전체 공유 + 새로고침 유지)
  • 검색창: 로컬 상태 (메모리) - 컴포넌트 안에서만 씀
  • 다크모드: localStorage + 전역 상태 - 브라우저 저장 + 앱 전체 공유
  • 게시글: DB (Supabase posts 테이블) - 서버에 영구 저장
  • 로그인: 전역 상태 + localStorage + DB - 조합! (전역: 앱 공유, localStorage: 토큰 저장, DB: 사용자 정보)

다음 글 예고

오늘은 상태 관리 개념을 배웠어요. 데이터를 어디에 저장할지, 로컬/전역/브라우저/DB 중에 선택하는 법이요.

PART 4에서 여기까지 배웠어요:

  • 자료구조 (데이터 조직)
  • 아키텍처 (전체 구조)
  • 디자인 패턴 (코드 작성 방법)
  • 상태 관리 (데이터 저장 위치)

다음 글에서는 이 모든 걸 조합해서 AI한테 설계 지시하는 법을 알아볼게요.

20편: AI한테 설계 지시하는 법

  • PART 4 종합 실습
  • 처음부터 끝까지 실전 대화 예시
  • "할 일 관리 앱을 설계부터 구현까지 AI랑 대화하면서 만들기"

개념을 배웠으면, 이제 실전에서 어떻게 쓰는지 보여드릴게요.


이 시리즈 로드맵

PART 4: 기술 개념 - 설계
[ 16편 ] 자료구조 개념 ✅
   ↓
[ 17편 ] 아키텍처 개념 ✅
   ↓
[ 18편 ] 디자인 패턴 개념 ✅
   ↓
[ 19편 ] 상태 관리 개념 (지금 여기!)
   ↓
[ 20편 ] AI한테 설계 지시하는 법
   ↓
  ...

궁금한 점이나 다뤘으면 하는 주제가 있으면 댓글로 남겨주세요!