embedding 컬럼을 만들어두고 17일을 비워뒀다Claude와 ChatGPT등 LLM들이 공유하는 개인 메모리 레이어를 만들었다.Next.js 라우트 하나, Postgres 테이블 하나,툴 네 개(remember / recall / list_memories / forget)가 전부인 장난감 같은 도구다. 기록해두고 싶은 건 완성된 구조가 아니라 거기까지 간 순서다.커밋 로그에는 무엇을 했는지만 남고, 무엇을 하지 않기로 했는지는 남지 않는다.이 프로젝트에서 값이 나온 부분은 대부분 후자였다.1. 사지 않기로 한 것부터시작할 때 머릿속에 있던 선택지는 이랬다.LangGraph로 제대로 된 RAG 파이프라인을 짠다최근 화제가 된 메모리 특화 오픈소스(mem-palace 류)를 붙인다직접 최소한으로 만든다..
전체 글
개 발 자 로 살 아 남 기Q최근 memory를 임베딩 벡터화하면서 조금 선명해진 생각이 있어요. 들어주세요. 4년전 gpt-3 가 상용화되었을 때 바로 결제하고 사용해보면서 느낀점들이 그동안 일하고 공부하느라 저 밑에 있다가 이번 구현을 계기로 수면위로 올라왔어요. ai 는 코딩하고, 음악만들고, 영상만들고, 문서만드는데 쓰는 도구이기도 하지만 그런 사용법은 과도기에나 적합한 것이라는 생각이에요.제 생각에 AI 는 인간을 증강하는데 사용되는게 이상적일 것 같습니다. AI는 인간 사고의 태생적 결함인 편향성을 극복하는데 너무나도 적합한 도구이자, (제가 오래전부터 신념으로 가지고 있는 바) 새로운 존재 - 동반자 라고 생각이되어요. 인간은 고정관념, 편향을 버릴 수 없어요. 단순화된 인지모델이 없으면 지각자체가 불가능하죠. 그렇기..
React Compiler와 라이브러리 호환성 - 사라질 문제와 남을 원리두 프로젝트에서 각각 한 번씩 크게 물렸다.한쪽은 폼(react-hook-form), 한쪽은 테이블(TanStack Table v8)이었는데 증상 문장은 똑같았다."눌렀는데 아무 일도 안 일어난다."런타임 에러도 없고 콘솔 경고도 없다.라이브러리는 제대로 동작하고 있고 화면만 옛날 값이다.1. 한 문장 원리React Compiler의 판단 기준은 오직 하나다. Object.is 참조 비교.if ($[13] !== label || $[14] !== registration) { t8 = …;} else { t8 = $[15]; // ← 캐시된 JSX를 그대로 재사용} 캐시된 엘리먼트를 그대로 돌려주면 React는 그 서브트리 전..
Next.js에서 Gmail SMTP + nodemailer로 메일 발송하기1. 이 접근법의 핵심Gmail 계정 하나 + 앱 비밀번호 하나로 SMTP 발송이 끝난다.EmailJS 같은 서드파티 SDK도, 자체 SMTP 서버 구축도, SendGrid/Resend 같은 외부 서비스 가입도 필요 없다.성립하는 이유는 세 가지다.Gmail은 그 자체가 완성된 SMTP 서버다. smtp.gmail.com은 이미 SPF/DKIM/DMARC가 잡혀 있고 IP 평판도 확보돼 있다. 자체 SMTP를 띄웠을 때 가장 고통스러운 "메일이 스팸함으로 간다" 문제를 Google이 대신 해결해 준 상태에서 시작한다.앱 비밀번호가 OAuth를 대체한다. Gmail API를 쓰면 OAuth 동의 화면, 리프레시 토큰 관리, 토큰 만..
Effect-TS 개론: Parse, don't validate 에서 Effect 생태계까지TL;DRPromise 는 성공 채널만 타입에 있고 실패 채널이 없다.Effect 는 성공·실패·의존성을 전부 타입에 새긴다.그 사상의 뿌리는 "검증(validate)이 아니라 파싱(parse)하라"에 있다. zod 로 충분하다고 느끼고 있었는데, Parse, don't validate 계열의 글을 읽고Effect-TS 생태계를 알게 되면서 사고방식 자체가 확장됐다.zod 도 사실 이 사상의 산물이라는 걸 뒤늦게 이해했다.이 노트는 그 궤적과 실전 감각을 정리한 것.1. 사상의 궤적King 의 원칙 → fp-ts 학술적 구현 → zod 실용적 축약 → Effect 전방위 확장① Haskell 진영의 원전 (2019..
useSyncExternalStore로 useIsMobile 재구성뷰포트가 모바일 폭인지 알려주는 흔한 훅 하나를 리팩토링했다.결과만 보면 코드 줄 수는 비슷한데, 고쳐진 문제가 네 개쯤 된다. 정리해둔다.Before"use client";import * as React from "react";const MOBILE_BREAKPOINT = 550;export function useIsMobile() { const [isMobile, setIsMobile] = React.useState( () => window.innerWidth { if (typeof window === "undefined") return; const onResize = () => { setIsMobile(w..
TL;DR현대 TLS는 대칭키 암호와 비대칭키 암호를 함께 사용하는 복합적인 프로토콜입니다.대표적으로 다음 두 기술을 결합합니다.ECDHE: 클라이언트와 서버가 공유 비밀을 네트워크로 직접 전송하지 않고 안전하게 합의합니다.RSA-PSS, ECDSA, EdDSA 등의 디지털 서명: 키 합의 상대가 인증된 서버이며, 해당 서버가 인증서의 개인키를 실제로 보유하고 있음을 증명합니다.이 둘을 결합한 것이 인증된 키 교환입니다.합의된 공유 비밀로부터 세션용 대칭키를 생성하고, 이후 실제 HTTP 요청과 응답은 대칭키 암호 방식으로 보호합니다.AES-GCM 혹은 ChaCha20-Poly1305TLS 1.3에서는 과거처럼 RSA 공개키로 비밀값을 암호화해 서버에 전달하는 RSA 키 운반 방식을 사용하지 않습니다.0..
JWT vs 세션, 그리고 JWK의 정체TL;DR"JWT가 죽은 게 아니라, JWT를 브라우저 세션 관리 도구로 쓰던 오용이 교정된 것."다시 상기하자, 쿠키 vs JWT는 대립 축이 아님, 쿠키는 전송 수단, JWT는 토큰 포맷.발단better-auth, Supabase Auth 등 최근 인증 솔루션들이 JWT(JWK)를 지원하면서도기본값은 쿠키+세션인 걸 보고 의문이 생겼다. 분명 몇 년 전엔 "JWT로 통일" 분위기였는데?1. 인증 트렌드는 실제로 한 바퀴 돌았다JWT 전성기 (~2015–2021)SPA + REST API 분리 아키텍처의 유행과 정확히 겹친다.프론트와 백이 다른 도메인, "stateless라 스케일링에 좋다"는 마케팅,튜토리얼마다 복붙되던 localStorage 저장 패턴.실무에서..
"로그인 성공과 동시에 차단 알림이?"어드민에 로그인할 때마다 슬랙으로 "IP 차단" 알림이 왔습니다.사유: 표적: 로그인 표면 (/api/auth/callback/google)IP: 223.62.16.68 (SK Telecom)이상한 점: 알림은 차단됐다는데 내 로그인은 멀쩡히 성공했습니다.타이밍도 정확히 내가 로그인한 순간이었고요.오탐인가? 버그인가? 싶어서 파봤는데, 결론은... 크롬 확장 Wappalyzer가 내가 방문한 OAuth 콜백 URL(일회용 인가 코드 포함)을 통째로 수집해서, 주거용 프록시 망에서 재접속하고 있었습니다.알림은 오탐이 아니라 이 유출 트래픽을 잡아낸 진짜 신호였습니다.조사 과정1) 알림 ≠ 내 로그인 요청코드상 슬랙 알림은 403 차단과 같은 분기에서만 발송됩니다.즉 알..
멀티플레이어 미니 FPS 만들기 2편(운영편)전체 흐름코드 정리(상수 중앙화) → 멀티룸(로비) → EC2 배포 → 맵 권위화 → 자연 지형 → 아레나 확장 → 밤하늘 → rubber-banding 진단 진행 방식이 기본편과 달랐다. 기본편 보러가기기본편 단계에서는 한 단계씩 내가 직접 검증하며 구현했고,여기는 클로드코드로 에이전트 파이프라인(architect → implementer → reviewer → qa)으로 굵직한 작업 단위를 처리했다.Part 1 - 상수/매직넘버 중앙화무엇 / 왜서버 전반에 흩어진 매직넘버를 단일 소스로 모았다. 핵심은 숨은 결합을 드러내는 것.예를 들어 틱 레이트 TICK_HZ=30과 물리 timestep=1/30은 반드시 같아야 하는데 따로 떨어져 있었다.스폰 높이 0...