Activity Log
위키 작업(ingest, query, lint)의 시간순 기록.
[2026-04-11] init | Wiki Initialized
Wiki structure created with Dendron hierarchy + MOC index pattern. Schema defined in CLAUDE.md.
[2026-04-15] scaffold | claude-code domain created
claude-code 도메인 골격 생성. 학습 소스로 WikiDocs 와 공식 한국어 문서 를 사용 예정.
생성된 파일:
sources/claude-code/README.md— 학습 소스 카탈로그content/claude-code/index.md— 도메인 MOC (계획된 토픽 목록 포함)content/claude-code/_meta.js— 사이드바 설정
업데이트된 파일:
content/index.md— claude-code 도메인 등록content/_meta.js— 최상위 사이드바에 claude-code 추가
[2026-04-15] ingest | WikiDocs 기초 4개 챕터
WikiDocs/공식문서의 기초 4개 영역(대화와 세션 / 자율권과 안전 / 컨텍스트 관리 / CLAUDE.md 잘 쓰는 방법)을 학습. 그대로 옮기지 않고 핵심만 추려 7개 토픽 페이지 + 1개 소스 요약으로 분해.
생성된 페이지:
claude-code/sessions.md— 세션 시작/이어하기/체크포인트/보관기간claude-code/cli-essentials.md—@,/, 멀티라인 입력claude-code/permission-modes.md— 6개 권한 모드 (Auto는 Team/Enterprise/API 한정)claude-code/plan-mode.md— 실행 전 계획 워크플로우claude-code/permission-rules.md—/permissions+ deny 1차 방어선 + defense-in-depthclaude-code/context-management.md—/clear//compact//context+ 자동압축 환경변수claude-code/claude-md-best-practices.md— 추론 불가능한 것만, 200줄 룰,@임포트claude-code/src-wikidocs-foundations.md— 소스 요약 + 다음 학습 우선순위
업데이트된 파일:
claude-code/index.md— Topics를 학습완료/예정으로 재구성, Sources 섹션 추가claude-code/_meta.js— 사이드바에 8개 항목 추가 (학습 흐름 순서로 정렬)
다음 학습 우선순위: hooks → sandbox → skills → subagents → MCP.
[2026-04-15] ingest | Claude Skills 구축 완벽 가이드
Anthropic 공식 “The Complete Guide to Building Skills for Claude”를 학습. 스킬의 개념/설계 원칙/파일 구조/프론트매터/사용 사례 3대 카테고리/성공 기준/명령어 작성법/테스트 방법론/배포 모델/API/워크플로 패턴 5가지/트러블슈팅을 5개 토픽 페이지 + 1개 소스 요약으로 분해.
생성된 페이지:
claude-code/skills-overview.md— 스킬 개념, 설계 원칙(점진적 공개/조합성/이식성), 파일 구조, 프론트매터, MCP 관계claude-code/skills-development.md— 사용 사례 정의, 3대 카테고리(문서생성/워크플로자동화/MCP강화), 성공 기준, 명령어 작성법claude-code/skills-testing.md— 트리거/기능/성능 테스트, skill-creator 사용법, 피드백 기반 반복claude-code/skills-deployment.md— 배포 모델(개인/조직), 오픈 표준, API, 포지셔닝claude-code/skills-patterns.md— 5가지 워크플로 패턴, 트러블슈팅, 빠른 체크리스트claude-code/src-skills-building-guide.md— 소스 요약, 핵심 인사이트 7개
업데이트된 파일:
claude-code/index.md— “스킬” 섹션 추가, skills를 학습 예정에서 제거, Sources에 소스 추가claude-code/_meta.js— 사이드바에 6개 항목 추가
다음 학습 우선순위: hooks → sandbox → subagents → MCP.
[2026-04-15] refactor | Skills 페이지를 하위 카테고리로 재구성
기존 claude-code/skills-*.md 6개 플랫 파일을 claude-code/skills-building-guide/ 하위 섹션으로 재구성. 하나의 소스(Anthropic 공식 가이드 PDF)에서 나온 내용을 응집된 서브 카테고리로 묶음.
변경 사항:
content/claude-code/skills-building-guide/디렉터리 생성 (index.md + _meta.js)- 5개 토픽 페이지 이동: skills-overview, skills-development, skills-testing, skills-deployment, skills-patterns
src-skills-building-guide.md제거 → 소스 요약을 하위 섹션 index.md에 통합- 모든 내부 링크를 새 경로로 수정
- 부모
claude-code/index.md,_meta.js업데이트
[2026-06-09] note | concepts: 패키지/클래스/테이블 단수·복수 네이밍 규칙
패키지·클래스는 단수, DB 테이블은 복수라는 레이어별 네이밍 컨벤션과 그 이유를 정리. 대화 중 “event vs events” 질문에서 도출. rest-resource-naming과 교차 링크.
- content/backend-architecture/package-naming-singular-plural.md (신규)
- content/concepts/index.md (링크 추가 + 누락됐던 rest-resource-naming 링크 보강)
- content/concepts/_meta.js (사이드바 항목 추가)
[2026-06-09] note | database 도메인 생성 + MySQL DATETIME/TIMESTAMP 노트
새 database 도메인 골격 생성 후 첫 페이지로 MySQL 시간 타입 비교 노트 작성.
DATETIME vs TIMESTAMP(타임존 변환 유무), fsp (3)밀리초/(6)마이크로초, 저장 크기,
반올림·2038·정밀도 유실 gotcha, UTC 저장/JPA 매핑 중심 모범사례 정리. spring·concepts와 교차 링크.
- content/database/index.md (신규 도메인 MOC)
- content/database/_meta.js (신규)
- content/database/mysql/mysql-datetime-timestamp.md (신규)
- sources/database/ (신규 디렉터리)
- content/index.md (Domains에 database 등록)
- content/_meta.js (사이드바에 database 추가)
[2026-06-11] note | backend-architecture 도메인 생성 + 애플리케이션 계층 응답 모델 설계 노트
새 backend-architecture 도메인 골격 생성 후 첫 페이지로 “Application Layer Response Models” 작성.
서비스 계층이 엔티티 대신 전용 뷰/응답 모델을 반환하는 이유(영속성 누수 차단, 계산된 뷰,
계층별 변경 이유 분리=SRP), 중첩 vs 별도 파일 트레이드오프, degraded 응답을 위한 nullable 타입 선택,
안티패턴을 프레임워크 중립적으로 정리. kakaopay 과제 Phase2 EventService.EventView 논의에서 일반화.
concepts·spring 도메인과 교차 링크.
- content/backend-architecture/index.md (신규 도메인 MOC)
- content/backend-architecture/_meta.js (신규)
- content/backend-architecture/application-layer-response-models.md (신규)
- sources/backend-architecture/ (신규 디렉터리)
- content/index.md (Domains에 backend-architecture 등록)
- content/_meta.js (사이드바에 backend-architecture 추가)
[2026-06-13] note | java-concurrency 도메인 생성 + CountDownLatch 학습 노트
새 java-concurrency 도메인 골격 생성(향후 java.util.concurrent 전반 학습 예정) 후 첫 페이지로
CountDownLatch 작성. 핵심 API, 두 사용 패턴(끝날 때까지 대기 / 일제 출발 3-latch),
고정 풀+await 데드락 함정과 가상 스레드(Java 21) 해법, 쿠폰 발급 동시성 테스트 실전 맥락 정리.
kakaopay 과제 동시성 테스트 논의에서 도출. backend-architecture·spring과 교차 링크.
- content/java-concurrency/index.md (신규 도메인 MOC + 학습 로드맵)
- content/java-concurrency/_meta.js (신규)
- content/java-concurrency/countdownlatch.md (신규)
- sources/java-concurrency/ (신규 디렉터리)
- content/index.md (Domains에 java-concurrency 등록)
- content/_meta.js (사이드바 추가)
[2026-06-28] ingest | gstack (Garry Tan의 Claude Code 스킬 팩) 페이지 추가
YC CEO Garry Tan의 오픈소스 Claude Code 설정 gstack 분석 후 ai-harness/plugins에 페이지 추가.
9개 전문가 역할(CEO/EM/디자이너/스태프엔지니어/QA/릴리스/보안/작가) 기반 가상 엔지니어링 팀,
“Planning is not review” 단계 분리 철학, 생명주기별 23개+ 슬래시 커맨드 카탈로그, 설치/지원 호스트,
한계 정리. Superpowers·OMC와 비교 링크. 마스터 index에 누락돼 있던 ai-harness 도메인도 등록(2-hop 보정).
goddaehee 블로그(https://goddaehee.tistory.com/570 ) + 공식 GitHub README 기반.
- content/ai-harness/plugins/gstack.md (신규)
- content/ai-harness/plugins/_meta.js (gstack 추가)
- content/ai-harness/index.md (Plugins에 gstack 링크)
- content/index.md (Domains에 ai-harness 등록)
[2026-07-04] note | 트랜잭션 격리수준 (@Transactional 기준) 페이지 추가
카카오페이손보 면접 대비 CS 퀴즈 중 격리수준 4단계를 답하지 못해(기본값 RR만 인지, propagation만 학습한 상태) 정리 요청. 이상현상 3종(dirty/non-repeatable/phantom) ↔ 4단계 매핑 표, MySQL InnoDB RR 특이점(MVCC 스냅샷·갭 락·current read), 핵심 함정 “격리수준은 lost update를 못 막는다”(해법 3종: FOR UPDATE/조건부 원자 UPDATE/낙관 락), Spring isolation 속성 동작(커넥션 단위 SET, 실무에서 거의 안 바꾸는 이유), isolation vs propagation 구분 표, 면접 요약 3문장.
- content/spring/transaction-isolation-levels.md (신규)
- content/spring/index.md (Topics 링크 추가)
- content/spring/_meta.js (사이드바 추가)
[2026-07-08] ingest | OS 면접 기본기 (프로세스·스레드·동기화) 페이지 추가
2026-07-07 카카오페이손보 실무진 면접에서 받은 OS 질문 4개(① 프로세스 vs 스레드 ② 멀티스레드 동작 방식 ③ 공유 자원 선점 ④ 뮤텍스락 vs 세마포어)를 하나의 흐름으로 정리. 프로세스=격리/스레드=공유 비교표, 동시성 vs 병렬성·컨텍스트 스위칭, 경쟁 조건·임계 영역·상호 배제(lost update Java 예시), 뮤텍스(1개+소유권) vs 세마포어(N개+무소유권 카운터) 비교표(화장실/주차장 비유)·Java Semaphore 예시, 구두 30초 요약 스크립트. 신규 operating-system 도메인 생성. GPT 만화 상단 첨부 예정. 출처: TIL/2026-07-07.md (면접 회고).
- content/operating-system/process-thread-synchronization.md (신규)
- content/operating-system/index.md (신규 도메인 MOC)
- content/operating-system/_meta.js (신규)
- content/index.md (Domains에 operating-system 등록)
- content/_meta.js (사이드바에 operating-system 추가)
- sources/operating-system/ (디렉터리 생성)
[2026-07-08] ingest | 소규모 팀 아키텍처 방법론 + 실패 사례 2개 페이지 추가
세션 대화(QRGW-Senior-Architecture)에서 논의한 “top-down으로 병목 찾아 해결하는 아키텍처 도출법”을 2개 페이지로 정리. ① 방법론 페이지: 리스크 주도 설계(Fairbanks) 엔진 + C4 하강 경로 + ATAM 경량판 (품질속성 시나리오 6요소·민감점/절충점·효용트리) + 진화적 아키텍처(fitness function, 대사=FF) + Conway 역콘웨이 전략 + 전체 순환 루프 + 방법론 트레이드오프/대안 비교표(C4 vs 4+1 vs arc42, 리스크주도 vs BDUF vs YAGNI, ATAM vs LAAM, FF vs 리뷰 vs 정적게이트). ② 실패 사례 페이지: Knight Capital($440M/45분, 배포검증 FF 부재), Segment(MSA→모놀리스 회귀, Conway 위반), Prime Video(분산→모놀리스 90% 절감, 절충점 오판), TSB(빅뱅 이관 참사, 리스크주도 일정 실패) + 반복 안티패턴표. 웹 리서치로 사실 근거 확보. 기존 _meta.js/index.md 동기화 누락(ddd-hexagonal, outbox 2개)도 함께 보정.
- content/backend-architecture/architecture-methodology-small-team.md (신규)
- content/backend-architecture/architecture-failure-lessons.md (신규)
- content/backend-architecture/_meta.js (신규 2개 + 누락 2개 동기화)
- content/backend-architecture/index.md (Topics 전체 재정렬)
[2026-07-08] ingest | 인덱스 기본기 (B-Tree·카디널리티) 페이지 추가
2026-07-07 카카오페이손보 실무진 면접에서 받은 DB 질문 3개(① 인덱스를 왜 걸어야 하는지 ② 인덱스 동작 방식 ③ 회원 테이블(name, age) 중 어디에 인덱스를 걸지)를 하나의 흐름으로 정리. 풀스캔 O(N) vs 인덱스 O(log N) 비교, B-Tree 동작 방식(정렬된 자료구조·내부/리프 노드·리프 연결 리스트로 범위 검색), 인덱스의 대가(쓰기 오버헤드·저장공간), 카디널리티 개념과 “name vs age 중 카디널리티 높은 name에 인덱스” 답, 복합 인덱스 최좌측 접두사(leftmost prefix) 짧게, CREATE INDEX 예시, 구두 30초 요약. 기존 database 도메인에 추가. 출처: TIL/2026-07-07.md (면접 회고).
- content/database/mysql/index-fundamentals.md (신규)
- content/database/index.md (Topics 링크 추가)
- content/database/_meta.js (사이드바 추가)
[2026-07-08] ingest | TCP vs UDP (네트워크 기본기) 페이지 추가
2026-07-07 카카오페이손보 실무진 면접에서 받은 네트워크 질문 3개(① TCP vs UDP 차이 ② UDP 사용처 ③ 유튜브는 TCP/UDP 중 무엇을 쓰나)를 정리. TCP(연결/재전송/순서/혼잡제어) vs UDP(비연결/저오버헤드) 비교표, UDP 사용처(실시간 스트리밍·게임·VoIP·DNS, “지연이 유실보다 치명적일 때”) 원리, 유튜브 함정 질문 해설 (일반 VOD는 TCP, 최신 유튜브는 UDP 기반 QUIC/HTTP3, 초저지연 실시간은 UDP), 구두 30초 요약. 신규 network 도메인 생성. 출처: TIL/2026-07-07.md (면접 회고).
- content/network/tcp-vs-udp.md (신규)
- content/network/index.md (신규 도메인 MOC)
- content/network/_meta.js (신규)
- content/index.md (Domains에 network 등록)
- content/_meta.js (사이드바에 network 추가)
- sources/network/ (디렉터리 생성)
[2026-07-09] refactor | 사이드바 정리 + Database 분리 + Concepts 해체 + Messaging 신설
TIL 폴더를 연/월(TIL/YYYY/MM/)로 재구성하고 reader를 깊이 무관 재귀 탐색으로 변경(분기/연은 계산 뷰). 사이드바에서 blog·til 항목 숨김(_meta.js display:hidden). Database를 MySQL/Redis 두 하위 탭으로 분리 (redis 도메인을 database/redis로 이동, mysql 페이지는 database/mysql로 이동). Concepts 도메인 해체 → jpa-n-plus-one·payment-completion-gateway·transaction-event-publishing은 spring, rest-resource-naming· package-naming-singular-plural·progress-feedback-patterns는 backend-architecture, kafka-dlt는 신규 messaging 도메인으로 이동. 모든 cross-link(/concepts, /redis, /database/*) 일괄 교정. 관련 _meta.js·index.md·master index 갱신.
- TIL/YYYY/MM/*.md (45개 이동), app/til/tilFiles.js (신규 재귀 리더), app/til/page.jsx·[date]/page.jsx (리더 교체)
- content/_meta.js (concepts 제거, messaging 추가, blog·til 숨김)
- content/database/{index.md,_meta.js} + database/mysql/{index.md,_meta.js} + database/redis/ (이동)
- content/messaging/{index.md,_meta.js,kafka-dlt.md} (신규)
- content/spring/ (+3 페이지, index·_meta 갱신), content/backend-architecture/ (+3 페이지, index·_meta 갱신)
- content/index.md (Database 설명 갱신, Messaging 추가), CLAUDE.md (TIL 경로 규칙)
[2026-07-09] refactor | Cross-Domain 도메인 제거
내용 없이 플레이스홀더만 있던 cross-domain 도메인을 삭제. 폴더·_meta 엔트리 제거, 8개 도메인 index의 Related 링크 정리(빈 spring Related는 Database·Messaging 링크로 대체), master index의 Cross-Domain 섹션 삭제.
- content/cross-domain/ (삭제)
- content/_meta.js, content/index.md, 각 도메인 index.md Related 정리
[2026-07-09] refactor | Claude Code를 AI Harness 하위로 통합
독립 최상위 도메인이던 claude-code를 ai-harness 하위 서브도메인으로 이동. 사이드바에서 AI Harness > Claude Code로 중첩.
- content/claude-code/ → content/ai-harness/claude-code/ (git mv, 하위 skills-building-guide 포함)
- content/_meta.js: 최상위 claude-code 엔트리 제거
- content/ai-harness/_meta.js: claude-code 엔트리 추가 / index.md: 코딩 에이전트 섹션 추가
- 내부 링크 /claude-code/ → /ai-harness/claude-code/ 일괄 치환, master index 정리
[2026-07-10] refactor | java-concurrency 도메인을 Java로 확장 + List 자료구조 노트 2편
동시성 전용이던 java-concurrency 도메인을 범용 java 도메인으로 확장(concurrency는 하위 로드맵으로 유지).
ArrayList vs LinkedList 개관 노트와, 캐시 지역성·포인터 체이싱·가상 메모리·GC 관점의 OS 레벨 deep dive를
별도 페이지로 분리해 작성(한 페이지 200줄 제한 준수). OS 도메인과 상호 링크.
- content/java-concurrency/ → content/java/ (git mv)
- content/java/list-data-structures.md (신규 — ArrayList/LinkedList 개관·동작 방식·선택 기준)
- content/java/list-memory-and-cache.md (신규 — 캐시·페이징·GC deep dive)
- content/java/index.md, _meta.js (신규 페이지 반영, 도메인 설명을 Java로 확장)
- content/java/countdownlatch.md (내부 링크 /java-concurrency → /java)
- content/index.md, content/_meta.js (도메인 키/타이틀 java-concurrency → java)
- content/operating-system/index.md, process-thread-synchronization.md (링크 경로 갱신 + List deep dive로 역링크 추가)
[2026-07-10] refactor | List 메모리·캐시 deep dive를 별도 페이지 → 부록으로 병합
list-memory-and-cache.md를 독립 페이지로 분리했으나, 사용자 판단으로 별도 글이 불필요하다고 정정 —
list-data-structures.md 하단에 “부록: 메모리·캐시 관점 (OS 레벨)” 섹션으로 병합하고 원 페이지 삭제.
- content/java/list-memory-and-cache.md (삭제, 내용은 list-data-structures.md 부록으로 이동)
- content/java/list-data-structures.md (부록 섹션 추가)
- content/java/index.md, _meta.js (분리 페이지 항목 제거)
- content/operating-system/index.md, process-thread-synchronization.md (역링크를 list-data-structures.md로 정정)
[2026-07-10] chore | sources/ 폴더를 content/ 도메인 구조와 재동기화
content/ 도메인 리네임·재구성(java-concurrency→java, claude-code→ai-harness 하위 이동)이 있었지만 sources/는 예전 이름 그대로 남아있던 것을 발견해 정리. spring·thinking 도메인은 sources/ 폴더 자체가 없던 것도 생성(향후 소스 추가용). CLAUDE.md의 남아있던 java-concurrency 표기도 java로 수정.
- sources/java-concurrency/ → sources/java/ (빈 폴더, 단순 rename)
- sources/claude-code/README.md → sources/ai-harness/claude-code/README.md (소스 목록 내용은 그대로)
- sources/spring/, sources/thinking/ (신규 빈 폴더)
- CLAUDE.md (도메인 목록·예시의 java-concurrency 표기 2곳 수정)
[2026-07-10] note | 트랜잭션과 ACID 기본기 노트 추가
계좌 이체를 관통 예시로 트랜잭션 개념 + ACID 4가지(원자성/일관성/격리성/지속성)를 SQL과 함께 정리.
Isolation은 깊이 다루지 않고 기존 격리수준 페이지로 위임, Redis MULTI/EXEC와의 대조로 “트랜잭션”이란
단어가 기술마다 보장 범위가 다르다는 점을 짚음. 인터뷰 준비용이 아니라 기초 학습용이라 “면접” 표현은
배제. /wiki 스킬에도 “항상 예시 기반 설명” 규칙을 명시적으로 추가.
- content/database/mysql/transaction-acid-fundamentals.md (신규)
- content/database/mysql/index.md, _meta.js (신규 페이지 반영)
- content/spring/transaction-isolation-levels.md, content/database/redis/transactions-pipelining-lua.md (상호 링크 추가)
- ~/.claude/skills/wiki/SKILL.md (예시 기반 설명 규칙 추가, 위키 스코프 밖이라 이 wiki repo 커밋에는 미포함)
[2026-07-27] ingest | 테크니컬 라이팅 원칙 (빅테크) + 스키마에 Reference 계약 추가
빅테크(Google·Netflix·Uber·토스·LINE) 테크니컬 라이터의 글쓰기 프레임워크를 웹 리서치로 수집해 thinking 도메인에 참고 페이지로 정리. 같은 리서치를 근거로 위키 스키마(CLAUDE.md)에 “Reference 계약” 섹션을 신설 — 페이지 상단 3요소(한 줄 정의/언제 찾게 되는가/핵심 답), 실측 vs 문서 기반 검증 표기, 탈선 감지(주제 이탈 시 별도 페이지 분리), 문장 린트 규칙. devlog 스킬(~/.claude/skills/devlog)에도 TL;DR·서사형 소제목·독자 선언·3패스 퇴고를 추가(위키 스코프 밖이라 이 레포 커밋에는 미포함).
- content/thinking/tech-writing-principles.md (신규)
- content/thinking/index.md, _meta.js (신규 페이지 반영)
- content/index.md (마스터 MOC에 누락돼 있던 Spring·Thinking 도메인 등록 — 2-hop 규칙 위반 해소)
- CLAUDE.md (Page Format에 “Reference 계약” 섹션 추가)
[2026-07-27] note | payment 도메인 신설 + 해외 결제 용어사전
해외 결제(카드·QR) 도메인 용어사전 요청으로 payment 도메인을 신설. 요청 범위(매입사·발급사·회원사·
인바운드/아웃바운드)를 Rule 8(one concept per page)에 맞춰 3페이지로 분리했다. 용어사전은 “빠른 조회용
한 줄 정의 테이블”, 참여자 페이지는 “각자 무슨 일을 하는지 + 승인/정산 흐름”, 인바운드/아웃바운드는
“방향에 따라 우리 역할이 어떻게 바뀌는지”로 역할을 갈랐다. 택배 비유 표를 진입점으로 두되 비유의 한계
(승인 요청과 자금 흐름의 방향이 반대)를 명시. Member(회원사)는 “은행”이 아니라 네트워크와 직접 계약한
공식 참여 기관이며 Member ID / Acquirer Member / Issuer Member 형태로 연동 문서에 등장한다는 실무
포인트를 별도 강조. 인바운드/아웃바운드는 표준 용어가 아니라 조직마다 기준이 다르므로 맥락별 혼동표와
“프로젝트 시작 시 확정할 것” 체크리스트를 함께 넣었다. 전 페이지 📄 문서 기반(미검증) 표기.
- content/payment/glossary.md (신규)
- content/payment/payment-participants.md (신규, mermaid 승인 흐름 다이어그램)
- content/payment/inbound-outbound-payment.md (신규, mermaid 방향 비교 다이어그램)
- content/payment/index.md, content/payment/_meta.js (도메인 MOC·사이드바 신규)
- content/index.md, content/_meta.js (마스터 MOC·사이드바에 payment 등록)
- content/backend-architecture/index.md (Related에 payment 상호 링크)
- CLAUDE.md (현재 도메인 목록에 payment 추가)
- sources/payment/ (신규 빈 폴더)
[2026-07-27] ingest | 운영 DB 변경 관리 + 감사 테이블 append-only
DBFlow(오픈소스 DB 변경 결재 도구) 개발기 블로그 초고를 위키 Reference로 변환. devlog 서사(개인 경험,
“내가 만들었다” 구성)를 걷어내고 사실 구조로 재편했다. Rule 8에 따라 두 페이지로 분리 — 절차·거버넌스는
database/change-management, MySQL 트리거 구현은 database/mysql/append-only-audit-table.
주요 판단:
-
Flyway/Liquibase 대비는 “우열”이 아니라 “최적화 대상이 다름”(자동화 속도 vs 강제된 검수)으로 표로 정리.
-
부재 위임·직무 분리·동결기간·작업창을 “절차가 무너지는 지점 → 대응 장치” 표로 구조화.
-
원문에 없던 트리거의 한계를 추가 —
DROP TRIGGER우회 가능, DBA/root는 못 막음. 트리거/권한 분리/ 해시 체인/외부 WORM 4단계 비교표로 위협 모델별 실효선 제시. -
원문의 “MySQL 8 binlog 권한 이슈”는 근거가 좁아 DEFINER·복제 복원 관점으로 좁혀 서술하고 권한 항목은 📄 문서 기반으로 표기. 구현 확인된 항목(트리거 동작, 위임/동결 장치, 부팅 거부)만 ✅ 실측.
-
database/는 그동안 mysql/redis 하위 폴더만 있었으나, 저장소 종류 무관 운영 주제를 담는 루트 페이지 자리를 신설(도메인 index 설명도 함께 수정). -
content/database/change-management.md (신규)
-
content/database/mysql/append-only-audit-table.md (신규)
-
content/database/index.md, _meta.js (Topics 섹션 신설, 사이드바 반영)
-
content/database/mysql/index.md, _meta.js (신규 페이지 반영, Related 상호 링크)
-
content/index.md (Database 도메인 설명 갱신)
-
content/backend-architecture/architecture-methodology-small-team.md (Related 상호 링크)
[2026-08-04] note | Future vs CompletableFuture + 블로킹 I/O 커널 동작
“future.get()은 블로킹이고 CompletableFuture는 논블로킹인 원리가 OS 레벨까지 궁금하다”는 질문에서 출발.
사용자의 전제(“CompletableFuture가 스레드를 OS 이벤트 루프에 저장해두고 커널이 콜백 때 깨운다”)를 그대로
받아쓰지 않고 정정한 것이 이 작업의 핵심이다.
주요 판단:
-
오해 정정 —
CompletableFuture는 OS와 무관한 순수 JVM 자료구조(volatile result+Completion스택)다. 이벤트 루프는 OS 기능이 아니라 유저 공간 스레드가epoll_wait를 도는 while문이고, 커널이 깨우는 건epoll_wait에서 자던 루프 스레드 하나뿐. 애플리케이션 콜백은 그 스레드가 자기 발로 호출한다. -
“논블로킹”의 범위 축소 —
CompletableFuture가 논블로킹으로 만드는 건 I/O가 아니라 결과 조립 방식이다. 진짜 논블로킹 I/O는 HttpClient의 NIO Selector·Netty가 만든다. -
Rule 8에 따라 두 페이지로 분리 — JVM API 층은
java/, 커널·epoll·스레드 비용은operating-system/. -
실측 확보 (JDK 25 / macOS, 로컬 100ms 지연 서버). 코드를 실제로 돌려 표를 채웠다: 순차 322ms(대기 스레드 1) / 풀+
get()108ms(4) /sendAsync+thenCombine107ms(0) / 가상 스레드 110ms(1). → “B와 C는 시간이 같다, 차이는 묶인 스레드 수”라는 결론이 여기서 나왔다. 콜백 실행 스레드도 실측해 표로 정리(이미 완료된 CF는 등록 스레드가 직접 실행). 스레드 비용도 실측 — 플랫폼 2,000개 RSS +125MB vs 가상 10,000개 RSS +40MB에 플랫폼 스레드는 16개 유지, 플랫폼 10,000개는 macOS에서 5분 내 대기 진입 실패. -
커널 경로(
tcp_recvmsg→sk_wq대기 →schedule()→ NIC IRQ →sk_data_ready→ wake)는 직접 계측하지 않아 📄 문서 기반으로 표기. 실행해 확인한 항목만 ✅ 실측. -
content/java/completable-future-nonblocking.md (신규)
-
content/operating-system/blocking-io-and-event-loop.md (신규)
-
content/java/index.md, _meta.js (Topics 추가, 로드맵에서 CompletableFuture 제거, OS 페이지 상호 링크)
-
content/operating-system/index.md, _meta.js (Topics 추가, java 페이지 상호 링크)
-
content/index.md (Java·Operating System 도메인 설명 갱신)
[2026-08-04] lint | CompletableFuture·블로킹 I/O 두 페이지 사실 검증
작성 직후 두 페이지를 검토하며 주장들을 JDK 25로 재실행/소스 확인. 틀린 것 3개를 고치고 5개 주제를 보강했다.
정정한 오류:
- “플랫폼 스레드 1만 개는 5분 내 완료 실패” → 느린 게 아니라 4,067번째에서
pthread_createEAGAIN →OutOfMemoryError: unable to create native thread. 원인은 메모리가 아니라 프로세스당 스레드 수 상한 (macOSkern.num_taskthreads= 4096). 실패 로그 원문과 4,000개 성공 행을 표에 추가. - “스레드당 스택 예약 ~1MB” → 이 JVM 실측은
stacksize: 2048k, guardsize: 16k. 예약(가상 주소)과 상주(RSS 52~62KB)를 구분하도록 수정.java/countdownlatch.md의 “~1MB × 1만 = ~10GB” 서술도 같은 근거로 정정. - “Netty EventLoop 기본 스레드 수 = 코어 수” → Netty는
코어 × 2, Reactor Netty는max(4, 코어). - “
Future가 제공하는 건 get/isDone/cancel뿐” → JDK 19+state()/resultNow()/exceptionNow()가 있다. 다만 “콜백 등록 수단이 없다”는 논지는 그대로 유지(전부 조회용). - “
join()과get()은 예외만 다르다” → 인터럽트 응답성도 다르다. 실측:get()은InterruptedException으로 탈출,join()은 인터럽트 1초 뒤에도WAITING.
보강한 내용:
-
CompletableFuture.cancel(true)는 실행 중 스레드를 인터럽트하지 않는다(3초 작업이 끝까지 수행됨을 실측, JDK 25 소스에서 파라미터 미사용 확인). 반면FutureTask.cancel(true)는 인터럽트한다 — 표로 대비. -
thenApplyvsthenCompose(중첩 CF vs 평탄화) 실측 추가. -
orTimeout/completeOnTimeout— 콜백 체인엔 기본 타임아웃이 없다는 점 추가. -
waitingGet()에 스핀 루프는 없고, FJ 워커면helpAsyncBlocker로 다른 작업을 돕고 나서 park (소스 확인). -
OS 페이지에
O_NONBLOCK+EAGAIN절 신설 — “논블로킹 read는 기다리지 않는 read이지 나중에 주는 read가 아니다”가 빠져 있었다. 레벨/엣지 트리거, io_uring 한 줄도 추가. -
content/java/completable-future-nonblocking.md (정정 + 3개 절 추가)
-
content/operating-system/blocking-io-and-event-loop.md (정정 + O_NONBLOCK 절 추가)
-
content/java/countdownlatch.md (스레드 비용 서술 정정, 신규 OS 페이지 링크)
[2026-08-10] note | 인덱스 쓰기 비용·체인지 버퍼·커버링·온라인 DDL MDL
운영 로그 테이블 4종에 인덱스가 PK뿐이라 조건 조회가 45초 걸리던 작업에서 나온 지식을
content/에 반영. 서사는 posts/log-table-index-fullscan-45s.md(devlog)에 있고, 여기엔
재사용 가능한 사실만 옮겼다.
주요 판단:
-
기존 페이지 보강 우선 — 새 페이지를 늘리기 전에
index-fundamentals와mysql-innodb-buffer-pool을 먼저 확인했다. Young/Old LRU는 이미 충실히 서술돼 있어 건드리지 않았고(중복 방지), 정말 비어 있던 체인지 버퍼만 신설했다. -
“인덱스 개수 = 쓰기 비용”이 틀렸다는 축 추가 —
index-fundamentals3장이 쓰기 비용을 개수로만 설명하고 있었다. 키가 단조 증가냐 난수냐에 따라 페이지 분할 여부가 갈리고, 그 완충이 체인지 버퍼라는 연결을 3-1·3-2로 넣었다. 실제 작업에서 CUID2 난수 키 인덱스 하나만 성격이 달랐던 것이 근거. -
커버링 인덱스 신설(6장) — 세컨더리 인덱스가 리프에 PK를 들고 있어 클러스터드 인덱스를 다시 타야 한다는 왕복 구조가 페이지에 없었다. 이게 없으면
Using index의 의미가 안 선다. -
옵티마이저 통계 신설(7장) — 4장이 “옵티마이저가 인덱스를 무시하기도 한다”고만 하고 메커니즘이 없었다. 통계가 샘플링(
innodb_stats_persistent_sample_pages)이라는 것과 인덱스가 없으면filtered가 고정 10%라는 것을 실측과 함께 넣었다. -
온라인 DDL은 별도 페이지로 분리 (Rule 8) — MDL 대기 큐·
ALGORITHM명시·온라인 ALTER 로그 버퍼는 “인덱스가 무엇인가”와 다른 주제다.index-fundamentals에 넣으면 200줄도 넘긴다. -
검증 표기 구분 — 인덱스 없는 상태의 실측(45.36초, 382만 행 스캔 후 1행,
filtered가 분포값이 아닌 상수 10)만 ✅. 체인지 버퍼 동작·MDL 큐 거동·인덱스 적용 후 효과는 📄 문서 기반(미검증). 운영 적용이 아직 안 됐으므로 효과 수치는 비워 뒀다. -
초안의 과장 하나 정정 — devlog·TIL에 “372,663은 3,726,611의 정확히 10%“라고 썼는데 10%는 372,661이라 2행 어긋난다. 결론(분포 계산이 아니라 기본 상수)은 그대로지만 ✅ 실측 표기에 “정확히”는 부적절해 세 곳(위키·devlog·TIL) 모두 문구를 고쳤다.
-
mysql-innodb-buffer-pool에 체인지 버퍼를 4장으로 끼우면서 OS→5장, 모니터링→6장으로 밀렸다. 하위 절(4-14-4 → 5-15-4)과 꼬리질문의 “4-1 참고” 상호참조까지 함께 정정. -
content/database/mysql/online-ddl-mdl.md (신규)
-
content/database/mysql/index-fundamentals.md (3-1·3-2·6·7장 추가, Related 확장 / 108→198줄)
-
content/database/mysql/mysql-innodb-buffer-pool.md (4장 체인지 버퍼 신설, 5·6장 재번호, Related 확장)
-
content/database/mysql/_meta.js, index.md (신규 페이지 등록, 인덱스 페이지 설명 갱신)
[2026-08-11] note | 온라인 DDL 페이지를 위키에서 걷어내고 블로그로 이동
content/database/mysql/online-ddl-mdl.md 를 삭제했다. 2026-08-10 에 신설했던 페이지다.
판단 근거:
- 이 페이지는 특정 작업(거래 로그 인덱스 운영 투입)에서 나온 내용이 대부분이라, Reference 문서라기보다 그 작업의 서사에 붙어 있을 때 더 잘 읽힌다.
- 같은 내용이
posts/log-table-index-cost-and-rollout.md2장에 이미 있었고 (MDL 대기 큐·정렬 공간·버퍼풀 교란·작은 테이블부터·통계 갱신), 위키에만 있던ALGORITHM/LOCK옵션 표와 사다리 패턴을 그 글로 옮겨 한곳에 모았다. - 결과적으로 위키에 남은 건 주제 자체가 일반 지식인 것들뿐이다.
유지한 것 (기존 페이지에 대한 보강이라 그대로 둠):
index-fundamentals.md— 키 성질별 쓰기 비용·체인지 버퍼·커버링 인덱스·옵티마이저 통계mysql-innodb-buffer-pool.md— 체인지 버퍼 절
정리한 링크 4곳: _meta.js, database/mysql/index.md, index-fundamentals.md Related,
mysql-innodb-buffer-pool.md Related. 남은 참조 0건을 grep 으로 확인했다.
- content/database/mysql/online-ddl-mdl.md (삭제)
- content/database/mysql/_meta.js, index.md (등록 해제)
- content/database/mysql/index-fundamentals.md, mysql-innodb-buffer-pool.md (Related 정리)
- posts/log-table-index-cost-and-rollout.md (ALGORITHM/LOCK 옵션 표·사다리 패턴 수용)
[2026-08-18] setup | 『타지 않는 인덱스』 골격 + 『잠드는 스레드』 완간 처리
새 전자책 content/books/db-index/ 를 스캐폴딩했다. 5부 20장 + 여는 글·닫는 글.
관통 문장: 인덱스는 빠르게 읽는 기술이 아니라 덜 읽는 기술이고, 그 “덜”의 단위는 행이 아니라 16KB 페이지다.
백로그 1순위였던 http 대신 이 주제를 고른 근거는 취재 자산이다.
content/database/mysql/ 8페이지 + 실측 블로그 6편이 이미 있었고(http는 위키 1페이지·
블로그 0편), 여는 글 훅도 겪은 것을 그대로 쓴다 — “조건을 안 걸면 빠릅니다”(45.36초
풀스캔의 정체). MySQL 8.x/InnoDB 전용으로 못 박았다(PostgreSQL 대조 없음).
이 책이 갚기로 한 빚 — 위키가 스스로 📄 미검증 이라고 표기해둔 둘:
index-fundamentals.md3-1·3-2 (키 성질별 쓰기 비용) → 13·14장에서 계측mysql-innodb-buffer-pool.md4장 (체인지 버퍼 병합량) → 15장에서 계측
경계선: MVCC·격리수준·락은 『약속된 데이터』, @Async 큐 포화는 『잠드는 스레드』 14장
소관이라 링크만 한다.
함께 『잠드는 스레드』를 완간 처리했다 (여는 글 + 1~18장 + 닫는 글, 삽화 18/18).
- content/books/db-index/ (신규 — index.md 스펙, book.json, _meta.js, 장 스텁 22개)
- content/books/_meta.js, index.md, content/index.md (새 책 등록 + async 완간)
- content/books/async/index.md (status: 집필 중 → 완간)
- docs/book/illustration-prompts-db-index.md (신규 삽화 큐)
- docs/book/book-backlog.md (async 완간, db-index 착수 기록)
[2026-08-22] fix | 오버플로 오설명 정정 — 블로그 2편·위키 1곳
『타지 않는 인덱스』를 쓰면서 실측한 값이 예전 블로그 글의 설명을 뒤집었다. 위키 규칙 9(모순은 양쪽에 표시, 조용히 덮어쓰지 않는다)대로 처리했다.
무엇이 틀렸나. 1편에서 2.1KB JSON 컬럼이 “행에 20바이트 포인터만 남기고
오버플로 페이지로 빠진다”고 썼다. SELECT *일 때 행마다 페이지 접근이 하나씩
더 붙는 걸 보고 오버플로 탓으로 추론한 것이다. 재보지 않고 썼다.
실측이 뒤집은 근거.
- 5장 — 오버플로 경계를 한 바이트씩 좁혀 재니 그 스키마에서 8,105바이트까지 인라인, 8,106바이트부터 밖으로 나간다. 2.1KB 는 임계값의 4분의 1이다.
- 1장 — 같은 성격의 테이블에서
DATA_LENGTH ÷ COUNT(*)가 2,739바이트다. 정말 밖으로 빠졌다면 클러스터드가 20MB 도 안 됐을 것이다. - 글 자신의 숫자와도 안 맞았다. 같은 글이 “행당 평균 600바이트”라고 적어뒀다.
- 추가 요청은 실재하지만 원인이 다르다. 25만 행에 249,832회로 행마다 정확히 하나씩 붙는데, 오버플로라면 큰 값을 가진 행에만 붙어야 한다. 📄 BLOB 계열이 끼면 프리페치 캐시가 꺼진다고 알려져 있으나 소스 미확인.
고친 곳.
posts/log-table-index-fullscan-45s.md— 발원지. 원문을 지우지 않고 바로 뒤에 ⚠️ 정정 블록을 달았다(“틀린 측정을 지우지 않는다”는 이 책의 규율대로)posts/log-table-index-cost-and-rollout.md— 1편에서 번져온 자리 2곳 (mermaid 노드 + 본문 문장). 문장은 정정 블록으로 대체content/database/mysql/index-fundamentals.md— “(BLOB/JSON이 크면)” 이라는 모호한 조건을 실측 경계로 바꾸고 5장 링크content/books/db-index/01-sequential-scan.md,05-page-16kb.md— 블로그 역링크를 걸어 양방향으로 연결
[2026-08-22] fix | 책 본문의 GitHub 소스 링크를 저장소 상대 경로로 교체
두 전자책 본문이 측정 스크립트를 github.com/Hyeonqz/calix-llm-wiki/blob/main/...
으로 링크하고 있었는데, 저장소가 비공개라 독자가 열면 404 였다.
링크를 걷어내고 저장소 상대 경로 인라인 코드로 바꿨다.
전체 소스: [`ch20/retention.sh`](https://github.com/.../ch20/retention.sh)
→ 전체 소스: `docs/book/code/db-index/ch20/retention.sh`- 치환 49건 / 파일 40개 (db-index 24건, async 25건)
- 본문이 가리키는 경로 51개가 전부 실재하는지 확인했다
- 두 책의 여는 글이 이미
docs/book/code/{book}/위치를 안내하고 있어 별도 설명은 안 붙였다 - 다른 저장소 링크(
Hyeonqz/dbflow,ben-manes/caffeine등)는 그대로 뒀다