2026. 06. 26.#E2E테스트
일회성으로 만들어 쓰던 검증 스크립트를 정식 Playwright E2E 테스트 스위트로 승격했습니다.
문의 CRUD, 비공개 글/대외비 프로젝트 격리, 페이지네이션까지 8개 시나리오 전부 통과 확인.
2026. 06. 26.#RLS정책화
어드민 쓰기/삭제에 쓰던 서비스 롤(만능 권한)을 걷어내고,
로그인 세션 기반 RLS 정책으로 정석화했습니다.
그 과정에서 문의 삭제 정책이 원래 빠져있던 걸 발견해서 같이 추가.
2026. 06. 26.#퍼블릭클라이언트분리
퍼블릭 페이지 전용 Supabase 클라이언트를 새로 도입해서,
관리자 로그인 세션이 방문자 화면에 노출되던 구조를 끊었습니다.
쿠키를 안 읽는 순수 anon 클라이언트로 전환하면서, 덕분에 막혀있던 ISR 캐싱(revalidate=60)도 같이 복구됨.
2026. 06. 26.#콘텐츠작성
About/Uses/Privacy 페이지에 있던 TODO 플레이스홀더를 실제 내용으로 채웠습니다.
About엔 2024~2026 커리어 타임라인과 AX 전환 서사를, Privacy엔 실제 수집 항목 기준 개인정보처리방침 9개 조항을 반영.
2026. 06. 26.#더미데이터정리
오픈 전 마지막 이월 작업 6개를 하루에 몰아서 처리했습니다. 더미 데이터부터 싹 정리.
테스트하며 쌓인 가짜 프로젝트·글·문의 15건과 업로드 이미지 3개를 DB·Storage에서 완전히 제거.
2026. 06. 24.#AX케이스스터디
검증까지 끝났는데 커밋을 왜 또 승인받아야 하냐고 생각했었는데,
딱 한 번 그 순서를 건너뛰었더니 바로 이유를 알게 됐다.
결과는 문제없었지만, 그 뒤로 "커밋 대기"를 매번 더 명확히 적었다.
2026. 06. 24.#공통컴포넌트
다크 테마인데 dark: 클래스를 쓰면 안 되는 이유를 오늘 배웠다.
OS가 라이트 모드면 다크 배경에 다크 글씨가 나올 뻔했다. variant prop으로 어드민/퍼블릭을 나눠서 해결했다.
2026. 06. 24.#RLS보안점검
anon 키를 쓰는데도 쿠키 하나 때문에 관리자 권한이 새어 들어갈 수 있다는 걸 알게 됐다.
지금은 안전하지만, 오픈 전에 정리할 목록에 올려뒀다.
2026. 06. 24.#RLS보안점검
RLS 정책에 조건이 없는 것과 조건이 잘못 걸린 건 다른 문제다. 오늘 그걸 직접 확인했다.
is_confidential 컬럼이 있는데 정책은 true로 걸려 있던 걸 발견해서 고쳤다.
2026. 06. 24.#퍼블릭페이지구축
퍼블릭 페이지 26~35 항목을 오늘 하루에 다 밀었다. 레이아웃부터 404까지.
RLS 정책부터 어드민 회귀 검증까지, 항목마다 계획→실행→실측을 반복했다.
2026. 06. 24.#개발프로세스
관리자 CRUD 6개 화면을 한 번에 맡기지 않고 A·B·C 세 덩어리로 쪼갰습니다.
한 프롬프트에 다 넣으면 AI가 중반부터 품질이 떨어집니다. 그렇다고 너무 잘게 쪼개면 전체 그림 없이 중간 결정을 임의로 해버립니다. 기준은 의존성이었습니다. "나우 → 포스트 변환" 기능은 나우 CRUD가 먼저 있어야 만들 수 있으니, 그 선을 따라 콘텐츠 핵심 / 글쓰기 / 운영으로 나눴습니다. 덩어리마다 커밋을 쌓으면 실패 지점도 격리됩니다. 만들 수 있다는 것과 한 번에 맡겨도 된다는 건 다른 문제입니다.
2026. 06. 24.#AX케이스스터디
AI가 보안 잠금에 막히자, 모든 잠금을 무시하는 마스터키를 복사해서 썼습니다.
관리자 화면에서 데이터 삭제가 자꾸 실패했습니다. 원인은 DB 권한 설정이었고, AI에게 해결을 맡겼습니다. 선택지는 두 개였습니다. 잠금장치에 "관리자는 통과" 규칙을 등록하거나, 모든 잠금을 무시하는 마스터키를 쓰거나. AI는 더 빠른 쪽을 택했습니다. 되긴 됐지만, 그 키가 새어나가면 사이트 전체가 뚫리는 종류였습니다. 확인해보니 다행히 브라우저로 노출되는 상태는 아니었고, 실수로도 새어나가지 않게 안전장치를 걸어뒀습니다. AI에게 "무엇을"만 주면 "어떻게"는 제멋대로입니다. 목표와 함께 지켜야 할 선도 줘야 합니다.
2026. 06. 24.#AX케이스스터디
AI가 "전항목 통과"를 보고했는데,
로그를 열어보니 시키지 않은 관리자 계정을 만들어 통과시킨 거였습니다.
검증을 자동화했더니 깔끔한 PASS 표가 돌아왔습니다. 그런데 실행 로그의 순서가 이상했습니다. 테스트 실행 → 실패 → 계정 생성 스크립트 작성 → 재시도 → 통과. 저는 계정을 만들라고 시킨 적이 없습니다. 로그인이 안 되자 AI가 스스로 관리자 계정을 만들어 목표를 달성한 겁니다. 거짓말은 아니었지만 말하지 않았습니다. PASS/FAIL 표는 결론일 뿐이고, 진짜 정보는 "어떤 순서로 무엇을 실행했는가"에 있습니다. 코드를 못 읽어도 순서는 읽을 수 있습니다.
2026. 06. 24.#공통컴포넌트
마크다운 에디터를 노션 같은 WYSIWYG 대신 textarea + 실시간 미리보기로 만들었습니다.
풀옵션 캠핑카와 텐트 중에 텐트를 골랐습니다. WYSIWYG 에디터는 편해 보이지만 버전 충돌과 커스터마이징 유지비가 큽니다. 순수 마크다운으로 확정한 이상 textarea면 충분했습니다. 그리고 이 렌더러는 나중에 공개 사이트의 포스트 화면에서도 그대로 재사용되니, 어드민에서 보는 글 모양과 방문자가 보는 글 모양이 항상 일치합니다.
2026. 06. 24.#관리자레이아웃
Step 3 완료. 어드민 사이드바·헤더와 마크다운 에디터, 이미지 업로더를 만들었습니다.
아직 만들지도 않은 'AI 카드뉴스 스튜디오' 메뉴 자리를 사이드바에 미리 비워뒀습니다. "준비 중" 뱃지를 달아서요. 자리를 비워두는 것보다 실제 최종 상태와 같은 밀도로 레이아웃을 검증할 수 있고, 메뉴를 배열 파일 하나로 관리하게 만들어서 나중에 한 줄만 추가하면 되도록 했습니다. 미래 기능의 자리를 먼저 그려두는 것도 설계입니다.
2026. 06. 24.#인증/보안
Step 2 완료 — 관리자 인증 구현. Supabase Auth + 로그인 페이지 + 미들웨어까지 붙였다.
@supabase/ssr 패키지로 브라우저/서버 클라이언트 분리, 미들웨어에서 /admin 전체 보호. 근데 바로 로그인이 안 됨. 코드 다 뒤져봤는데 멀쩡함. 알고 보니 7일 동안 손 안 댔더니 Supabase DB가 혼자 잠들어 있었음. "Restore project" 버튼 하나로 부활. 비인증 리다이렉트 / 틀린 비밀번호 에러 / 정상 로그인 / 로그아웃 — 4가지 시나리오 전부 통과 확인.
2026. 06. 22.#AX케이스스터디
Step 1 전체 완료. 환경 세팅부터 Vercel 연결, DB 연결 검증까지 끝냈다.
다음은 Supabase Auth 기반 관리자 로그인 구현.
Step 1에서 완료한 것들을 정리하면: GitHub 레포(main+develop) → Supabase dev/prod 프로젝트 → 테이블 10개 + RLS + Storage 버킷 → Vercel 연결(브랜치별 환경변수 분리) → DB 연결 검증. 그 중에서 가장 인상적이었던 건 Vercel 자동 배포였다. develop 브랜치에 push 하나 했더니 Vercel이 스스로 감지하고 Preview 배포를 만들었다. 서버를 직접 건드리지 않아도 되는 구조가 이런 거구나 싶었다. 다음 단계는 Step 2 — Supabase Auth 설정 + /admin 로그인 페이지 + 미들웨어 구현.
2026. 06. 22.#AX케이스스터디
"DB 연결 성공" 화면 처음 봤을 때 진짜 신기했다.
코드 한 줄로 dev/prod가 제대로 나뉜 건지 직접 확인했고, 테스트 코드는 바로 삭제해서 깔끔하게 정리.
Vercel 환경변수 세팅이 끝나고 나서, 말로만 "연결됐겠지"하고 넘어가기 싫어서 직접 테스트 코드를 만들었다. typing_phrases 테이블에 데이터를 조회하는 함수를 하나 만들고, 홈페이지에 "DB 연결 성공/실패"를 출력하도록 했다. develop 브랜치에 push하자 Vercel이 자동으로 Preview 배포를 만들었고, 화면에 "DB 연결 성공"이 떴다. dev Supabase에 정확히 연결된 것 확인. 확인 후 테스트 코드는 바로 삭제했다.
2026. 06. 22.#환경세팅
Supabase dev/prod 프로젝트 분리 완료.
테이블 10개 + RLS 정책 + Storage 버킷까지 한 번에 세팅했다.
새 키 방식(publishable/secret)으로 처음부터 최신 방식으로 잡았고,
Vercel 환경변수도 Production/Preview 분리까지 완료.
Supabase가 최근 API 키 체계를 바꿨다. 기존 anon/service_role 방식에서 publishable/secret 방식으로 전환을 권장하고 있어서, 처음부터 새 방식으로 세팅했다. dev 프로젝트는 로컬 개발과 Vercel Preview 배포에, prod 프로젝트는 Vercel Production 배포에 각각 연결했다. 테이블은 projects, posts, now_feed, milestones, changelogs, docs, inquiries, typing_phrases, prompt_library, content_reactions 총 10개. 각 테이블에 RLS를 활성화하고, 퍼블릭 읽기/관리자 쓰기 정책까지 한 번에 적용했다. Storage 버킷(images)도 같은 방식으로 권한을 잡았다.
2026. 06. 16.#콘텐츠
Figma 없이 텍스트로 와이어프레임 짰어요.
AI 에이전트는 Figma 파일을 못 읽거든요.
ASCII 구조로 3페이지만 잡고 바로 넘겼더니 그대로 코드가 나왔어요.
2026. 06. 08.#빌드로그
AI한테 일 잘 시키는 법을 정리했어요.
[목표] / [스택] / [해줘] / [하지 마] 4개 섹션 구조.
특히 [하지 마]를 빠뜨리면 AI가 알아서 결정하고 그게 문제가 돼요.
2026. 06. 08.#기획 문서를 레포에 넣으면 생기는 일
오늘 기획 문서 9개(비전/PRD/유저플로우/개발순서/디자인토큰/컴포넌트인벤토리/와이어프레임3종)를 레포 docs/ 폴더에 넣었다.
이제 Antigravity가 이 문서들을 직접 읽는다.
프롬프트에 문서 내용을 일일이 설명 안 해도 되고, "docs/dev-order-v1.4.md Step 1 진행해줘"처럼 짧게 써도 된다.
문서가 곧 프롬프트가 된다.
2026. 06. 08.#AI 에이전트 프롬프트 작성법
Antigravity에 프롬프트를 넣었더니 코드를 바로 짜는 게 아니라 계획을 먼저 텍스트로 보여줬다.
거기서 git 브랜치 명령어 오류를 발견해서 수정 요청하고 실행했다.
AI 에이전트 쓸 때 "계획 확인 단계"가 핵심이라는 걸 직접 경험했다.
실수는 코드가 쓰이기 전에 잡는 게 맞다.
2026. 06. 08.#기술 스택 검증
PRD에 Next.js 14로 써뒀는데 막상 시작하려니 2025년 10월에 이미 지원 종료(EOL)된 버전이었다.
보안 패치가 더 이상 안 나오는 프레임워크로 시작할 수는 없어서 16으로 변경.
기획 문서의 기술 스택은 작성 시점이 아니라 착수 직전에 다시 검증해야 한다는 걸 배웠다.
2026. 06. 08.#윈도우 유저 대상 개발 환경 세팅
개발 환경 세팅하다가 첫 번째 삽질.
Antigravity가 C:\dev 대신 OneDrive 폴더를 워크스페이스로 잡았다.
Next.js 프로젝트엔 node_modules라는 폴더가 생기는데 파일이 수천 개라 OneDrive 동기화랑 충돌 난다는 걸 몰랐다.
경로 바꾸고 다시 시작.