// 대시보드는 각자 브라우저에서 열리므로
// localStorage 가 그 자체로 개인 설정 저장소다. 서버도, 공유 설정 파일도 필요 없다.
하는 일임박한 점검 창을 하루 한 번 띄울지, 열 때마다 띄울지 사람마다 고름
그런데누군가 파일을 열어야 창이 뜹니다. 그 주에 한 번도 안 열면 알림도 없습니다
요청서 ②번 "알림 메일 자동 발송"이 여기서 나왔습니다. 받은 미리보기 파일에서 그대로 옮겼습니다.
2 · 품질관제실 코드 설명 2
부서만 아는 규칙이 코드 설명에만 있습니다
부서 확인 결과 '2027.01.01' 은 실제 일정이 아니라
"그 해에 한다"는 미정 표시다.
실제로 2027-01-01 만 99건이라, 날짜로 찍으면
새해 첫날에 100건이 몰린 거짓 달력이 된다.
지금만든 분 머릿속과 코드 설명에만 있음
오늘이런 규칙을 spec.md에 먼저 적습니다. 다른 사람이 이어받거나 서버로 옮길 때 빠지지 않게
2 · Try · 1분
내 엑셀이나 도구 하나는 몇 단계에 있나요
하나를 떠올려 그림 2-1의 몇 단계인지 적어 둡니다. 2단계까지는 어떤 도구든 비슷한 순서로 갑니다. 3단계는 그 도구의 코드와 자료, 부서 서버 사정을 봐야 해서 도구마다 할 일이 다릅니다. 오늘 마지막에 확인표로 정리합니다.
Part 02 · GitHub
GitHub로 같이 고치기
누가 언제 무엇을 바꿨는지 남기는 방법입니다. 빈 폴더를 만들자마자 GitHub에 올려 두고 시작합니다.
빈 폴더 · 연습 자료→비공개 저장소→짝과 같이 고치기
3 · Empty folder
schedule-board 폴더부터 고릅니다
1일차 4장처럼 입력창 위 폴더 버튼 → Documents → "새 폴더"로 schedule-board를 만들고 "폴더 선택".
빨간 상자에 폴더 이름이 schedule-board로 바뀌었는지 봅니다.
3 · Practice data
회사 일정표는 가져오지 않고, 열 이름만 말해 가짜를 만듭니다
나는 GH 품질관리부에서 현장 점검·평가 일정을 챙겨. 연습용 샘플 schedule.csv 하나 만들어줘. 열은 현장명, 구분(점검/평가), 차수, 예정일, 담당자, 담당자메일. 30줄 정도, 예정일은 2026-10-02 기준 앞뒤 두 달로. 몇 줄은 2027-01-01로 넣어줘. 우리 부서에서는 그게 "그 해에 한다"는 미정 표시야. 현장명이랑 사람은 가짜로.
3 · Result
schedule.csv가 생기고, 오른쪽에 표로 열립니다
schedule.csv와 Claude의 설명
3 · Result
30줄, 현장 11곳, 담당자 6명, 미정 5줄
Rows
일정
30
헤더를 뺀 줄 수
Sites
현장
11
전부 가짜 이름
Mail
담당자 6명
@example
실제로 발송되지 않는 주소
Undecided
2027-01-01
5
미정 표시 줄. 10절 화면에서 다시 봅니다
3 · Claude said
2절의 미정 표시 이야기를 Claude가 먼저 했습니다
나중에 이 파일로 일정을 집계하거나 화면에 보여줄 때 주의할 점이 있어요.
2027-01-01을 그냥 날짜로 정렬하면 미정 건이 맨 뒤에 실제 일정처럼 섞여요.
그래서 이 날짜는 따로 "미정"으로 걸러서 표시하는 게 좋아요.
확인할 것: 파일 탐색기에서 schedule.csv를 엑셀로 열어 한글이 안 깨지는지, 2027-01-01 줄이 있는지.
GitHub는 코드와 문서를 올려 두고 여럿이 같이 고치는 서비스입니다. 저장소는 GitHub에 만드는 폴더입니다. 커밋은 "여기까지 고쳤다"를 이름 붙여 남기는 것이고, 푸시는 내 PC의 커밋을 GitHub 저장소로 올리는 것입니다. 게임의 세이브 포인트와 비슷합니다. 앞으로는 저장소, 커밋, 푸시로 부르겠습니다.
공유폴더에만 있으면
누가 무엇을 바꿨는지 모름
잘못 고친 것을 되돌릴 수 없음
저장소에 있으면
누가 언제 무엇을 고쳤는지 전부 남음
그래서 만들기 전에 저장소부터
4 · New repository
비공개 저장소를 만듭니다
오른쪽 위 + → New repository 이름 schedule-board 공개 범위 Private Add README 켜고 Create repository
이 폴더를 https://github.com/<내 아이디>/schedule-board 에 올려줘. 앞으로 단계 하나 끝날 때마다 커밋하고 올려줘. 브랜치는 만들지 말고 main에 바로 올려줘. 비밀번호나 키가 든 파일, 운영 데이터 파일은 올리지 마.
로그인 창처음 올릴 때 브라우저로 뜰 수 있음. 로그인하고 허용
이미 로그인창 없이 바로 올라감. 제 PC가 그랬습니다
4 · Answer
"올리지 마" 한 줄을 붙였더니 막는 목록부터 만들었습니다
이번에 올린 파일
* schedule.csv: 가짜 현장명·사람·example.com 메일로 만든 샘플이라 올렸어요.
* .gitignore: 올리면 안 되는 파일을 막아 둔 목록이에요.
.gitignore에서 제외하는 파일
* 비밀번호·키: .env, *.key, *.pem, (...)
* 운영 데이터: data/ 폴더 전체, *.real.csv, *_운영*.csv, *.xlsx
.gitignore저장소에 올리지 않을 파일 목록
실제 일정data/ 폴더에 두거나 ○○.real.csv로 지으면 올라가지 않음
엑셀(.xlsx)은 운영 자료일 가능성이 높다고 보고 전부 뺐습니다.
4 · Check
Private 표시와 파일 두 개를 봅니다
.gitignore · schedule.csv
올린 뒤의 저장소 페이지
4 · If
이런 말이 나오면
나온 말
할 것
커밋 작성자를 정했다
git 사용자 정보가 없어서 Claude가 GitHub 아이디와 익명 메일(…@users.noreply.github.com)로 정한 것. 회사 메일로 남기려면 "커밋 작성자 메일은 ○○로 해줘"
Settings에서 Private으로. 한 번 공개된 내용은 누가 받아 갔는지 알 수 없으니 처음부터 비공개로
5 · Collaborator
짝을 부르고, 누가 고쳤는지 봅니다
Collaborator와 커밋 기록이란
Collaborator는 비공개 저장소에 초대한 팀원입니다. 초대받은 사람만 저장소를 보고 고칠 수 있습니다. 커밋 기록은 저장소에 쌓인 커밋 목록으로, 누가 언제 어떤 파일을 바꿨는지 한 줄씩 남습니다.
회사각자 작업 공간(브랜치)을 따로 만들고, 검토를 거쳐 합칩니다
오늘짝과 둘이 연습이라 main에 바로 올립니다
5 · Invite
옆 사람과 둘씩 짝을 짓습니다
저장소 페이지 Settings → Collaborators → Add people에 짝의 GitHub 아이디. 짝은 메일이나 GitHub 알림으로 온 초대를 수락합니다.
5 · Partner edits
짝의 저장소를 받아 한 줄 고칩니다
https://github.com/<짝 아이디>/schedule-board 를 내려받아줘. 받은 schedule.csv에서 아무 일정 하나 예정일을 하루 늦추고, 브랜치 만들지 말고 main에 바로 커밋하고 올려줘.
어디서Code 탭 새 세션, 폴더는 Documents
웹으로도schedule.csv → 연필 버튼 → 한 칸 고치고 Commit changes. 제 짝은 이렇게 했습니다
5 · Commits
시계 모양 Commits에 두 사람 이름이 남았습니다
위는 짝(smilekyra3), 아래는 저(smilekyra)
커밋 기록
5 · Diff
커밋 하나를 누르면 바뀐 줄이 보입니다
20번째 줄11-03 → 11-04
솔마루 청년주택 점검 2차
공유폴더 엑셀로 같이 고칠 때는 누가 어느 칸을 바꿨는지 이렇게 볼 수 없었습니다.
5 · Pull
내 세션으로 돌아와 짝이 고친 것을 받습니다
깃허브에 올라온 거 받아줘. 누가 뭘 고쳤는지도 알려줘.
시각 (10/1)
작성자
변경 내용
22:16
smilekyra (○○○@○○○)
은가람 복합커뮤니티센터 · 평가 1차 · 담당 한지호: 10-21 → 10-22
22:34
smilekyra3 (○○○@○○○)
솔마루 청년주택 · 점검 2차 · 담당 정유나: 11-03 → 11-04
확인할 것: 내 PC의 schedule.csv에 짝이 늦춘 예정일이 들어왔는가.
5 · Watch out
웹에서 고친 커밋에는 개인 메일이 남을 수 있습니다
01
GitHub 오른쪽 위 프로필
02
Settings
03
Emails
04
Keep my email addresses private 켜기
위 답에서 Claude가 알려 준 것입니다. 비공개 저장소라 지금은 협업자만 보지만, 공개로 바꾸면 누구나 봅니다.
5 · Conflict
둘이 같은 줄을 고쳤다고 나와도 겁낼 일은 아닙니다
둘 중 어느 쪽을 남길지 보여줘
두 사람이 같은 줄을 따로 고쳐 올리면 Claude가 "충돌"이라고 알려 줍니다. 두 내용을 나란히 보여 주고, 고르면 합쳐서 다시 올립니다.
Part 03 · Watch, don't type
화면, 서버, 관리자 화면, 로그인을 왜 나누나
이 부는 따라 치지 않고 봅니다. 9월 29일에 빈 폴더에서 끝까지 만든 완성본을 열어 봅니다.
6 화면과 서버·7 관리자 화면·8 로그인과 권한
6 · Front / Back
프론트엔드는 홀, 백엔드는 주방
프론트엔드와 백엔드란
프론트엔드는 사람이 브라우저에서 보고 누르는 화면 부분입니다. 백엔드는 서버에서 자료를 저장하고, 비밀번호를 확인하고, API 키로 외부 서비스를 부르는 부분입니다. 자료는 DB에 쌓아 두는데, 식당의 냉장고·창고와 같습니다. 화면은 DB를 직접 열지 않고 백엔드에 요청해서 받습니다. 앞으로는 프론트엔드, 백엔드로 부르겠습니다.
프론트엔드 파일은 화면을 여는 사람 누구에게나 내려가고, 백엔드 파일은 서버 안에만 있습니다.
6 · README
일정판 완성본의 파일 구조
server.ts 서버 진입점, 라우트
src/db.ts sqlite 스키마 + CSV 최초 시딩
src/schedule.ts 일정 목록/추가/수정
src/auth.ts 공용 비밀번호 해시/토큰
src/notify.ts 알림 대상 계산(7일전/1일전, 중복 방지)
src/notificationFiles.ts 알림 내용 파일 생성
src/scheduler.ts 매일 8시 자동 실행
scripts/run-notifications-now.ts 8시 안 기다리고 바로 실행
public/ 화면(정적 HTML/CSS/JS)
관리자 화면은 이 서너 곳을 한 화면에서 같이 바꾸고, 저장 전에 합계가 100점인지 검사하는 곳입니다.
7 · Admin list
관리자 화면에서 바꿀 수 있어야 하는 것
번호
바꿀 수 있어야 하는 것
1-2
항목별·구간별 점수(일반·신혼·청년 따로), 구간 경계값. 표시 문구는 경계값으로 자동으로 만들어 판정식과 어긋날 수 없게
3-5
항목 사용 여부·신청유형별 적용, 가감점, 현장 확인 항목 지정
6-8
환산 규칙, 범주형 선택지, AI가 값을 읽을 때 쓰는 기준 문구
9
저장 전 검사: 유형별 만점 합계가 100인지, 구간이 겹치거나 빈 곳은 없는지
10
배점표 버전과 적용 시작일. 이미 심사한 신청서가 어느 배점표로 채점됐는지 남게
안 됨
새 채점 항목 추가. AI가 새 값을 읽어 와야 해서 코드 수정이 필요
10번이 있어야 작년 신청서의 점수가 왜 다른지 나중에 설명할 수 있습니다.
7 · Try · 2분
1년에 한두 번
내 도구의 기준값적어 보기
1년에 한두 번 바뀌는 기준값을 하나 찾아 적습니다. 지금은 그 값을 누가 어디서 고치고 있는지도 같이 적습니다.
8 · Login
누가 보고, 누가 고치나
로그인과 권한이란
로그인은 들어온 사람이 누구인지 확인하는 것이고, 권한은 그 사람이 무엇까지 할 수 있는지 정하는 것입니다. 같은 직원이라도 보기만 하는 사람, 고칠 수 있는 사람, 관리자 화면에 들어가는 사람으로 나눌 수 있습니다.
# 일정판 완성본 README.md
조회는 누구나 가능하고, 행 추가/수정/완료 체크는 비밀번호로 잠금 해제해야 된다.
## 범위 밖
- 로그인 계정별 권한, 변경 이력
8 · Shared password
부서 공용 비밀번호 하나로 잠금 해제
10명이 쓰는 일정표로는 충분합니다. 그런데 누가 고쳤는지는 남지 않습니다.
8 · Why accounts
한 사람이 그만두면 어떻게 되나
공용 비밀번호
비밀번호를 바꿔 나머지 9명에게 다시 알림
수정 기록에 이름 없음
직원 계정 로그인
그 사람만 막으면 됨
수정 기록에 이름이 남음
그림 2-1의 3단계에 로그인·권한이 들어간 이유입니다.
8 · Ask IT first
직원 계정 로그인은 IT팀과 같이 정합니다
회사 계정 시스템과 연결해야 하는 경우가 많아서, 도구를 만든 사람 혼자 정할 수 없습니다. 3단계로 갈 때 IT팀에 먼저 물을 것이 이것입니다.
Try 내 도구를 쓰는 사람을 "보기만", "고치기", "관리자"로 나눠 이름을 적어 봅니다.
Part 04 · Morning
점검·평가 일정판과 기한 알림
오전에는 schedule-board로 부서가 같이 쓰는 일정판을 만듭니다.
9 spec.md→10 tasks.json→11 브라우저 두 개→12 알림 메일
4부 · Same order
오전과 오후에 똑같이 가는 순서
01
연습 자료 만들기
02
spec.md에 누가 쓰는지, 어디에 두는지
03
만들게 하고 내 차례에 확인
04
팀이 쓰려면 더 필요한 것
9 · spec.md
지금 어떻게 쓰고, 앞으로 어떻게 쓰고 싶은지를 첫 문장에 넣습니다
이 일정으로 우리 부서가 같이 쓰는 점검·평가 일정판을 만들 거야. 지금은 각자 엑셀 고치고 html 파일 열어서 보는데, 앞으로는 서버 하나에 두고 누가 고치면 다 같이 보이게, 기한이 다가오면 담당자한테 메일이 가게 하고 싶어. spec.md 한 장으로 써줘. 궁금한 거 있으면 먼저 물어봐.
schedule-board 세션에서 칩니다. 바로 쓰지 않고 1일차 5장처럼 질문 카드 네 장을 띄웠습니다.
9 · Cards 1-2
서버는 사내망, 고치는 건 본인 건 + 관리자
① 서버를 어디에
사내망 서버 (추천과 같음)
② 누가 고칠 수 있나
담당자 본인 건 + 관리자
9 · Cards 3-4
D-7·D-1 오전 8시, 미정 건은 월 1회 확정 요청
③ 알림은 언제
D-7 · D-1 · 기타에 "오전 8시"
④ 미정 건 알림
월 1회 확정 요청 메일
④는 3절에서 Claude가 미정 표시 규칙을 이미 알고 있어서 나온 질문입니다.
9 · Answer
미정 표시 문제가 설계로 바뀌었습니다
제가 넣은 중요한 설계 하나: 일정판 안에서는 `2027-01-01`을 날짜로 저장하지 않아요.
"2026년 중 (미정)"으로 바꿔서 따로 관리해요. 날짜로 두면 정렬, D-day, 알림이
모두 실제 일정처럼 처리되기 때문이에요. 엑셀로 내보낼 때는 기존 양식대로
`2027-01-01`로 되돌려 쓸 수 있어요.
1분쯤 뒤 spec.md가 생겼고 GitHub에도 올라갔습니다. 4절에서 "단계마다 커밋하고 올려줘"라고 해 둔 덕분입니다.
9 · spec.md · 권한 · 미정
카드에서 고른 것과 부서 규칙이 문서로 들어갔습니다
| 역할 | 볼 수 있는 것 | 고칠 수 있는 것 |
| 담당자 (부서원) | 부서 전체 일정 | 본인이 담당자인 일정만 (예정일·차수·비고 수정, 완료 처리) |
| 관리자 (일정 총괄) | 부서 전체 일정 | 전체 일정 추가·수정·삭제, 담당자 변경, 사용자 관리 |
- 저장할 때: 예정일은 비우고 실시 연도 = 2026, 상태 = 예정으로 둔다.
- 화면 표시: 예정일 자리에 "2026년 중 (미정)"으로 보여 준다.
날짜순 정렬에서는 맨 뒤 "미정" 묶음으로 따로 모은다.
이제 다른 사람이 이어받아도 이 규칙이 빠지지 않습니다.
9 · spec.md · 알림
제가 말하지 않은 알림 규칙도 들어갔습니다
- 같은 날 한 사람에게 여러 건이 걸리면 메일 한 통에 묶어 보낸다.
- 같은 알림을 두 번 보내지 않는다. "일정·예정일·알림 종류" 조합으로 발송 기록을 남겨 확인한다.
- 예정일이 바뀌면 새 예정일 기준으로 다시 계산한다.
- 서버가 멈춰 8시 발송을 놓쳤으면, 다시 켜졌을 때 그날 보낼 것을 보낸다.
- 개발·시험 중에는 실제 메일 대신 파일·로그로만 남기는 "시험 모드"를 둔다.
사내 메일 서버를 아직 모르니 시험 모드부터 만듭니다. 12절에서 확인할 알림 파일이 이것입니다.
9 · Decisions
Claude가 혼자 정할 수 없는 것이 마지막 절에 모였습니다
번호
결정이 필요한 사항
누가
1
로그인 방식: 사내 통합인증(SSO/AD)을 쓸 수 있는가
IT팀
2
메일 발송 계정: 사내 SMTP 접속 정보와 보내는 사람 주소
IT팀
3
주말·공휴일 D-1: 직전 영업일(금요일)에 보낼지. 초안은 직전 영업일
부서
4-5
미정 표시의 연도 규칙, 관리자 참조
부서
6
서버 담당: 사내망 서버 마련과 운영(재시작·백업 확인)
IT팀
이 목록이 그대로 IT팀과 부서장에게 물어볼 목록이 됩니다.
9 · Watch out
추천만 고르면 3단계 기능까지 spec에 들어갑니다
로그인, 담당자별 권한, 사용자 관리, 변경 이력까지 들어옵니다. 실제로 쓸 것이면 맞는 방향이지만, IT팀 답이 있어야 만들 수 있는 것도 같이 들어옵니다. 그래서 만들기 전에 "이번에는 어디까지 만들지"를 한 번 정합니다.
Try "결정이 필요한 사항"을 내가 지금 답할 수 있는 것과 IT팀에 물을 것으로 나눠 봅니다.
10 · Scope
오늘 어디까지 만들지 정하고, 내 차례를 두 번 넣습니다
오늘은 연습이라 spec.md 8절 진행 단계 1-3까지만 만들 거야. 로그인은 IT팀 답이 없으니 임시로 이름 고르고 부서 공용 비밀번호 하나로 들어오게 해줘. 메일은 시험 모드로 파일만 만들어. 10절 3·4·5번은 초안대로 가. 교육실 PC에는 파이썬이 없으니까 bun으로 만들고, 옆 사람 PC에서도 들어올 수 있게 사내망 주소로 열어줘. spec.md에 이 내용 적고, 만드는 순서를 tasks.json으로 나눠줘. 화면 다 만든 다음 내가 브라우저 두 개로 확인하는 단계, 알림 파일 만든 다음 내가 확인하는 단계는 담당을 나로 해줘. 아직 만들지는 말고.
4번 전환(사내 서버 설치)은 오늘 못 합니다. 로그인은 IT팀 답이 없으니 임시 방식으로 둡니다.
10 · What happened
127.0.0.1
제 PC에서 bun · 사내망 조건 없이 먼저 쳤을 때한 번 더 말함
Claude가 제 PC에 있는 파이썬을 골랐고, 접속도 "이 PC 안(127.0.0.1)에서만"으로 잡았습니다. 교육실 PC에는 파이썬이 없고, 짝 PC에서 들어와 봐야 하니 둘 다 맞지 않습니다.
여러분은 앞 장처럼 처음부터 같이 칩니다.
10 · spec.md 11절
공용 비밀번호의 한계를 Claude가 스스로 적었습니다
- 로그인 화면에서 사용자 목록 중 자기 이름을 고르고, 부서 공용 비밀번호 하나를 넣으면 들어간다.
- 공용 비밀번호는 서버 설정 파일(`.env`)에 해시로만 둔다. 저장소에는 올리지 않는다.
- 한계: 비밀번호를 아는 사람은 남의 이름을 고를 수 있다. 그래서 권한 구분과 변경 이력은
본인 확인이 아니라 "고른 이름" 기준이다. 실제 운영 전에 §10-1로 바꾼다.
- 관리자: 샘플 데이터에서는 김하늘을 관리자로 둔다. 나머지는 담당자다.
- 메일: 실제로 보내지 않는다. 보낼 메일을 `outbox/` 폴더에 `.eml` 파일로 만든다.
10 · tasks.json
작업 16개, 그중 두 개가 내 차례
1. 보기 T01 프로젝트 뼈대 Claude
T02 DB 구조 Claude
T03 CSV 가져오기 (미정 변환 포함) Claude
T04 목록 화면 Claude
T05 달력 화면과 CSV 내보내기 Claude
2. 수정 T06 임시 로그인 Claude
T07 수정 화면과 권한 Claude
T08 변경 이력 Claude
T09 동시 편집 충돌 처리와 자동 새로 고침
T10 [확인] 브라우저 두 개로 화면·수정 확인 나
3. 알림 T11 영업일 계산과 공휴일 목록 ... T15 매일 오전 8시
T16 [확인] 알림 파일 확인 나
3부 그대로T02 DB, T04·T05 프론트엔드, T06·T07 로그인과 권한
done_whenT03: 가져오기 결과 '일정 30건, 미정 변환 5건, 사용자 6명'. 3절 샘플 숫자 그대로
10 · Go
1일차와 같은 말로 시작시킵니다
제 PC22분 · T09까지
좋아. tasks.json 순서대로 해줘. 단계 하나 끝날 때마다 status 바꾸고 log.md에 한 줄 남기고, main에 바로 커밋하고 올려줘. 내 차례가 오면 멈춰.
기다리는 동안 GitHub 저장소의 Commits를 열어 두면 커밋이 하나씩 쌓이는 것이 보입니다.
10 · Stopped at T10
멈출 때 이렇게 정리해 줬습니다
T01~T09를 모두 만들어서 GitHub에 올렸어요(마지막 커밋 b2f3639). 이제 직접 확인하실 T10 차례예요.
만든 것 (자동 테스트 72개 모두 통과)
- 로그인: 이름을 고르고 부서 공용 비밀번호를 넣는 방식이에요. 5번 연달아 틀리면 5분 동안 막혀요.
- 수정과 권한: 담당자는 본인 일정만, 관리자는 전체를 고칠 수 있어요. 화면뿐 아니라 서버에서도 막아요.
- 동시 편집: 남이 먼저 저장했으면 덮어쓰지 않아요.
- 자동 새로 고침: 열려 있는 화면은 10초마다 바뀐 게 있는지 확인해요.
만들면서 바뀐 점
- Bun이 .env 값 안의 $ 기호를 변수로 바꿔 버려서, 비밀번호 해시를 그대로 저장하면 깨졌어요.
그래서 해시를 base64로 바꿔 저장해요.
자동 테스트는 만든 것을 스스로 확인하는 검사입니다. 마지막 줄은 제가 시키지 않은 확인입니다.
10 · Password
비밀번호 하나만 PowerShell에서 직접 넣습니다
bun run set-password
왜대화창에 쓰면 대화 기록에 남아서. Claude도 직접 입력하라고 했습니다
여는 법파일 탐색기에서 Documents\schedule-board → 주소창에 powershell → Enter
입력연습용 비밀번호 두 번. 글자가 안 보이는 게 정상
10 · Server on
Code 탭으로 돌아와 서버를 켭니다
비밀번호 설정했어. 서버 켜줘. 옆 사람이 칠 주소도 알려줘.
허용 창"한 번만 허용"
방화벽Windows 창이 뜨면 "액세스 허용"
주소 두 개192.168.로 시작하는 쪽이 사내망 주소
내 PC 브라우저에서는 http://localhost:3000 을 엽니다.
10 · Login
이름을 고르고 공용 비밀번호
8절에서 본 "고른 이름 기준" 로그인입니다. 정유나를 고르고 들어갑니다.
10 · First screen
처음에는 "내 일정"만
기한이 지난 일정은 빨간색, 맨 아래에는 "2026년 중 (미정)" 묶음이 따로 있습니다. 3절 csv에서 2027-01-01이던 줄들입니다.
확인할 것: 요약 칸 "날짜 미정"에 숫자가 나오고, 목록 어디에도 2027-01-01이 안 보이는가.
10 · sqlite
자료는 폴더 안 파일 하나에 쌓입니다
sqlite란
폴더 안에 파일 하나(.db)로 들어가는 작은 데이터베이스입니다. 엑셀처럼 표 모양으로 자료를 쌓아 두는데, 여러 사람이 동시에 읽고 써도 깨지지 않게 해 줍니다. Bun에 들어 있어서 따로 설치할 것이 없습니다.
T03
schedule.csv를 한 번 읽어 넣음
그다음
이 파일만 씀
백업
.db 파일을 챙김
6절 그림 6-1의 냉장고·창고가 이것입니다.
11 · My turn · T10
두 사람이 동시에 쓰는 상황을 만듭니다
어디서
이름
A
내 PC 크롬
정유나 (담당자)
B
짝 PC(사내망 주소 http://192.168.…:3000) 또는 내 PC 엣지
김하늘 (관리자)
같은 크롬의 탭 두 개로는 안 됩니다. 로그인 정보를 같이 써서 한쪽이 김하늘이면 다른 탭도 김하늘이 됩니다.
11 · ①
A에서 고치면 B에 보이는가
새로 고침 없이10초 안
B 화면 · 솔마루 청년주택 점검 2차 11-04 → 11-05
B는 목록에서 "전체"를 눌러 두고, 아무것도 누르지 않고 기다립니다.
11 · ② ③
같은 일정인데, 들어온 사람에 따라 화면이 다릅니다
② 정유나(담당자)
"본인이 담당한 일정만 고칠 수 있습니다"
③ 김하늘(관리자)
현장명부터 담당자까지 전부 고침 · "+ 새 일정"
가온지구 A3블록 공동주택 점검 2차(김하늘 담당)를 양쪽에서 엽니다. 8절에서 말한 권한이 이것입니다.
11 · ④
동시에 고치면, 앞사람 비고가 사라지지 않습니다
B가 먼저 저장하자 A에 뜬 안내
B: "시공사 요청으로 오전 점검"
A가 그래도 저장하면
지금 저장된 값 · 내가 입력한 값
"내 입력으로 다시 저장"을 눌러야 덮어씁니다. 공유폴더 엑셀이었다면 나중에 저장한 사람 것만 남았을 것입니다.
11 · ⑤
변경 이력에 고른 이름으로 남는가
5절 커밋 기록이 코드를 고친 기록이라면, 이건 일정을 고친 기록
변경 이력
11 · ⑥
미정 건이 날짜처럼 섞이지 않는가
12월을 넘겨 봐도 1월 1일 칸은 비어 있습니다
달력 · 아래 "2026년 중 (날짜 미정)" 상자에 5건
11 · Report
여섯 가지를 봤으면 결과를 알려 줍니다
T10 확인했어. ①부터 ⑥까지 다 맞아. T11부터 이어서 해줘.
// 이상한 게 있으면 번호만 골라 본 그대로
③에서 담당자 변경이 안 보여. 고친 다음 다시 확인할게.
확인할 것: 여섯 가지 중 내 화면에서 다르게 나온 것이 있는가.
12 · Test mode
메일은 보내지 않고 파일로만 만듭니다
.eml과 시험 모드란
.eml은 메일 한 통을 파일 하나로 저장한 것입니다. Outlook으로 더블클릭하면 받은 메일처럼 열립니다. 시험 모드는 메일을 실제로 보내지 않고 보낼 메일을 이 파일로만 만들어 두는 방식입니다. 사내 메일 서버 정보가 없어도 누구에게 무엇이 가는지 미리 볼 수 있습니다.
"T11부터 이어서 해줘" 뒤 제 PC에서는 11분 만에 T15까지 끝내고 T16에서 멈췄습니다.
12 · Stopped at T16
확인할 메일 12통, 테스트 114개
- T11 영업일: 2026~2027년 공휴일과 대체공휴일 목록을 config/holidays.json에 넣었어요.
알림 날이 주말이나 공휴일이면 직전 영업일에 보내요.
- T12 D-7·D-1 기한 알림: 한 사람에게 같은 날 여러 건이 걸리면 한 통으로 묶어요.
"메일 기록" 화면을 추가했어요. 관리자는 전체, 담당자는 본인 메일만 봐요.
- T13 미정 확정 요청: 매월 1일 미정 건이 있는 사람에게만 한 통씩 보내요.
- T14 변경 안내: 담당자가 바뀌면 이전·새 담당자에게 보내요.
- T15 매일 오전 8시 자동 실행: 실제 서버로 시각을 1분 뒤로 맞춰 확인했어요.
서버를 다시 켜도 같은 메일이 또 생기지 않았어요.
아침 8시까지 기다릴 수 없으니 알림 시각을 1분 뒤로 당겨 서버를 실제로 켜 놓고 확인했습니다.
12 · Caught by test
10.09 → 10.08
10월 16일 일정의 D-7한글날
D-7은 10월 9일인데 그날이 한글날이라 10월 8일로 당겨져야 맞습니다. Claude가 처음 적은 예상에는 이게 빠져 있었고, 검사를 돌리면서 고쳤습니다.
12 · My turn · T16
확인할 것 여섯 가지와 볼 파일
#
확인할 것
볼 파일
①
받는 사람, 현장, 차수, 예정일(요일)이 맞는지
아무 파일
②
한 사람의 여러 건이 한 통으로 묶였는지
2026-11-03_기한알림_정유나
③
주말·공휴일 앞 일정이 직전 영업일에 나왔는지
10-02_최민재 · 10-08_이도윤 · 11-27_이도윤
④
미정·완료 건에 기한 메일이 없는지
10/5에 완료 처리한 다솜지구 점검 3차
⑤
11월 1일 미정 확정 요청 메일 내용
2026-11-01_미정확정요청_* 4통
⑥
문구가 부서에서 쓰기에 괜찮은지
전체 · 10-20_변경안내_정유나
12 · Show me
메일 파일은 Claude에게 보여 달라고 하면 빠릅니다
outbox/sample-check 메일 중에 정유나 11-03 묶음 메일, 이도윤 11-27 메일, 미정확정요청 하나, 정유나 10-20 변경안내를 메일 프로그램에서 보이는 모양으로 보여줘. 받는사람, 제목, 본문 그대로.
①-⑤는 맞았습니다. 10월 6일 일정의 D-1이 10월 2일(금)에 가는 것은 개천절·일요일·대체공휴일을 건너뛴 것이라 맞습니다.
12 · ⑥ Wording
문제는 ⑥ 문구였습니다
제목: [점검·평가 일정] 11/30(월) 새솔신도시 B7블록 공동주택 점검 3차 (D-1)
■ 바로 전 영업일 알림 (D-1)
- 2026-11-30(월) 새솔신도시 B7블록 공동주택 점검 3차 — 3일 뒤http://localhost:3000/schedules/29
하나제목은 D-1인데 본문은 "3일 뒤". 받는 사람이 헷갈림
둘링크가 localhost라 다른 PC에서는 안 열림
셋변경 안내 메일에만 "자동으로 보냈습니다" 줄이 없음
12 · Claude asked
Claude가 모른다고 한 것도 있었습니다
공휴일과 대체공휴일 날짜는 제가 알고 있는 지식으로 넣었고, 요일만 계산해서 맞는지 확인했어요.
정부 발표와 한 번 대조해 주세요. 특히 2026년 제헌절은 다시 공휴일이 되는지 제가 확실히
몰라서 목록에 넣지 않았어요.
물어본 것은 셋: 11월 1일이 일요일인데 그날 보낼지, 공휴일 목록이 맞는지, 실패한 변경 안내를 다시 보낼지. 찾아보니 제헌절은 2026년부터 다시 공휴일입니다.
12 · Fix + answer
고칠 것과 답을 한 번에 보냅니다
T16 확인했어. ①부터 ⑤까지 맞아. ⑥은 고칠 게 있어. 금요일에 가는 D-1 메일은 "3일 뒤" 말고 "다음 주 월요일"처럼 요일로 써줘. 변경 안내 메일에도 끝에 자동 발송 문구 넣어줘. 메일 본문에 ■ 네모 기호랑 — 긴 줄표는 쓰지 말고 다른 기호로 바꿔줘. 링크는 .env에 BASE_URL=http://<내 PC 사내망 주소>:3000 넣어서 사내망 주소로 나가게 해줘. 그리고 세 가지 답할게. 1일이 주말이나 공휴일이면 미정 확정 요청은 다음 영업일에 보내. 제헌절은 2026년부터 다시 공휴일이야. 7월 17일이고 주말이랑 겹치면 다음 평일이 대체공휴일이야. 공휴일 목록에 넣어줘. 실패한 변경 안내는 지금은 다시 안 보내도 돼. 고친 다음 테스트 돌리고 sample-outbox 다시 만들어서 올려줘.
12 · After
다시 만든 정유나 묶음 메일
받는 사람: 정유나 <yuna.jung@example.com>
제목: [점검·평가 일정] 다가오는 일정 2건 (D-7·D-1)
[일주일 전 알림 (D-7)]
- 2026-11-10(화) 다솜지구 행복주택 평가 3차 (다음 주 화요일)http://192.168.31.47:3000/schedules/26
[바로 전 영업일 알림 (D-1)]
- 2026-11-04(수) 솔마루 청년주택 점검 2차 (내일)
http://192.168.31.47:3000/schedules/19
이 메일은 점검·평가 일정판이 자동으로 보냈습니다. (2026-11-03 오전 8시 알림)
미정 확정 요청은 11월 2일(월)로 옮겨졌고, 공휴일 목록에 제헌절이 들어갔습니다. 검사는 120개로 늘었습니다.
12 · People check
AI가 모른다고 한 것은 사람이 확인합니다
모른다는 말을 넘기면 7월 17일 일정의 알림이 쉬는 날에 갑니다. 공휴일, 법령 개정, 회사 규정처럼 최근에 바뀌는 것은 AI가 아는 날짜가 늦을 수 있습니다. "확실히 모른다"는 말이 나오면 그 항목만 따로 찾아봅니다.
12 · Wrap up
끝났으면 서버를 새 코드로 다시 켭니다
T16 다 확인했어. 완료로 바꾸고 올려줘. 서버도 새 코드로 다시 켜줘.
알아 둘 것
Code 탭을 닫으면
서버도 꺼질 수 있음. 계속 켜 두려면 schedule-board 폴더에서 PowerShell을 열고 bun start
실제로 메일을 보내려면
사내 메일 서버 주소와 보내는 계정이 필요(spec.md 10절 2번, IT팀). 또는 GH가 이미 쓰는 RPA가 outbox 폴더 파일을 읽어 그룹웨어로 보내게
Claude"원본 페이지에 있는 그대로 옮겼어요. 20호가 두 구간에 다 들어가 있는데, 이것도 고치지 않았습니다."
맞는 판단기준을 바꾸는 일은 담당 부서가 정할 일
점수표나 체크리스트로 판단하는 일이면 내 업무 심사표로 해도 됩니다. 항목 이름과 배점만 옮겨 심사표.md로.
14 · Fake applications
신청서도 가짜로, 형식을 섞고 까다로운 것 두 건
제 PC3분 · 파일 3개
나는 GH 매입임대 담당이야. 서류심사표.md 보고, 이 표로 점수를 매길 수 있게 사업자 매입 신청서 가짜 3건 만들어줘. 하나는 워드, 하나는 엑셀, 하나는 PDF로. 한 건은 여러 필지를 묶어서 신청한 걸로, 한 건은 세대수 칸을 비워 줘. 주소랑 회사는 가짜로. 이 PC에는 파이썬이 없으니까 bun으로 해줘.
14 · Files
세 파일을 다시 열어 한글과 표까지 확인했다고 했습니다
파일
신청유형
특징
매입신청서_A_가온하우징.docx
청년
1필지, 모든 칸 기재
매입신청서_B_누리솔건설.xlsx
신혼
3필지를 묶어서 신청, 필지별 표 포함
매입신청서_C_새빛디앤씨.pdf
일반
총 세대수 칸 공란
실제로는 한글 파일로 많이 들어옵니다. .hwpx는 읽을 수 있고 옛 .hwp는 한글에서 .hwpx로 다시 저장합니다. 오늘은 워드가 한글 역할입니다.
14 · B · C
일부러 까다롭게 만든 두 건
B · 엑셀 · 3필지
용도지역이 다르고, 세 번째 필지는 도로(사도) 지분 60%
C · PDF · 총 세대수 공란
주택형별 표에는 48 · 30 · 12
확인할 것: C 신청서(PDF)의 총 세대수 칸이 정말 비어 있는지 열어 봅니다.
14 · Expected
예상 점수가 한 건에 둘씩 나온 곳이 있습니다
임대용이성
생활편의성
토지여건
가감점
합계
A (청년)
35
27
25
+10
97
B (신혼)
24
21
20 또는 17
−15
50 또는 47
C (일반)
35 또는 20
30
21
+5
91 또는 76
14 · Who decides
프로그램이 아니라 담당자가 정할 일
심사표만으로는 답이 하나로 정해지지 않는 부분이 있습니다. 판단 기준을 정해 두셔야 해요.
- B의 용도지역: 55-1번지는 3종(620㎡), 나머지 두 필지는 2종(495㎡)이에요.
면적이 더 넓은 3종을 기준으로 하면 10점, 낮은 쪽인 2종을 기준으로 하면 7점입니다.
- C의 세대수: 총 세대수는 비어 있지만 주택형별 표의 세대수를 더하면 90세대입니다.
이걸 인정하면 합계 91점, 인정하지 않고 0점으로 보면 합계 76점이에요.
이런 항목은 15절 spec.md에서 처음부터 담당자 확인으로 돌립니다.
15 · spec.md
첫 문장에 가장 중요한 조건을 넣습니다
이제 신청서 파일을 폴더에 넣으면 내용을 뽑아서 서류심사표대로 점수를 매기는 도구를 만들 거야. 신청서만 보고 정할 수 없는 건 억지로 점수 내지 말고 담당자가 확인하게 하고 싶어. spec.md 한 장으로 써줘. 궁금한 거 있으면 먼저 물어봐.
오전처럼 질문 카드 네 장이 떴습니다.
15 · Cards 1-2
양식은 제각각, 외부 AI는 연습이라 "가능"
① 어떤 양식으로 들어오나
사업자마다 제각각 → AI가 뜻을 읽어 뽑음
② 외부 AI로 보내도 되나
연습은 "가능" · 1일차 API 키
실제 신청서라면 ②번 카드가 가장 중요합니다. 외부 AI로 보내도 되는 자료인지는 부서가 정합니다. 20절에서 다시 봅니다.
15 · Cards 3-4
엑셀과 화면, 지도 검증은 다음 과제로
③ 결과를 어떤 형태로
엑셀 + 화면 · 기타 "뽑은 값마다 어느 문장에서 가져왔는지"
④ 입지 정보는
이번엔 기재값, 검증은 다음 단계
지도 API로 거리를 계산하는 것은 3위 앱이 지금 하는 일입니다. 오늘은 신청서에 적힌 값으로 채점합니다.
15 · Design
AI는 값만 뽑고, 점수는 코드가 매깁니다
- AI와 코드의 역할 분리: AI는 신청서에서 값과 근거 문장만 뽑고, 점수는 서류심사표를 옮긴 규칙대로
코드가 계산합니다. AI가 점수 구간을 판단하지 않아서 결과가 매번 같아요.
- 근거 문장 대조: AI가 내놓은 근거 문장이 신청서 원문에 실제로 있는지 코드가 확인합니다.
원문에 없으면 그 값은 자동으로 "확인 필요"가 됩니다.
- "해당 없음"과 빈칸 구분: 빈칸이나 아예 빠진 항목은 "확인 필요"로 넘깁니다.
- 계산 가능한 값은 제안만: 주택형별 세대수 합계 같은 값은 제안값으로만 보여 주고,
담당자가 승인해야 점수에 들어갑니다.
AI에게 점수까지 맡기면 같은 신청서를 두 번 넣었을 때 점수가 다르게 나올 수 있습니다.
15 · Needs review
"확인 필요로 넘기는 경우" 표
항목
경우
처리
가구수
20호
서류심사표 구간이 겹침 (20-49호 / 10-20호)
가구수
총 세대수 미기재, 주택형별 합계는 있음
합계를 제안값으로 표시
용도지역
필지마다 용도지역이 다름
필지별 면적 비율을 함께 표시
접면도로
도로가 둘 이상
방향별 너비 전부 표시
비선호 · 우대지역
신청서에 "해당"이라고 적혀 있음
판단 기준이 서류심사표에 없음. 담당자가 인정 목록을 등록
13절의 "20호 겹침"과 14절의 B·C 신청서가 전부 들어갔습니다.
15 · But
그런데 사도와 옹벽은 자동으로 확정합니다
| B 누리솔건설 (xlsx, 신혼, 3필지)
자동: 필지 3개 인식, 사도 지분 60% → −10, 옹벽 2.0m → −10
확인 필요: 용도지역, 접면도로(6m·4m), 우대지역
요청서"옹벽은 현장조사 하지 않고 확인하는 것이 불가능하다"
그러면사업자가 옹벽을 "없음"이라고 써 내면 감점 없이 통과합니다
토지 형상도 "사다리형"처럼 분류할 수 있는 말로 적혀 있으면 그대로 점수를 냅니다.
15 · Field items
현장을 봐야 아는 네 항목은 항상 담당자에게
토지 형상, 접면도로 너비, 사도, 옹벽·경사로는 신청서에 적혀 있어도 점수를 확정하지 말고 항상 담당자 확인으로 돌려줘. 신청서 값은 참고로만 보여 줘. 현장이나 지도를 봐야 아는 거야. 옛날 hwp는 한글에서 hwpx로 다시 저장해서 넣을게. 옆 사람 PC에서도 들어올 수 있게 사내망 주소로 열어줘. spec.md 고치고, 만드는 순서를 tasks.json으로 나눠줘. 점수 나온 다음 내가 신청서 원본이랑 대조하는 단계는 담당을 나로 해줘. 아직 만들지는 말고.
오전에 배운 조건(사내망 주소, 내 차례)을 같이 붙입니다.
15 · Principle 4
"해당 없음이라고 적혀 있어도"는 Claude가 더 넣었습니다
4. 현장·지도로 봐야 아는 항목은 항상 담당자가 정한다. 토지 형상, 접면도로 너비, 사도,
옹벽·경사로는 신청서 값을 참고값으로만 보여 주고, 자동으로 점수를 내지 않는다.
신청서에 "해당 없음"이라고 적혀 있어도 마찬가지다.
A
예상 확정 점수
82
97에서
B
예상 확정 점수
45
50 또는 47에서
C
예상 확정 점수
70
나머지는 담당자가 정해야 나옴
15 · Network
사내망으로 열면서 Claude가 하나를 덧붙였습니다
사내망 주소로 열면 허용한 IP 대역 안에서는 누구나 신청서 내용(대표자 이름·연락처 포함)을
볼 수 있습니다. 그래서 허용 대역은 교육실 PC가 있는 대역 정도로 좁게 잡는 걸 권해요.
15 · tasks.json
15단계 중 넷이 사람 몫
T01 프로젝트 뼈대 claude
T02 API 키 넣기 requester
T03 채점 규칙 파일 claude
T04 문서 텍스트·표 추출 claude
T05 hwpx 샘플 준비 requester
T06 AI 추출과 근거 대조 claude
T07 채점 엔진 claude
T08 저장소와 수정 이력 claude
T09 사내망 웹 서버 claude
T10 방화벽 포트 열기 it
T11 웹 화면 · T12 엑셀 결과표 · T13 인수 테스트
T14 신청서 원본 대조 requester
T15 대조 결과 반영 claude
T037절에서 본 심사표 규칙을 코드로
T10 · it방화벽은 보안 설정이라 Claude가 직접 바꾸지 않겠다고 함
T1417절에서 할 내 차례
15 · Write it down
AI가 정할 수 없는 것은 처음부터 사람에게 넘기게 적습니다
Claude는 "신청서에 적힌 값이 분명하면 자동"으로 설계합니다. 프로그램으로서는 맞는 판단입니다. 하지만 사업자가 적은 옹벽 높이와 도로 너비를 그대로 믿으면 오류 없이 그럴듯한 합계가 나와서 더 위험합니다. 항목 이름을 적어 "점수 확정하지 말 것"으로 정해 둡니다.
16 · Go
사람 몫 두 가지를 정리하고 시작합니다
T05는 네가 hwpx 가짜 신청서를 직접 만들어서 해. 옛 hwp 시험은 빼. T10은 오전에 bun 방화벽을 이미 허용했으니까 서버 켤 때 옆 PC에서 들어와지는지만 확인해 줘. 좋아. tasks.json 순서대로 해줘. 단계 하나 끝날 때마다 status 바꾸고 log.md에 한 줄 남겨. 내 차례가 오면 멈춰.
.hwpx는 속이 글자로 된 파일이라 Claude가 직접 만들 수 있습니다. 방화벽은 같은 프로그램이라 따로 열지 않아도 될 가능성이 큽니다.
16 · Stopped at T02
키 없이 할 수 있는 것부터 먼저 끝냈습니다
단계
상태
내용
T03 채점 규칙
완료
서류심사표를 rules.ts로. 점수 구간 경계값마다 테스트, 76개 모두 통과
T04 텍스트·표 추출
완료
docx·xlsx·pdf·hwpx 네 형식에서 칸 구분과 위치(쪽·줄, 표·행)까지
T05 hwpx 가짜 신청서
완료
매입신청서_D_다온주택.hwpx. 1.0km·500m 같은 경계값을 일부러 넣음
T06 AI 추출
멈춤
여기부터는 키가 있어야 함
T04 중에는 "엑셀은 빈 칸을 건너뛰어 열 위치가 사라지고, PDF는 칸 구분이 안 잡힙니다. 둘 다 고칠게요"라는 줄도 있었습니다.
16 · .env
키는 대화창에 붙이지 않습니다
.env란
API 키나 비밀번호처럼 남에게 보이면 안 되는 값을 적어 두는 파일입니다. 1일차 11장에서 썼습니다. 백엔드가 이 파일을 읽어서 쓰고, 프론트엔드로는 내려가지 않습니다. GitHub에 올리지 않도록 .gitignore에 넣어 둡니다.
scorer 폴더에 .env 만들어서 메모장으로 열어줘. 키는 내가 넣을게.
Claude가 알려 준 cp 명령은 Mac 모양이라 Windows에서는 그대로 안 됩니다. Claude에게 시킵니다.
16 · Notepad
저장한 뒤 파일 이름을 꼭 봅니다
ANTHROPIC_API_KEY= 뒤에 sk-ant- 키를 붙이고 저장. 그림의 제목이 .env.txt입니다. 메모장이 끝에 .txt를 붙였습니다. 이러면 프로그램은 키가 없다고 멈춥니다.
"다른 이름으로 저장"에서 파일 형식을 "모든 파일(*.*)"로 바꾸면 .txt가 안 붙습니다.
16 · Check name
이름만 확인시키고, 내용은 열지 않게
scorer 폴더에 .env 파일이 있는지 봐줘. .env.txt로 저장됐으면 이름만 .env로 바꿔줘. 내용은 열지 마.
.env에 키 넣었어. T06부터 이어서 해줘.
확인할 것: scorer 폴더에 .env가 있고 .env.txt는 없는가.
17 · On the way
T13까지 가는 동안 있었던 일
스키마가 너무 커서 API가 거절했으니(compiled grammar too large), AI는 값을 적힌 그대로만 옮기고
숫자 변환·단위 환산은 코드가 처리하도록 스키마를 단순화할게요.
(...)
C에서 1건 실패를 발견했습니다. PDF 표의 한 칸이 두 줄로 나뉘면서 AI가 첫 줄만 근거로 삼은 경우예요.
PDF에서만 다음 줄까지 근거로 인정하도록 수정하겠습니다.
(...)
인수 기준 28개가 모두 통과했고, AI를 재호출해 다시 추출해도 네 건 모두 동일한 점수가 나왔습니다.
둘째 줄은 15절의 "근거 문장 대조"가 실제로 쓰인 경우, 마지막 줄은 점수를 코드가 매기기 때문에 가능한 확인입니다.
17 · Cost
AI 비용은 한 번만 듭니다
Time
신청서 1건
20-26초
내용을 읽어 값과 근거를 뽑는 시간
Cost
신청서 1건
$0.08
결과는 data/ 폴더에 저장
Again
다시 넣거나 점수를 고쳐도
0회
AI를 다시 부르지 않음. 100건이면 8달러 정도
17 · My turn · T14
네 건이 "검토 전"으로
사내망 주소의 8080번(http://<내 PC 사내망 주소>:8080)을 엽니다. 확정 점수 옆 "확인 필요" 개수와 "가능 범위"는, 담당자가 어떻게 정하느냐에 따라 점수가 이 범위 안에서 정해진다는 뜻입니다.
D는 16절에서 Claude가 만든 hwpx 신청서입니다. 처음 들어가면 수정 이력에 남길 이름을 묻습니다.
17 · Three checks
원본과 대조할 것은 세 가지
01자동 점수의 근거가 원본에 정말 있는가. B 가구수 10점 근거 "총 세대수 | 38세대", 위치 "시트 신청서 · 18행" → 엑셀 18행 확인. "원문"을 누르면 그 줄이 강조됨
02현장을 봐야 아는 네 항목이 입력 칸으로 나왔는가
03빈 칸을 멋대로 채우지 않았는가
17 · ② B 토지여건
노란 "확인 필요", 기준 필지를 고르면 점수가 바뀝니다
고르기 전
신청서 값(참고) · 무엇을 보고 정할지 안내
별내미동 55-1(제3종, 55.6%) 고른 뒤
확정 45 → 55 · 확인 필요 6 → 5 · 검토 중
17 · ③ C 세대수
누르기 전에는 점수가 없습니다
총 세대수는 "(미기재)". 아래에 "주택형별 합계 90세대로 채움"과 "채우지 않음" 버튼이 따로 있습니다. 15절의 "계산할 수 있는 값은 제안만"이 이것입니다.
17 · Excel
화면에서 한 일이 엑셀에 그대로 들어갔습니다
토지여건 | 토지의 형상 | 확인 필요 | 신청서 값(참고): 사다리형 → 사다리형 (노란색)
토지여건 | 용도지역 | 10 | 담당자가 고른 기준 필지 별내미동 55-1 (파란색)
토지여건 | 접면도로 너비 | 확인 필요 | 신청서 값(참고): 남측 6m, 동측 4m (노란색)
위쪽 "엑셀 심사 결과표"를 눌러 내려받습니다. 요약 시트에 네 건이 한 줄씩, 신청서마다 상세 시트가 있습니다.
17 · Report
대조 결과를 알려 줍니다
T14 대조했어. 자동 점수 몇 개를 신청서 원본이랑 맞춰 봤는데 값이랑 근거가 다 맞아. 현장 확인 네 항목은 전부 확인 필요로 나왔고, C 세대수도 제안값으로만 나와. 고칠 건 없어. T15는 할 게 없으면 완료로 바꿔줘.
// 틀린 곳이 있으면 무엇이 어떻게 다른지 그대로
B 버스 노선이 5개로 나왔는데 원본은 6개야
확인할 것: 내려받은 엑셀에서 확인 필요 칸이 노란색이고, 내가 정한 칸이 파란색인가.
Part 05 · Before release
올리기 전에 위험 신호 보기
보안 점검을 받고, 키와 개인정보와 "0개"라는 결과를 한 번 더 봅니다.
18 보안 점검·19 키·20 개인정보·21 "0개"
18 · Security check
고치게 하기 전에 목록부터 봅니다
보안 점검이란
만든 도구를 다른 사람이 쓰기 전에, 비밀번호·키·개인정보가 새는 곳이 없는지 한 번 훑는 일입니다. 오늘은 Claude에게 먼저 점검을 받고, 고칠 것과 회사가 정할 것을 나눕니다. 품질관제실 요청서 ③번입니다.
이걸 부서 서버에 올린다고 치고 보안 점검해줘. 고칠 것만 급한 순서로 알려주고, 아직 고치지는 마.
schedule-board 세션에서 칩니다.
18 · Ten items
열 가지가 급한 순서로 나왔습니다
의심되는 두 가지는 켜 둔 서버에 실제로 요청을 보내 재현해 봤습니다
1
누구나 관리자로 들어올 수 있어요 (가장 급함)
6
공용 비밀번호를 바꿔도 이미 로그인한 사람은 그대로 남아요
2
오류가 나면 서버 내부 정보가 화면에 그대로 나와요 (재현함)
7
CSV를 엑셀로 열 때 수식이 실행될 수 있어요
3
로그인 링크로 외부 사이트에 보낼 수 있어요 (재현함)
8
브라우저 보호 설정이 없어요
4
암호화되지 않은 http라서 비밀번호와 로그인 상태가 그대로 보여요
9
열어 두는 범위가 너무 넓어요
5
비밀번호를 계속 맞춰 보는 공격을 막는 장치가 약해요
10
개인정보 파일 관리 규칙이 없어요
18 · No.1
1번은 8절에서 말한 공용 비밀번호의 한계 그대로
공용 비밀번호를 아는 사람은 로그인 화면에서 아무 이름이나 고를 수 있어요.
김하늘을 고르면 관리자가 돼요. (...) 게다가 로그인 화면이 로그인 전부터
부서원 이름 전체와 관리자가 누구인지 보여 줘요.
→ 사람마다 따로 인증해야 해요(spec §10-1의 사내 통합인증, 안 되면 사내 메일로 보내는
일회용 로그인 링크). 그 전까지 서버에 올리지 않는 게 맞아요.
연습용으로 정한 임시 로그인이 실제로 쓰기에는 가장 큰 구멍입니다. 코드로 고칠 일이 아니라 IT팀 답이 있어야 합니다.
18 · No.7
엑셀을 많이 쓰는 부서라면 실제로 생길 문제
현장명이나 비고가 =, +, -, @로 시작하면 엑셀이 수식으로 처리해요.
담당자 누구나 비고를 쓸 수 있고, 엑셀을 많이 쓰는 부서라 실제로 일어날 수 있는 문제예요.
18 · OK
문제없다고 본 것도 이유와 함께 적었습니다
- DB 조회는 모두 값을 따로 넘기는 방식이라 SQL 조작이 안 돼요.
- 화면 출력은 모두 특수문자를 바꿔 넣어서, 현장명에 스크립트를 넣어도 실행되지 않아요(테스트 있음).
- 권한 검사는 서버에서 해요. 담당자가 화면을 거치지 않고 직접 요청을 보내도 막혀요(테스트 있음).
마지막 줄은 11절 ②에서 화면으로 본 것을 서버 쪽에서도 확인했다는 뜻입니다.
18 · Sort
열 가지는 세 종류로 나뉩니다
Now
지금 코드로 고칠 것
2 · 3 · 7 · 8
각각 작고 독립적이라 바로 고칠 수 있음
IT
회사가 정해야 할 것
1 · 4
IT팀 답, 서버 구성(인증서나 프록시)이 필요
Later
서버를 옮길 때 할 것
5 · 6 · 9 · 10
부서 서버로 옮길 때 체크리스트로
18 · Fix
고친 다음 다시 해 보라는 말을 붙입니다
2, 3, 7, 8번 지금 고쳐줘. 1번이랑 4번은 IT팀 답 받고 할 거니까 spec.md 10절에 적어 둬. 5, 6, 9, 10번은 부서 서버로 옮길 때 할 일로 README에 적어 둬. 고친 다음엔 아까처럼 실제로 다시 해 보고 막히는지 확인해서 알려줘.
18 · Answer
고친 뒤 같은 방법으로 다시 해 봤고, 네 가지 모두 막혔습니다
2·3·7·8번을 고쳐서 GitHub에 올렸어요(0b8b073). 테스트는 130개 모두 통과해요.
2. 오류 화면: 이제는 "처리 중 문제가 생겼습니다. 잠시 후 다시 시도해 주세요."만 나와요.
3. 외부 사이트로 보내기: 돌아갈 주소에 탭, 줄바꿈, 역슬래시를 끼워 봤어요. 세 경우 모두 첫 화면(/)으로만 갔어요.
7. CSV 수식: 현장명이 =HYPERLINK("http://evil.example","클릭"), +1+1, @SUM(1), -2+3인 일정을
만들고 CSV로 내보냈어요. 모두 앞에 '가 붙어 엑셀에서 글자로 보여요.
8. 브라우저 보호 헤더: 이런 헤더 때문에 화면 기능이 멈출 수 있어서 실제 브라우저로도 확인했어요.
=HYPERLINK(...)는 엑셀에서 누르면 다른 사이트로 가는 칸을 만드는 수식입니다.
18 · One more line
"실제로 다시 해 보고 막히는지 확인해서 알려줘"
이 문장을 붙여야 "고쳤습니다"로 끝내지 않고 재현까지 다시 합니다. 1·4번은 spec.md 10절에 "IT팀 답변 대기, 끝나기 전에는 부서 서버에 올리지 않음"으로, 5·6·9·10번은 README의 "부서 서버로 옮길 때 할 일"로 파일에 남았습니다.
18 · Watch out
사내망이라 괜찮다는 것 하나에만 기대지 마세요
1번과 4번은 "같은 망에 있는 사람은 믿는다"는 전제에서 나온 구멍입니다. 서버 설정 하나가 잘못되거나 퇴직자가 비밀번호를 알고 있으면 실명과 메일이 밖으로 나갑니다. 올리기 전에 한 번, 고친 뒤에 한 번 점검을 받습니다.
Try 열 가지를 세 종류로 나눴을 때, 내 도구라면 어느 쪽이 가장 많을까요.
19 · API key
품질관제실 파일 맨 앞쪽의 한 줄
API 키란
지도, 날씨, AI 같은 외부 서비스를 쓸 때 "이 요청은 우리 계정에서 온 것"이라고 알려 주는 비밀 문자열입니다. 남이 가져가면 우리 계정으로 요금이 나가거나 사용 한도가 바닥납니다.
// 브라우저가 직접 호출하는 서비스의 키. 배포본에 실린다.
window.GH_KEYS = {"VWORLD_KEY": "", "OWM_KEY": "", "GEMINI_KEY": ""};
미리보기 파일이라 비어 있지만, 실제 파일에는 지도(VWorld), 날씨(OpenWeatherMap), AI(Gemini) 키가 들어갑니다.
19 · Where the key lives
같은 키라도 어디에 두느냐가 다릅니다
품질관제실
키가 프론트엔드 파일 안에
화면을 여는 사람 누구에게나 내려감
서버에 올려 더 많은 사람이 열면 키도 같이 나감
16절 심사 도구
키는 .env에
백엔드에서만 읽음
프론트엔드 파일에는 키가 없음
공유폴더 안에서 부서원만 열 때는 괜찮았습니다.
19 · Search
키 값으로 폴더 전체와 서버 응답까지 찾았습니다
.env에 키 넣었어. 내 프론트엔드 파일에 키나 비밀번호가 들어 있는 곳이 있는지 찾아줘. 고치지는 말고.
프론트엔드 파일 ui.html에 키나 비밀번호가 들어 있는 곳은 없어요.
- ui.html 검색: sk-ant, api_key, secret, password·비밀번호, token 같은 말로 찾아봤는데 하나도 나오지 않았습니다.
- 키 값 자체: .env에 넣으신 키 값으로 프로젝트 전체를 찾아봤어요.
- 서버 응답: 켜져 있는 서버의 첫 화면, 목록, 신청서 상세 응답에도 키가 들어 있지 않았습니다.
maeip-review 세션에서 칩니다.
19 · First try failed
답 맨 앞에 이런 줄이 있었습니다
첫 번째 검사가 grep 옵션 문제로 실제로는 돌지 않았어요. 다른 방법으로 다시 확인합니다.
검사가 돌지 않았는데 "없음"으로 끝냈다면 키가 있어도 모르고 지나갔을 것입니다. "없다"는 답을 받으면 어떻게 찾았는지를 한 번 더 봅니다.
19 · Try · 3분
Ctrl + F
내 도구 파일을 메모장으로 열고KEY · key · password
값이 적혀 있는 줄이 있으면 적어 둡니다.
20 · Public cloud
비밀번호를 걸어도 자료는 회사 밖 서버에 있습니다
공개 클라우드란
streamlit.app, Netlify, Vercel처럼 인터넷 주소를 바로 만들어 주는 서비스입니다. 1일차 10장의 Netlify Drop도 여기 들어갑니다. 편하지만 회사 밖 서버에 파일과 자료가 올라갑니다.
1일차 현황판 (Netlify)
신청자·담당자 정보가 들어가는 도구
담긴 자료
공개된 법령 정보만
이름, 주소, 전화번호, 메일
공개 클라우드
괜찮음
비밀번호를 걸어도 자료는 회사 밖 서버에. 비밀번호를 메일·문서로 돌리면 건 의미도 줄어듦
20 · Claude API
오늘 심사 도구도 신청서를 외부 AI로 보냅니다
// maeip-review spec.md 맨 아래 유의사항
신청서 원문(대표자 이름, 연락처 포함)이 Claude API로 전송된다.
운영 전에 내부 정보보안 기준에 맞는지 확인이 필요하다.
15절둘째 카드에서 연습이라 "가능"을 골랐고, Claude가 잊지 않고 적어 둠
17절사내망 주소도 같은 대역 안에서는 누구나 신청서 화면을 엶. 허용 대역을 좁게
Try내 도구의 개인정보 칸을 전부 적고, 지금 어느 서버(내 PC, 공유폴더, 구글, 공개 클라우드)에 있는지 옆에
20 · Rule
실제 개인정보는 공개 클라우드에 올리지 마세요
연습은 오늘처럼 가짜 자료로 합니다. 실제 신청서와 개인정보는 사내 서버로 옮긴 다음에 넣습니다. 이미 올라가 있다면 내리고, 부서 보안 담당에게 알립니다.
21 · Lookup failed
10월 1일, 3위 앱에서 같은 버스 조회를 두 주소로
조회 실패란
외부 서비스(공공데이터 API 등)에 물었는데 답을 못 받은 경우입니다. 프로그램이 이걸 "결과 없음"과 구분하지 않으면 화면에는 그냥 0이 찍힙니다.
주소 (반경 500m 안 버스 정류장)
결과
부천시 오정구 원종동
정류장 21개, 노선 17개
화성시 남양읍 남양리 (화성시청에서 500m 안)
정류장 0개, 노선 0개
21 · Zero
0개
시청 바로 옆에 버스 정류장이 하나도 없을 리는 없습니다오류 표시 없음
담당자는 버스가 없는 땅으로 읽고 버스 점수를 최하로 줄 수 있습니다. 틀린 점수가 아무 표시 없이 합계에 들어가서, 오류가 난 것보다 더 위험합니다.
21 · Make it fail
오늘 만든 도구에서 일부러 실패하게 해 봅니다
신청서에서 값을 못 뽑거나 API 호출이 실패하면 점수가 0으로 들어가는지, 확인 필요로 빠지는지 확인해줘. 실제로 하나 실패하게 해 보고 화면에 어떻게 나오는지 알려줘. 고치지는 마.
결론부터 말하면, 두 경우 모두 점수가 0으로 들어가지 않았어요.
1. API 호출이 실패할 때 (일부러 틀린 키로 서버를 켬)
- 점수: 아예 채점되지 않았어요. 파일은 inbox에 그대로 남았어요.
- 화면: 목록 아래 "처리하지 못한 파일" 표에 파일 이름과 사유가 나왔습니다.
- 사유 문구: API 오류 원문이 그대로 나옵니다. (...) 담당자가 읽기에는 어려워요.
- 실패 목록: 서버 메모리에만 있어서, 서버를 다시 켜면 사라집니다.
21 · Missing values
값을 비운 시험용 신청서는 "확인 필요"와 이유가 붙었습니다
목록 맨 아래 시험용 신청서
가능 범위 "34 ~ 120"
값이 빠진 칸
"인근 공실률 미기재" · "지하철역 정보 미기재"
0점이 자동으로 들어가는 것은 신청서에 "해당 없음"이라고 적혀 있을 때뿐이었습니다.
21 · Still look
그래도 사람이 봐야 할 것이 남았습니다
01API 실패 사유가 영어 오류 원문이라 담당자가 읽기 어려움
02실패 목록이 서버를 다시 켜면 사라짐
03가능 범위 "34 ~ 120". 100점 만점에 가점 최대 15점이라 실제로는 나올 수 없는 점수. 검사를 통과해도 화면을 사람이 보면 이상한 것을 알 수 있습니다
확인할 것: 내 도구에서 외부 자료를 가져오는 칸 하나가 못 가져왔을 때 화면에 무엇이 나오는지 적어 봅니다.
Wrap up
내 도구는 어디까지 왔나
두 폴더를 가져가고, 확인표를 채웁니다.
Take home
두 폴더를 가져갑니다
Morning
schedule-board
일정판
팀이 같이 고치는 일정판, 기한 알림 파일, 보안 점검까지. GitHub 저장소에도 있습니다
Afternoon
maeip-review
심사 도구
신청서를 읽어 점수를 매기고, 담당자가 볼 항목을 나눠 주는 도구
Checklist
내 도구 다음 단계 확인표
"하려면 누가"에 나 · 부서 · IT팀 · 외부
구분
확인할 것
단계
지금
하려면 누가
소스 관리
코드가 GitHub 비공개 저장소에 있고, 누가 언제 고쳤는지 남는다
2
자료
원본 자료가 한 곳에 있고, 여럿이 동시에 고쳐도 덮어쓰지 않는다
2
알림
도구를 안 열어도 담당자에게 기한 알림이 간다
2
보안 점검
올리기 전에 보안 점검을 받았다
2
프론트엔드와 백엔드
화면과 서버가 나뉘어 있고, API 키는 백엔드에만 있다
3
관리자 화면
기준값·담당자·사용자를 코드를 고치지 않고 바꿀 수 있다
3
로그인·권한
직원 계정으로 들어오고, 보기만 하는 사람과 고치는 사람이 나뉜다
3
배포
사내 서버 주소(HTTPS)로 열린다
3
개인정보
개인정보와 내부 자료가 외부 서비스에 없다
3
오류 표시
외부 자료를 못 가져오면 0이 아니라 "조회 실패"로 보인다
3
이어받기
만든 사람이 없어도 spec.md와 README로 다른 사람이 이어서 고칠 수 있다
3
Checklist · Where
확인표는 처음부터 생각하지 않고, 세 곳에서 옮깁니다
파일
적혀 있는 것
schedule-board · spec.md 10절
IT팀 답을 기다리는 것: 직원 계정 로그인, 메일 발송 계정, HTTPS
schedule-board · README.md
"부서 서버로 옮길 때 할 일": 18절 보안 점검에서 나온 나중 할 일
maeip-review · spec.md 맨 아래
신청서를 외부 AI로 보내도 되는지 확인하라는 유의사항
2단계 줄은 오늘 해 본 순서 그대로입니다. "하려면 누가"에 IT팀이나 외부가 적힌 줄이 다음에 회사와 이야기할 것입니다. 1절의 두 과제는 만드신 분과 같이 채웁니다.
Next
내 업무에 옮길 때는 이 문장으로 시작합니다
spec.md랑 tasks.json 읽어봐. 이걸 내 업무에 맞게 바꾸고 싶어. 나는 <부서>에서 <하는 일>을 해. 무엇을 바꿔야 하는지 먼저 물어봐.