IN PROGRESS2026.07 ~ 진행 중역할: 개인 프로젝트 · 요구사항 결정, AI 협업 개발, 검증·운영
WhoAmI — 공부 기록을 발행 가능한 형태로 좁힌 파이프라인
공부 노트를 옮길 때 섞이는 자격증명과 형식 오류를 저장·배포 전에 검사하는 개인 블로그입니다.
결과물 보기 →저장소 비공개 · 아래 공개 자료와 개발 기록에서 확인할 수 있습니다
시작 배경
옵시디언 볼트에 공부 노트가 쌓이기만 하고 정리되지 않았다. 강의에서 본 것을 직접 돌려 확인한 기록도 노트 사이에 흩어져 있어서, 나중에 같은 주제를 다시 볼 때 어디까지 확인한 것인지 알 수 없었다. 그래서 먼저 읽을 수 있는 형태로 정리하는 것이 목적이었고, 밖으로 내보내는 일은 그다음에 붙었다. 내보내기 시작하니 두 가지가 반복해서 문제가 됐다. 실습 기록에 섞인 토큰이나 내부 경로가 그대로 따라가고, 옮길 때마다 형식이 갈라져 나중에 검색되지 않는 글이 된다. 그래서 작성 경로가 달라도 저장과 배포 전에 같은 기준으로 검사하도록 절차를 정리했다.
맡은 일
- Astro 정적 사이트로 블로그를 만들고 글·카테고리·태그를 콘텐츠 컬렉션 스키마로 고정했다. 형식 오류가 배포가 아니라 빌드에서 걸리게 하는 것이 목적이다.
- 볼트에서 고른 Markdown 노트를 반입하는 변환기를 만들고, 관리자는 30-publish의 발행 후보를 입력으로 사용한다. 위키링크·주석·중복 H1을 정리하고, 위키링크를 변환할 때 미공개 글로 연결하지 않는다.
- 브라우저에서 글을 쓰고 이미지를 끌어다 놓는 로컬 관리자를 붙였다. 정적 배포를 유지하려고 사이트가 아니라 scripts/ 안의 독립 서버로 두었다.
- 관리자와 반입기의 기본 저장 경로에서 자격증명 스캐너를 실행한다. 명시적 예외 옵션이 있으므로 모든 저장을 무조건 차단한다고 보장하지 않는다.
- 빌드 결과물(dist)에서 제한 경로의 noindex·사이트맵 제외 여부와 공개 페이지의 조직명·이메일 노출을 검사하는 스크립트를 만들었다.
- 관리자에서 공개 상태를 유지한 채 제목·설명·본문을 바꾸면, 게시일이 지난 경우 수정일을 자동으로 갱신하도록 했다. 오탈자만 고칠 때는 편집자가 자동 갱신을 끄고 저장할 수 있다.
진행 내용
- 관리자 직접 작성·Markdown 파일 편집·Obsidian 반입 경로가 있다. 배포 전에는 npm run release로 회귀 테스트·타입·콘텐츠·자격증명·빌드·공개 범위를 검사한다.
- 기본 저장 경로에서는 자격증명이 탐지된 원고를 차단한다. 명시적 저장 예외가 있으며, 배포 전 자격증명 검사는 별도로 실행한다.
- 공개 범위 검사를 배포 전 명령 하나로 만들었다. 산출물의 noindex·사이트맵·제한 경로 링크와 조직명·이메일 노출을 확인한다.
- 로컬 검증과 커밋을 마친 뒤 npm run push로 main을 올리면, GitHub Actions가 다시 검증하고 배포한다.
전체 파이프라인
/share/*는 저장소·dist·검색 색인에 들어가지 않는 별도 한시 공개 경로입니다. 그림을 누르면 크게 볼 수 있습니다.2026-09-25 정정 — 오탈자 수정 여부를 자동으로 판별하는 것이 아니라, 편집자가 수정일 자동 갱신을 끄는 방식임을 명확히 했다.
2026-09-05 정정 — 작성 경로가 하나뿐이라는 설명, 저장 차단의 예외, 검증 범위와 이미지 후처리를 현재 코드에 맞춰 정정했다. 과거 집계 수치는 제거했다.
먼저 볼 사례: 원고를 저장하는 곳과 공개하는 곳
실습 노트를 옮길 때 토큰 형태의 값이 본문에 섞여 있으면, 관리자와 반입기의 기본 저장 경로는 파일 기록을 멈춘다. 허용된 더미 값으로 원고를 고친 뒤 다시 저장할 수 있다. 명시적 저장 예외가 있으므로 모든 입력의 안전성을 보장하는 기능은 아니다.
저장에 성공해도 바뀌는 것은 로컬 작업 트리다. 관리자 코드는 공개 산출물에 들어가지 않고, 배포 전에는 회귀 테스트·콘텐츠·자격증명·공개 범위 검사를 별도로 실행한다. 편집 화면을 분리한 구조는 관리자 개발 기록, 산출물에서 확인하는 경계는 공개 범위 검사 기록에서 이어 볼 수 있다.
이 프로젝트는 AI와 함께 만들었다
설계, 구현, 문서 작성 대부분을 LLM과 함께 했다. 무엇을 얼마나 썼는지는 AI 활용 기록에 남아 있는 로그·화면 기록의 수치로 정리해 두었다. 수집은 명시적으로 실행할 때만 하며, 그 수치만으로 기능별 기여나 검증 범위를 증명하지는 않는다.
그래서 아래 개발일지에는 같은 형태의 기록이 반복해서 나온다. 함께 만든 문서나 설정이 실제 동작과 어긋나 있는 것을 나중에 확인하다 발견하고, 그것을 어떻게 처리했는가. 만든 과정을 적지 않으면 그 검토가 왜 필요했는지도 설명되지 않는다.
왜 정적 사이트로 두었나
관리자 화면이 필요했지만 그 때문에 사이트를 서버 렌더링으로 바꾸지는 않았다.
관리자는 scripts/ 안의 독립 Node 서버라 빌드 결과물에 들어가지 않고, 기본은 이 PC에서만 열린다.
’편집 편의’와 ’공개 표면’을 맞바꾸지 않는 쪽을 골랐고, 버린 선택지와 아직 남은 문제는
관리자 화면이 필요했는데 사이트를 서버 렌더링으로 바꾸지 않았다에 적었다.
자격증명 검사를 경고가 아니라 중단으로 둔 이유
처음에는 경고만 띄우고 저장은 되게 할 생각이었다. 바꾼 이유는 단순하다. 경고는 급할 때 지나친다. 그리고 한 번 커밋된 토큰은 파일을 고쳐도 git 이력에 남는다. 그래서 원고를 저장할 때부터 자격증명을 검사하도록 했다.
현재 구현에는 관리자 allowSecrets와 반입기 --allow-secrets 예외가 있다. 따라서 저장 차단은 기본 동작의 범위다. 막혔을 때는 원본을 더미 값으로 고치고 다시 검사하는 절차를 사용한다. 배포 전 자격증명 검사는 별도로 남아 있다.
운영 중인 처리와 남은 과제
- CI에 SAST·SCA를 붙이는 것. 현재 CI에는 회귀 테스트·타입·콘텐츠·자격증명·빌드·공개 범위 검사가 있다.
- 반입 때 400KB 이상 이미지는 경고한다. 빌드 후처리는 치수·지연 로딩과 무손실 WebP 대안을 자동으로 만들며, 원본도 보존한다.
- 저장소가 비공개다. 이력 데이터가 저장소 안에 있는 한 공개로 돌릴 수 없고, 그 데이터를 밖으로 빼는 것이 공개 전환의 선행 조건이다.
개발일지
프로젝트를 진행하며 내린 판단과 작업 과정을 시간순으로 정리했습니다.
- 형식이 틀린 글은 배포가 아니라 빌드에서 멈추게 했다
- 볼트는 저장소 밖에 두고 관리자 큐만 좁혔다
- 코드 리뷰에서 나온 지적이 대부분 같은 모양이었다
- 관리자 화면이 필요했는데 사이트를 서버 렌더링으로 바꾸지 않았다
- 자격증명 검사를 경고가 아니라 중단으로 뒀다
- 관리자 저장에서 오탈자까지 「업데이트」로 표시되지 않게 했다
- PC 두 대를 오가며 깨지는 지점만 명령 하나로 걷어냈다
- 배포 경로를 갈아타고, 옛 경로를 지우기까지 닷새가 걸렸다
- 공개 범위를 사람이 아니라 명령이 확인하게 했다
- 카테고리를 아무리 나눠도 읽는 순서는 안 고쳐졌다
- 커밋 39개에서 시작한 저장소 감사는 61개에서 끝났다
- 「비공개 모드」라고 이름 붙였는데 비공개가 아니었다
- 쓰는 쪽만 보고 만든 사이트를 읽는 쪽에서 열었다