Skip to Content
Activity Log

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-depth
  • claude-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 타입 선택, 안티패턴을 프레임워크 중립적으로 정리. 채용 과제 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) 해법, 쿠폰 발급 동시성 테스트 실전 맥락 정리. 채용 과제 동시성 테스트 논의에서 도출. 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 면접 기본기 (프로세스·스레드·동기화) 페이지 추가

실무진 면접에서 받은 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·카디널리티) 페이지 추가

실무진 면접에서 받은 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 (네트워크 기본기) 페이지 추가

실무진 면접에서 받은 네트워크 질문 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+thenCombine 107ms(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_create EAGAIN → OutOfMemoryError: unable to create native thread. 원인은 메모리가 아니라 프로세스당 스레드 수 상한 (macOS kern.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)는 인터럽트한다 — 표로 대비.

  • thenApply vs thenCompose (중첩 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-fundamentals 3장이 쓰기 비용을 개수로만 설명하고 있었다. 키가 단조 증가냐 난수냐에 따라 페이지 분할 여부가 갈리고, 그 완충이 체인지 버퍼라는 연결을 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.md 2장에 이미 있었고 (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.md 3-1·3-2 (키 성질별 쓰기 비용) → 13·14장에서 계측
  • mysql-innodb-buffer-pool.md 4장 (체인지 버퍼 병합량) → 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 등)는 그대로 뒀다

[2026-09-01] ingest | 비공개 interview 도메인 신설

면접 회고 TIL을 질문별 답변 카드로 정리했다. /log는 공개 라우트이므로 회사명·질문 내용은 여기 옮기지 않는다.

  • 신규 interview 도메인 생성: content/interview/
  • 비공개 처리: proxy.js 로그인 게이트, content/_meta.js의 display: 'hidden', buildDocsIndex 검색 인덱스 제외
  • 관련 기존 위키 페이지로 링크 연결 (Redis, MySQL, OS, Network, Backend Architecture)

[2026-09-20] setup | 『갇히지 않는 프로세스』 골격 + 『타지 않는 인덱스』 완간 처리

새 전자책 content/books/container/ 를 스캐폴딩했다. 5부 21장 + 여는 글·닫는 글. 인프라·데브옵스 트랙의 첫 책이다.

관통 문장: 컨테이너는 가상머신도 상자도 아니다. 커널이 한 프로세스 둘레에 그은 선이다. 선은 벽이 아니어서, 어디에 어떻게 그었는지 모르면 시그널도 메모리도 그 선을 넘어 새어 나간다.

후보 셋(컨테이너 / 리눅스 서버 한 대 / 무중단 배포) 중 컨테이너를 고른 근거는 접점과 실측이다. 백엔드 개발자가 데브옵스로 넘어갈 때 첫 접점이고, 로컬 Docker 하나로 전 장이 재현된다. 위키에 인프라 취재 자산은 0이라(db-index 때와 반대) 장마다 실측을 새로 뽑는다. 여는 글 훅은 “docker stop이 10초 걸린다” — shell form CMD로 PID 1이 /bin/sh가 되어 SIGTERM이 자바에 닿지 않는 사고. 12장이 원리로 풀고 21장이 K8s 판(terminationGracePeriodSeconds)으로 되갚는다.

결정: 연대기 아크(역사 → 원리 → Spring Boot 실무 → compose → K8s), 예제 앱은 Spring Boot 하나가 3부부터 관통, 마지막 부는 kind 클러스터로 K8s 기초 4장. 본문은 리눅스 기준, macOS 우회는 각주.

경계선: 스레드 풀은 『잠드는 스레드』, 시계는 『어긋나는 시계』 소관 — 링크만. 블루그린·카나리·CI는 다음 책(deploy)으로 남긴다.

함께 『타지 않는 인덱스』를 완간 처리했다 (스텁 0개 확인, 마스터 MOC·백로그의 “집필 중” 표기 제거).

  • content/books/container/ (신규 — index.md 스펙, book.json, _meta.js, 장 스텁 23개)
  • content/books/_meta.js, index.md, content/index.md (새 책 등록 + db-index 완간)
  • docs/book/illustration-prompts-container.md (신규 삽화 큐 + 시각 모티프)
  • docs/book/book-backlog.md (인프라·데브옵스 트랙 신설, db-index 완간, container 착수 기록)

[2026-09-21] write | 『갇히지 않는 프로세스』 3부 완결 (11~15장) + 검수 반영

Spring Boot 앱을 컨테이너에 담는 3부 다섯 장을 집필하고, 장마다 book-editor 검수를 붙였다. 검수 지적은 하나도 그냥 받지 않고 전부 직접 재현해서 확인한 뒤 반영했다. 그 과정에서 네 장의 핵심 주장이 틀린 것으로 드러났고, 고친 쪽이 원래보다 강한 장이 됐다.

  • 11장 레이어 캐시 — 캐시 키는 “결과”가 아니라 “입력”(COPY=파일 내용, RUN=명령 문자열)
  • 12장 PID 1 — 본문은 “같은 sleep”이라 썼는데 스크립트는 한쪽이 sh였다(실험 교체). 보호막의 구멍(SIGKILL·SIGSTOP은 밖에서 보냈을 때만 통함)과 --init+exec form 대조군 추가. exec form의 exit 143은 시그널에 맞은 값이 아니라 JVM 자가 호출 — 훅에서 halt(7) 부르면 7이 나온다.
  • 13장 JVM 메모리 — “JDK 8 초기 이야기”가 거짓. cgroup v2 인식은 11.0.16·8u372부터이고, 11.0.15는 UseContainerSupport=true인데도 512MB 컨테이너에서 힙을 2044MB로 잡는다. 힙 구간도 둘이 아니라 셋(250~500MB는 126MB 고정). -Xms240m + --memory-swap 256m으로 드디어 OOMKilled=true exit 137을 잡아 제목의 약속을 지켰다.
  • 14장 CPU 스로틀링 — throttled_usec는 스레드별 합이 아니라 CPU별 런큐별 합. 스레드 2개를 한 코어에 묶으니 152ms/주기가 50ms/주기로 떨어지는 반증 실험으로 확정. 프로세서를 2개 미만으로 보면 G1이 아니라 SerialGC가 걸린다는 것도 추가.
  • 15장 HEALTHCHECK — 쿠버네티스는 이미지의 HEALTHCHECK를 아예 보지 않는다(원고가 반대로 썼다). --restart=always를 걸고 40초 넘게 unhealthy로 둬도 재시작 0 — 재시작 정책은 종료 코드만 본다.

관통 결론: unhealthy는 앱의 상태가 아니라 검사의 결과다. Health=unhealthy인 그 순간에도 앱은 200을 돌려주고 있었다.

  • content/books/container/11~15 (본문), _meta.js·index.md (제목 동기화)
  • docs/book/code/container/ch11~ch15/ (실측 스크립트 — 12·13·14·15는 검수 반영으로 재작성)
  • docs/book/illustration-prompts-container.md (11~15장 프롬프트 추가)

[2026-09-21] write | 『갇히지 않는 프로세스』 4부 완결 (16~17장) + 전권 deslop 패스

Docker 파트를 닫는 두 장을 집필하고, 끝나고 나서 책 전체에 문체 탐지기를 돌렸다.

16장 — 서비스 이름으로 부른다

검수가 잡은 Critical이 아프다. 라운드로빈 DNS 표에 “죽은 인스턴스를 모른다”고 썼는데, 여덟 줄 위에서 내가 직접 “내장 DNS가 뜨고 질 때마다 기록을 갱신한다”고 써놨다. 같은 장 안에서 자기모순이었고, 재현해보니 검수가 맞았다.

kill → 3초 후 DNS 에서 빠짐 pause → 3초 후에도 그대로 (못 받는데)

진짜 한계는 “네트워크에 붙었는지만 알고 받을 수 있는지는 모른다”였다. 15장의 “unhealthy 인데 200 을 돌려주던” 장면의 정확한 반대편이라 20장 프로브 복선이 하나 늘었다. 내장 DNS 도 네트워크마다가 아니라 컨테이너마다 하나였다 — netns 안 DNAT 포트가 다르다. 12장을 인용해야 할 자리에 15장을 썼어야 했던 것도 고쳤다.

17장 — 죽고 다시 살아나기

15장에서 고쳤던 것과 같은 종류의 라벨 버그를 또 냈다. 폴링 루프가 찍고 나서 sleep 하는데 라벨은 i*5 로 계산해서 전 행이 5초씩 밀렸다. 폴링을 버리고 docker events 타임스탬프로 갈아타니 백오프가 출력에 그대로 나온다: 0.17 → 0.25 → 0.50 → … → 25.67초.

종료 코드 표도 틀렸다. 125 는 컨테이너 종료 코드가 아니라 docker 명령 자신의 종료 상태고 (docker inspect 에 안 찍힌다), 126·127 은 runc 가 아니라 데몬이 얹는 값이며, “0124 는 앱”이라는 경계는 존재하지 않는다. 앱은 0255 아무 값이나 낸다.

on-failure:3 의 3 은 “연속 3회”가 아니라 누적이다. 매번 12초씩 멀쩡히 살아도 리셋되지 않고, 손으로 docker start 할 때만 0 으로 돌아간다. 하루 한 번 죽는 서비스는 사흘이면 예산을 쓴다. “컨테이너는 태그를 기억하지 않는다”도 틀렸다 — 태그는 들고 있고(.Config.Image 가 계속 latest 로 보인다) 시작할 때 다시 해석하지 않을 뿐이다. 이 사고가 안 잡히는 이유가 그거다.

못 쟀던 always vs unless-stopped 는 dind 로 안쪽 데몬을 재시작해 측정에 성공했다. 손으로 stop 하면 always 도 안 살아나고, 데몬 재시작 때 갈린다.

전권 deslop 패스

책 안에서 리듬이 갈려 있었다. 111장은 0.03.5 인데 1217장만 6.910.5. 검수 지적을 반영하면서 강조를 문장이 아니라 볼드로 붙인 자리가 쌓인 결과다(17장 16건). 전부 문장 구조로 되돌렸다 — 결론을 문단 첫 문장으로 올리거나, 문장을 자르거나. 1217장이 0.51.4 로 내려와 전 책이 한 대역에 들어왔다. index.md 6.9 는 목차의 부 구분 라벨이라 서식으로 보고 남겼다.

덤으로 12~15장의 버전 표기를 바로잡았다. 오늘 전부 재측정했는데 라벨에 옛 값(29.7.2 / 4.87.0)이 남아 있었다. 실제 환경은 29.8.0 / 4.91.0.

  • content/books/container/16, 17 (신규), 12~15 (deslop + 버전 표기)
  • docs/book/code/container/ch16/ (compose 4종 + dns.sh), ch17/lifecycle.sh
  • docs/book/illustration-prompts-container.md (16·17장 프롬프트)

[2026-09-21] write | 『갇히지 않는 프로세스』 5부 완결 (18~21장) — 본문 종료

kind 로 노드 3대짜리 클러스터를 띄우고 K8s 4개 장을 집필했다. 장마다 검수를 붙였고 지적은 전부 직접 재현해서 확인했다. 네 장 모두 내가 쓴 설명이 틀린 게 나왔다.

18장 — 한 대로 안 될 때

설계적 중심은 /proc/<pid>/ns/ 대조다. “Pod 는 컨테이너 묶음”이라고 외우게 하는 대신, 5장에서 읽던 그 inode 를 앱 컨테이너와 pause 에 대해 나란히 찍었다. net·uts·ipc 는 같고 pid·mnt·cgroup 은 다르다. 그게 Pod 의 정의다.

검수 Critical 2건. node-monitor-grace-period 를 40초로 썼는데 이 버전 기본값은 50초였다. 그리고 “쿠버네티스는 다시 만드는 것 말고는 할 줄 아는 게 없다”가 틀렸다 — 앱 컨테이너만 crictl stop 하면 제자리에서 다시 뜬다(Pod 이름·IP 그대로, RESTARTS 만 1, pause PID 불변).

19장 — 트래픽이 찾아오는 길

ping 실측이 아무것도 재지 않고 있었다. kind 노드에 ping 이 없어서 exit 127 이 || 분기를 타고, 어떤 주소를 넣어도 “응답없음”이 찍힌다. 살아 있는 Pod IP 로도, 노드 자기 자신으로도 그랬다. probe Pod 에서 대조군과 함께 다시 쟀다. 그러면서 “ICMP 라서 안 된다”도 틀렸다는 게 드러났다 — TCP 9999번도 똑같이 사라진다. 규칙은 (주소, 프로토콜, 포트) 조합 하나에만 걸린다. 10.96.0.10 을 “클러스터에 하나 있는 진짜 CoreDNS”라고 쓴 것도 틀렸다. CoreDNS Pod 는 2개고 그 주소는 kube-dns Service 의 ClusterIP — 30줄 위에서 “가짜 주소”라고 부른 그 물건이다.

20장 — 살아 있음과 받을 수 있음은 다르다

5절 실측이 재현되지 않았다. CrashLoopBackOff 와 Running 은 백오프 주기마다 깜빡이는데 45초 스냅샷을 한 번 찍고 있었다. 폴링 + 재시작 횟수로 바꿨다. 스프링 절도 틀렸다. “probes.enabled=true 를 켜면 두 경로가 생긴다”고 썼는데, 설정이 없는데도 쿠버네티스 위에서는 200 이 나온다(같은 이미지를 docker run 하면 404). 스프링 부트가 K8s 환경을 감지해 자동으로 켜기 때문이고, 고치니 15장 약속이 제대로 갚아졌다.

21장 — 요청과 제한, 그리고 롤아웃

롤링 업데이트 실패를 “엔드포인트가 0이 돼서 20장의 has no endpoints 에 걸렸다”고 설명했는데, 0.2초마다 세어보니 ready 엔드포인트가 내내 3개였다. 실제로는 그 3개가 “Ready 라고 표시됐지만 아직 포트를 안 연 새 Pod”로 갈린 것이다. 고친 쪽이 교훈도 더 세다 — 목록이 비어서가 아니라 꽉 차 있는데도 전멸한다. QoS 표도 두 행이 틀렸다(memory 만 맞추면 Burstable, limits 만 적으면 Guaranteed).

관통: 내가 안 쓴 값이 동작을 정한다. tolerationSeconds 300, cpu.weight, QoS 등급, maxSurge 25%, terminationGracePeriodSeconds 30. 여는 글의 유예가 마지막 장에서 이름을 바꿔 돌아온다.

  • content/books/container/18~21 (신규)
  • docs/book/code/container/ch18~ch21/ (kind 매니페스트 + 실측 스크립트)
  • docs/book/illustration-prompts-container.md (18~21장 프롬프트)
  • 남은 것: 닫는 글(99-closing)

[2026-09-21] write | 『갇히지 않는 프로세스』 닫는 글 + 완간 처리

여는 글의 Exited (137) 화면으로 돌아가서, 같은 한 줄이 이제 무엇을 묻게 하는지로 연다.

이 글의 장치는 회수 표다. 같은 커널 파일이 2부·3부·5부에서 어떤 이름으로 나왔는지를 세 칸에 나란히 놓는다. memory.max 는 7장에서 손으로 쓰고, 13장에서 JVM 이 읽고, 21장에서 limits.memory 가 거기 들어간다. 21장이 던진 “정말로 하나였나”에 산문이 아니라 구조로 답한다.

검수 Critical 2건.

  • 표에 “cpu.max 의 두 숫자를 읽는 법을 배웠다 (7장)“이라고 썼는데 7장은 그걸 안 했다. 파일 이름만 보여주고 정리표에서 스스로 14장으로 미뤄놨다. “2부를 건너뛰고 5부만 배우면”도 같은 오류라 “2·3부를”로 고쳤다.
  • 진단 절에서 “shell form 이면 신호가 막힌 거고요”라고 단정했는데, 여는 글이 한 절을 통째로 써서 세운 교훈이 “shell form 은 안전한 게 아니라 복불복”이다. busybox ash 와 bash 는 자바를 PID 1 로 만든다. 같은 글 60줄 뒤에서는 그 복불복을 다시 살려놓고 있었다. “PID 1 이 누군지 보세요”로 바꿨다. OOMKilled=false 를 “유예가 끝난 것”으로 단정한 것도 여는 글이 심어둔 씨앗(앱이 스스로 exit(137) 을 불러도 화면은 같다)을 덮는 거라 “대개”로 낮추고 괄호를 달았다.

15장↔20장 회수(같은 판정을 Docker 는 적어두기만, K8s 는 트래픽을 끊는다)가 통째로 빠져 있어 한 문단 추가했다. 볼륨→PV·PVC 와 보안 축(rootless·capability)도 “안 한 것”에 넣었다. 5장에서 여덟 종류 중 user 만 호스트와 같다는 걸 보여주고 그냥 넘어간 게 그 입구다.

마지막 착지는 여는 글의 질문(“자바 프로세스는 정말 안에 들어가 있나”)을 받는다. 안에 들어간 게 아니라 볼 수 있는 것과 쓸 수 있는 양만 달라졌다 — namespace 와 cgroup, 2부의 두 장이다.

완간 처리. status 를 “완간”으로 바꾸고 books/index.md·content/index.md 의 “(집필 중)” 표기를 제거했다. 전 24편(여는 글 + 21장 + 닫는 글) 스텁 0개.

  • content/books/container/99-closing.md (신규), index.md (완간)
  • content/books/index.md, content/index.md (집필 중 표기 제거)
  • docs/book/illustration-prompts-container.md (닫는 글 프롬프트 — 여는 글과 같은 구도)

[2026-09-27] delete | Spring Boot 4 마이그레이션 블로그 삭제

사용자 요청으로 posts/spring-boot-4-migration-roadmap.md와 전용 본문 이미지·썸네일을 삭제했다. 블로그 목록과 정적 경로는 posts 디렉터리에서 자동 생성된다.

[2026-09-30] revise | 거래 로그 인덱스 2부작 재구성

기존 1·2편을 조사·결정 / 개선 진행·결과로 재구성했다. 9월 운영 조사 SQL과 결과를 추가하고 과거 측정과 구분했다. 기술적 오류와 미측정 원인 단정을 정정했으며 운영 적용 결과는 미완료로 명시했다. 기존 URL은 유지하고 이전 요약 이미지 참조는 제거했다. 커밋·배포는 수행하지 않았다.

[2026-09-30] review | 로그 조사 1편 기술 검수

1편을 운영 현황·실제 SQL 결과·DDL·인덱스 후보 검토로 한정했다. 통계와 실행계획 추정치, LIMIT, 조회 컬럼 범위의 해석을 보강하고 모듈 분리·설득은 2편으로 이동했다. 새 운영 측정이나 적용 결과는 추가하지 않았다.

[2026-09-30] blog-draft | 사람이 읽기 좋은 프로젝트 통합 문서

팀 온보딩과 인수인계를 위해 진행 중인 통합 문서 작업의 계기, 기대 효과, 협업에 대한 생각을 블로그 초안으로 작성했다.

  • posts/human-readable-project-docs.md — 비즈니스 내용을 제외한 개인 프로젝트 회고 초안
  • public/images/blog/human-readable-project-docs-overview.jpg — 현재 포털 레이아웃에 공개용 예시를 표시한 캡처
  • public/images/blog/human-readable-project-docs-search.jpg — 공개용 예시 내용의 검색 화면 캡처

실제 사내 식별정보와 업무 내용은 글과 캡처에서 제외했다. 성과는 아직 측정하지 않았으며 기대 효과와 남은 확인 사항으로 표현했다.

[2026-09-30] revise | 통합 문서의 협업 관점 보강과 썸네일 제작

posts/human-readable-project-docs.md의 문서화 관점을 팀의 판단 기준, 의사결정 맥락, 지식 전달과 유지 비용까지 보강했다. 3년차라는 실제 위치와 진행 중인 프로젝트라는 전제를 유지했다.

기존 블로그의 따뜻한 조명과 남색 배경의 일러스트 스타일을 참고해 문서를 함께 읽는 장면을 내장 이미지 생성 도구로 만들었다. 비즈니스 내용과 식별정보는 포함하지 않았다.

  • public/images/blog/human-readable-project-docs-thumbnail.webp — 1400×788, 16:9 WebP, 크롭 없이 변환
  • 본문의 공개용 포털 캡처 2장은 그대로 유지

[2026-10-06] til-backfill | 오늘을 제외한 Git 이력의 누락 날짜 보충

두 개발 루트의 로컬 Git 이력을 한국 시간 커밋 날짜로 대조해 기존 TIL이 없는 136일(2024-11-12~2026-10-02)을 보충했다. 사용자 작성자 식별자로 확인한 커밋 1,164개를 저장소별로 묶고 참조 해시를 보존했다. 외부 저장소 작성자와 자동 시세 갱신 봇은 사용자 작업에서 제외했다. 기존 TIL과 2026-10-06 기록은 수정하지 않았다.

뒤늦게 작성한 회고임을 각 파일에 명시했다. 제목만으로 이유를 확정하지 못한 기록은 변경 파일과 확인 한계만 남겼다. 당시 테스트 통과나 운영 성과를 새로 주장하지 않는다.

Codex 자동화에 한국 시간 영업일 18:25 당일 TIL 작성·검사·commit·push를 등록했다. 월~금 실행 시 한국 공휴일·대체공휴일을 확인해 건너뛰며, 이번 실행에서 작성한 파일만 게시한다.

[2026-10-06] til | 당일 변경의 계약과 검증 경계 기록

우주항공청 2026년 월력요항과 임시공휴일 검색으로 비공휴일을 확인했다. 두 개발 루트의 전체 로컬 저장소 참조에서 사용자 당일 커밋을 조사해 금액 NULL 계약, 실패 원인 로그, HTML 이관 검증, 소급 기록의 근거 관리를 TIL/2026-10-06.md에 정리했다. 봇 갱신과 중복 브랜치 반영은 제외했고 당시 테스트를 재실행하지 않은 한계를 명시했다. 이번 TIL과 로그만 게시 대상으로 삼는다.

[2026-10-07] ingest | 커밋 이후 이벤트 처리와 Outbox 전달 보장

범용 예제로 블로그 사례를 작성하고 기존 위키 세 페이지를 보강했다.

  • 이벤트 발행: publishEvent 실행 조건과 fallback의 호출 계약을 정정했다.
  • 후처리 DB 저장: 자원 정리·REQUIRES_NEW·CallerRuns와 검증 조건을 분리했다.
  • Outbox: 저장 원자성과 외부 전달을 구분하고 중복 처리·릴레이 실패 구간을 설명했다.

회사·기관·내부 경로·코드값·작업 수치는 공개 본문에서 제외했다. 본문에는 검증 방법을 정리하고 상단 요약 만화와 목록 썸네일을 추가했다.

[2026-10-07] til | 커밋 경계와 금액 정책 변경 기록

공식 월력요항과 임시공휴일 검색으로 비공휴일을 확인했다. 두 개발 루트의 당일 사용자 커밋과 작업 중 위키를 조사해 TIL/2026-10-07.md에 커밋 후 통지, USD 정책 변경, 망취소 집계, 테스트 요청 조건을 기록했다. 세션 발화 미회수와 실제 환경 재검증 한계를 표시했다. 기존 위키·블로그·로그 변경은 보존하고 이번 TIL과 이 로그 추가분만 게시한다.

[2026-10-08] til | 취소 저장 계약과 배포 영향 기록

공식 공휴일 자료에서 비공휴일을 확인하고 두 개발 루트의 당일 사용자 Git 이력을 조사했다. TIL/2026-10-08.md에 취소 중복·동시성 경계, 대상 제한과 SKIP, Gradle 배포 영향, 접힌 메뉴 접근성을 기록했다. 원복·재적용과 미실행 검증을 구분했으며 세션 근거 미회수 한계를 표시했다. 이번 TIL과 로그만 게시한다.

[2026-10-12] til | 취소 결과·캐시·상계 설계의 확인 경계

공식 월력요항과 임시공휴일 검색으로 비공휴일을 확인했다. 두 개발 루트의 저장소 14곳과 당일 세션 요약을 조사해 TIL/2026-10-12.md에 트랜잭션·실패 집계, 성공 우선과 Kafka 식별, 사전 확인 캐시, 미송신 판정 설계, 이관 생성 모드를 기록했다. 미커밋 설계와 실제 구현, 승인된 운영 가정과 검증 결과를 구분했다. 이번 TIL과 로그만 게시한다.

[2026-10-13] til | 정산 구현과 배포·원복의 최종 상태 기록

18:25까지 기다린 뒤 공식 공휴일 자료를 확인했다. 두 개발 루트의 저장소 14곳과 당일 세션 요약에서 사용자 작업을 조사해 TIL/2026-10-13.md에 정산 상계와 후속 조건 변경, 이벤트 이관 범위, 환경별 패키지, 공통 지침 배포, UI 원복을 기록했다. 중복 반영과 미검증 운영 결과를 구분했으며 이번 TIL과 로그만 게시한다.

[2026-10-14] til | 종료·정산·저장·생성 경계와 UI 후속 변경

18:25까지 기다린 뒤 공식 공휴일 자료를 확인했다. 두 개발 루트의 당일 사용자 Git 이력과 세션 요약을 조사하고 중첩 MockPay 저장소도 추가 대조했다. TIL/2026-10-14.md에 종료 실패 차단, 수동 정산 정책, 필수값 보정, 서비스 생성 경로, UI 후속 변경을 기록했다. 테스트 코드 추가·미검증 실행·운영 적용을 구분하며 이번 TIL과 로그만 게시한다.

[2026-10-15] improve | 추적 가능한 TIL과 분기별 접이식 탐색

전역 source-command-til 스킬과 docs/til-authoring.md에 안정적인 주제 ID·상태·이전 기록 링크 및 조건부 시각화 규칙을 연결했다. 기존 TIL 원문은 변경하지 않았다. 명시적 태그 줄만 색인해 본문의 항목 번호가 태그로 잡히는 문제를 수정했다.

목록은 최신 분기·월부터 펼치고 월별 접기, 전체 기간 검색·태그·주제 필터, URL 상태 복원을 제공한다. 태그는 화면 폭에 맞는 한 줄과 더보기·접기·태그 검색을 지원한다. 상세는 Mermaid와 주제별 날짜 흐름을 표시하고 코드 근거를 접어 보여준다. 기존 ID 없는 글은 소급 분류하지 않는다.

회귀 테스트 14개와 로컬 브라우저의 분기·월·태그·검색·주제 흐름·Mermaid·복귀·모바일 가로 넘침 검증을 통과했다. 임시 기록은 테스트 fixture로 분리했으며 운영 기록에 남기지 않았다. 스킬 기본 검사기는 PyYAML 미설치로 실행되지 않아 설치된 Node YAML 파서로 메타데이터와 문서 참조를 별도 확인했다. 커밋·푸시는 수행하지 않았다.

기본 Turbopack 빌드는 컴파일 단계에서 진행되지 않아 중단했다. npm run build -- --webpack 대체 프로덕션 빌드는 컴파일·TypeScript·정적 페이지 274개 생성을 완료했다. 검증용 로컬 서버는 종료했다.

[2026-10-15] til | 새 추적 형식으로 승인 후처리와 배포 판단 기록

공식 공휴일 자료에서 비공휴일을 확인하고 캐시·임시 산출물을 제외한 중첩 저장소 17곳과 당일 세션 요약을 조사했다. TIL/2026-10-15.md에 승인 후처리, Consumer 배포 설계, 포매터 격리, 수수료 표시 순서, TIL 개선을 기록했다. 주제 ID·상태와 이전 날짜 링크를 추가하고 확인된 커밋 후 이벤트 경계만 Mermaid로 시각화했다. 기존 TIL과 다른 미커밋 파일은 변경하지 않으며 이번 TIL·로그만 게시한다.

[2026-10-16] til | 결제 후처리와 거래·사전·테스트 환경의 판정 기준

공식 월력요항과 임시공휴일 지정 검색으로 비공휴일을 확인했다. 중첩 저장소 17곳의 당일 사용자 커밋과 세션 요약을 조사했다. 오늘 TIL에 결제 후처리, 영문명 사전 역할, 원승인 기준 당일 취소 제외, 국내 FX 별칭, Static QR 환경 분리를 기록했다. 어제 승인 후처리 주제 ID를 재사용하고 기존 TIL은 보존했다. 범위 테스트 기록과 전체 빌드·실제 DB·운영 확인의 한계를 구분하며 이번 TIL과 로그만 게시한다.

[2026-10-19] til | 파일별 결과와 진단·검증·전달 상태의 분리

공식 공휴일 자료를 확인하고 두 개발 루트의 중첩 저장소 17곳과 당일 세션 요약을 조사했다. 외부 소스 동기화는 학습 성과에서 제외했다. 오늘 TIL에 업로드 검증·부분 성공, 미등록 POS 진단, hook·테스트 정책, 현금영수증 설계 초안을 기록했다. 커밋된 구현·후속 미커밋 변경·미합의 설계와 실행 검증 한계를 구분했다. 기존 TIL과 다른 저장소의 변경은 보존하며 이번 TIL과 로그만 게시한다.

[2026-10-20] til | 실패 재시도와 사실 전달·설정·문서 보관의 경계

공식 공휴일 자료를 확인하고 두 개발 루트의 중첩 저장소 18곳과 당일 세션 요약·사용자 커밋을 조사했다. 오늘 TIL에 파일별 업로드 결과, 승인·취소 사실 후속 설계, 실시간 전송 목적지, 문서 보관 커밋 계약, HiPass 분기 조사 요청을 기록했다. 이전 업로드·승인 후처리 주제 ID와 날짜 링크를 재사용했다. 제품 실행·외부 연결·설계 완료를 과장하지 않고 기존 TIL을 보존하며 이번 TIL과 로그만 게시한다.

Last updated on