본문 바로가기

알토르

알토르 3주차 - Browser Storage

Browser Storage

“브라우저 저장 방식”이라고 하면, 웹 브라우저에서 데이터를 사용자 측(클라이언트)에서 저장하는 방법

1️⃣ 쿠키(Cookie)

  • 용도: 로그인 상태 유지, 세션 관리, 사용자 설정 저장 등
  • 저장 위치: 브라우저 내, 서버와 주고받음
  • 용량: 약 4KB 정도
  • 특징:
    - HTTP 요청 시 서버로 자동 전송 → 서버에서 읽고 활용 가능
  • 만료일 설정 가능

(JavaScript):

// 쿠키 생성
document.cookie = "username=JuHyeok; path=/; max-age=3600"; // 1시간
// 쿠키 읽기
console.log(document.cookie);

2️⃣ 로컬 스토리지(Local Storage)

  • 용도: 브라우저에 장기 데이터 저장, 앱 설정, 캐시
  • 저장 위치: 브라우저 안, 클라이언트 장치만 접근 가능
  • 용량: 약 5~10MB
  • 특징:
    - 서버에 자동 전송되지 않음 → 클라이언트 전용
    - 사용자가 직접 파일을 건드리지 않는 이상, 브라우저를 통해서만 접근 가능
    - 로컬 스토리지는 HTTP 요청 시 서버로 전송되지 않음
    - 서버는 사용자가 브라우저를 통해 데이터를 보내기 전까지 확인 불가
    - 데이터 만료 없음 → 삭제 전까지 유지
// 저장
localStorage.setItem("toeicScore", "935");
// 불러오기
const score = localStorage.getItem("toeicScore");
console.log(score); // 935
// 삭제
localStorage.removeItem("toeicScore");
// 전체 삭제
localStorage.clear();

3️⃣ 세션 스토리지(Session Storage)

  • 용도: 브라우저 탭 단위 데이터 저장, 일시적 상태 유지
  • 저장 위치: 브라우저
  • 용량: 로컬 스토리지와 비슷
  • 특징:
    - 브라우저 탭을 닫으면 데이터 사라짐
    - 서버에 전송되지 않음
// 저장
sessionStorage.setItem("threadId", "12345");
// 불러오기
const thread = sessionStorage.getItem("threadId");
console.log(thread); // 12345
// 삭제
sessionStorage.removeItem("threadId");
// 전체 삭제
sessionStorage.clear();

4️⃣ IndexedDB

  • 용도: 대용량 구조화 데이터, 오프라인 앱 저장
  • 저장 위치: 브라우저
  • 용량: 수 MB ~ GB 가능
  • 특징:
    - 비동기 API
    - 객체 저장 가능 (문서, JSON 등)
    - 트랜잭션, 인덱스 지원
const request = indexedDB.open("MyDB", 1);
request.onupgradeneeded = (event) => {
  const db = event.target.result;
  db.createObjectStore("scores", { keyPath: "id" });
};
request.onsuccess = (event) => {
  const db = event.target.result;
  const tx = db.transaction("scores", "readwrite");
  const store = tx.objectStore("scores");
  store.put({ id: 1, score: 935 });
};

1️⃣ 개념: thread_id란?

Thread = 대화 흐름 단위

GPT 모델에서 같은 대화 맥락(Context)을 유지하기 위해 사용

thread_id를 이용하면, 이전 대화 내용을 기억한 채로 답변 가능

2️⃣ 흐름 설명
① 최초 메시지

사용자가 처음 메시지를 보냄 → thread_id가 없음

서버(API)가 새로운 thread_id 생성 요청을 GPT에 보냄

GPT API가 thread_id를 생성해서 반환

서버가 사용자에게 생성된 thread_id와 함께 답변 전달

사용자는 thread_id를 로컬에 저장 (예: 로컬 스토리지, 세션 등)

예시 JSON 반환

{
"thread_id": "abc123xyz",
"reply": "안녕하세요! 질문을 알려주세요."
}

② 이후 메시지

사용자가 메시지를 보낼 때 저장해둔 thread_id 포함

POST /sendMessage
{
"thread_id": "abc123xyz",
"message": "제 TOEIC 점수는 얼마인가요?"
}

서버가 GPT API에 thread_id와 메시지 같이 전달

GPT 모델은 같은 스레드 컨텍스트를 기반으로 답변 생성

서버가 답변을 사용자에게 전달

필요 시 thread_id는 그대로 유지 → 다음 메시지에도 계속 사용

③ 장점

대화 맥락 유지 가능 → 이전 질문/답변 기억

사용자가 여러 메시지를 보내도 대화 연속성 유지

클라이언트는 thread_id만 저장하면 됨 → 서버 상태 관리 불필요

④ 예시 구조 (Flask)
@app.route("/sendMessage", methods=["POST"])
def send_message():
data = request.json
thread_id = data.get("thread_id")
message = data.get("message")

if not thread_id:
    # 새 thread 생성
    thread = client.beta.threads.create()
    thread_id = thread.id

# GPT에 메시지와 thread_id 전달
response = client.beta.threads.add_message(
    thread_id=thread_id,
    content=message
)

return jsonify({
    "thread_id": thread_id,
    "reply": response.content
})

⑤ 클라이언트 처리

최초 메시지: thread_id 없으므로 서버에서 새 thread_id 받아서 저장

이후 메시지: 저장한 thread_id와 함께 요청

이렇게 하면 대화가 항상 같은 스레드 컨텍스트 안에서 진행

정리하면:

thread_id = 대화 맥락을 유지하는 키

처음 없으면 생성 → 사용자에게 반환

사용자는 저장 → 이후 메시지마다 thread_id 함께 전송

GPT는 같은 스레드로 인식 → 이전 대화 기억

'알토르' 카테고리의 다른 글

알토르 4주차 추가 과제 -1  (0) 2026.05.15
Assistant + Retrieval 기반으로 바꾸기 - code  (0) 2026.05.14
OpenAI Assistant  (0) 2026.05.12
알토르 3주차 OpenAI API 연동  (0) 2026.05.11
알토르 3주차 - Fetch / Axios  (0) 2026.05.10