본문으로 건너뛰기
~/posts

모든 글

Brandon Wie의 모든 블로그 글

// 167 · all
ai-ml

Claude Code Agent Teams를 실제 작업에 쓰며 배운 점

Agent Teams의 현재 동작과 version별 pane 문제, 작업 소유권, 결과 전달 실패를 구분해서 정리한 사용 기록이에요.

ai-ml

Gemini 비대칭 Embedding 활용하기

Query와 document를 다르게 인코딩하면 검색 품질이 좋아져요. Gemini는 이걸 task_type 파라미터로 표현했고, 새 모델에서는 같은 아이디어가 prompt 안으로 옮겨갔어요.

backend

BeautifulSoup + lxml memory overhead: scraper에 크기 제한이 필요한 이유

httpx로 페이지를 받아 BeautifulSoup에 넘기는 scraper는 OOM 위험을 안고 있어요. 파싱한 DOM tree가 원본 HTML보다 훨씬 많은 메모리를 쓰기 때문이에요. streaming과 두 겹의 크기 거부로 정리한 과정이에요.

backend

FastAPI Dependency Injection 패턴

모든 라우트 핸들러에서 `Depends(get_current_user)`를 반복하면 보일러플레이트가 생기고 불일치가 발생하기 쉬워요

backend

FastAPI domain 예외 handler: 404여야 할 응답이 500으로 나갈 때

service layer에서 raise한 domain 예외는 FastAPI에 등록하기 전까지 전부 500으로 나가요. 계층 전체를 handler 하나로 묶으면서 알게 된 것과, review가 뒤늦게 짚어준 네 가지 함정을 정리했어요.

backend

PostgreSQL IN 절 파라미터 제한

PostgreSQL wire protocol은 파라미터 쿼리를 65,535개 바인드 파라미터로 제한해요. TypeORM의 `In([...])`을 500-1,000개로 쪼개면 실질적인 성능 한계 안에 머물러요.

backend

캘린더 동기화에서 Stale Record와 Orphan Record의 차이

Google Calendar API 동기화가 남기는 두 종류의 찌꺼기 행은 겉보기에 똑같지만 처리 방법은 정반대예요

backend

크로스 클라우드 이벤트 흐름을 위한 대칭형 Redis ↔ Kafka 브리지 페어

Cloud Run에서는 내부 Kafka 브로커에 닿지 못해요. `advertised.listeners`가 늘 발목을 잡거든요. Redis를 거치는 단방향 브리지 한 쌍이면 지켜야 할 조건을 전부 지킬 수 있어요.

backend

Sync Token 무효화 복구 (410 GONE)

Google Calendar API가 410 GONE을 반환하면 sync token이 무효화되고 전체 재동기화가 필요해요. 올바른 처리 방법을 알아봐요.

backend

AWS ECS/ALB에서의 WebSocket 아키텍처

ALB, ECS, Redis Pub/Sub를 활용한 실시간 알림용 WebSocket 연결 구조

devops

Bash set -e와 명령어 치환

set -e(에러 시 종료)를 사용할 때, 명령어 치환이 커스텀 에러 메시지와 함께 예상과 다르게 동작하는 경우.

devops

Claude Code: 공유 + 개인 AI 설정 패턴

AI 지시사항을 커밋되는 공유 레이어와 gitignore되는 개인 레이어로 분리해서 새 개발자는 즉시 AI 지시사항을 사용하고 기존 개발자는 개인 확장을 유지하는 패턴입니다.

devops

언어가 다른 CLI의 시작 시간, 정직하게 재보기

Rust로 다시 쓰면 Node script보다 5~10배는 빠를 줄 알았어요. 막상 재보니 1.3배 정도였는데 그 차이에서 배운 게 더 많았어요. 기준점을 되살리고, 입력을 고정하고, 차이가 어디서 났는지 따져본 이야기예요.

devops

DAG 배포 전략

Airflow DAG를 배포하는 다양한 방법과 트레이드오프 분석

devops

gcloud Logging `--freshness=N`은 "지금 기준 N시간 전"이지 "그 사건 이후"가 아니에요

`--freshness`는 명령을 실행한 순간부터 거꾸로 시간을 재요. 확인하려는 사건이 기준이 아니에요. 하루 뒤에 돌린 배포 후 검증 gate 조회는 정작 봐야 할 구간의 앞부분을 조용히 건너뛸 수 있어요. `timestamp>=` / `timestamp<=`로 양끝을 못박는 게 해법이에요.

devops

pre-commit hook race가 내 파일을 남의 커밋에 집어넣은 사건

한 저장소에 커밋하는 두 세션, 느린 pre-commit hook, 그리고 `fatal: cannot lock ref HEAD`. 시끄러운 실패는 쉬운 쪽이에요 — 조용한 실패는 내 staged 파일을 다른 세션의 커밋에 그쪽 메시지로 넘겨버려요.

devops

Prometheus TSDB 메모리 산정: observability 서비스는 왜 예산이 달라야 할까

LGTM stack의 메모리 제한을 옆 서비스에 맞춰 정하면서 Prometheus에 400m을 줬어요. Prometheus는 head block을 RAM에 들고 있거든요. 그 숫자에서는 flapping처럼 보이는 OOM 재시작 루프가 돌았어요.

devops

Terraform 상태 복구

Terraform state 파일이 AWS 실제 상태와 맞지 않을 때 복구하는 절차를 정리했어요.

general

Claude Code 전문가 워크플로우

세 명의 전문가 소스에서 합성한 Claude Code 활용 패턴: Boris Cherny(도구 설정), Mia Heidenstedt(프로세스 규율), YK Dojo(실무 워크플로우)

general

Markdownlint 컨벤션 가이드

200개 markdown 파일에서 쏟아진 markdownlint 에러 7,500개. 어떤 룰이 중요했는지, 어떤 설정이 끝까지 남았는지, nested scope에서만 드러나는 pre-commit 함정 두 가지, 그리고 18개짜리 custom config를 extends 한 줄과 carve-out 다섯 개로 줄인 strict-preset 마이그레이션 이야기예요.

security

디버깅하다가 `docker exec`로 인증 정보가 새는 두 가지 경로

컨테이너 진단 명령을 실행하기 전에 다시 읽어보다가, 평범해 보이는 명령 두 개가 broker URL을 password까지 통째로 스크롤백에 찍어낸다는 걸 발견했어요. `env | grep`과 `cli -u "$VAR"`가 왜 둘 다 새는지, `sh -c`로 감싸면 왜 위치만 옮겨지는지, 그리고 대신 쓰게 된 boolean 확인 방식을 정리했어요.

ai-ml

Claude, Copilot, Codex가 PR에서 보이는 13가지 패턴

Claude, Copilot, Codex가 PR에서 동작하는 열세 가지 방식 — 열 가지 실패 유형 + 두 가지 amplify할 productive behavior + 한 가지 analyst-side error class. 탐지 신호와 사실관계 충돌을 해결하는 empirical tiebreaker까지 정리했어요.

ai-ml

AI 코드 리뷰 패턴

AI 리뷰어(Claude, Copilot, Codex)가 잘못되거나 오해의 소지가 있는 피드백을 생성하는 패턴 정리.

ai-ml

RAG Hybrid Search 아키텍처

단일 검색 방식이 왜 실패하는지, 그리고 dense, sparse, fuzzy, managed search를 Reciprocal Rank Fusion으로 결합해서 시맨틱 이해와 키워드 정확도를 모두 잡는 검색 파이프라인을 만드는 방법.

aws

EBS vs EFS: AWS 스토리지 비교

EBS(블록 스토리지)와 EFS(네트워크 파일 시스템)를 언제 써야 하는지 정리.

aws

ECS Auto-Scaling 심층 분석

ECS auto-scaling의 알고리즘, 쿨다운, 비용 최적화 — 비례 제어를 이해하면 flapping과 과금 폭탄을 피할 수 있어요.

aws

ECS Autoscaling 패턴

Race condition 방지를 위한 마이그레이션 태스크 분리와 ECS 서비스 autoscaling 구현 가이드.

aws

Terraform RDS 자격증명 관리

하드코딩 대신 변수를 사용해서 RDS 자격증명을 안전하게 관리하는 방법.

aws

WAF Allowlist 패턴

라우트 allowlist를 사용한 block-by-default WAF 접근 방식. 알 수 없는 라우트가 자동 차단되어 blocklist보다 보안이 강해요.

aws

AWS WAF 구현

Allowlist 방식의 Web Application Firewall 설정 가이드.

backend

Amplitude ETL 파티셔닝

Amplitude 이벤트 데이터를 raw에서 refined 스토리지로 이동할 때 파티셔닝하는 방법

backend

Amplitude Export API 응답 형식

Amplitude Export API는 오해하기 쉬운 중첩 압축 형식으로 데이터를 반환해요

backend

조기 종료 시 Backfill 통계 매니페스트

조기 종료 경로가 있는 작업에서는 그 경로에서도 status 매니페스트를 써야 해요. 안 그러면 다운스트림 알림이 보여줄 게 없어요.

backend

배치 처리 트레이드오프

엔티티별 배칭과 크로스 엔티티 bulk INSERT 하나를 비교해요. 무엇을 측정했고, 무엇은 추정에 그쳤고, 왜 더 단순한 쪽을 유지했는지 정리했어요.

backend

Celery API-Side Dispatch 패턴

Worker의 task 모듈을 import하지 않고 API 서비스에서 별도의 worker 서비스로 task를 전달하는 send-only Celery 클라이언트 만들기

backend

class-transformer undefined 자체 속성 버그

ES2022+ TypeScript 타겟에서 plainToInstance()가 클래스 인스턴스를 생성할 때, 모든 optional 클래스 필드가 undefined 값을 가진 자체 속성이 돼요. 그 순간부터 키 존재 검사는 거짓말을 시작해요.

backend

멱등 부트스트랩 재시도를 위한 emitAsync 스탬프 게이팅

큐로 sync emit 후 "완료" 스탬프를 찍는 부트스트랩은 Redis가 잠깐 끊기면 다운스트림이 조용히 비어요. emitAsync가 enqueue 승인에 스탬프를 게이트해줘요.

backend

ETL 데이터 분리 전략

자동화된 ETL 데이터와 수동 백필 데이터를 같은 S3 경로에 섞어두면 추적, 처리, 디버깅이 어려워집니다

backend

Fallback 브랜치 테스트 커버리지 갭

테스트는 통과해요. 커버리지는 100%예요. `|| randomUUID()`를 지워도 모든 게 통과해요. 빌더 기반 fixture가 falsy 브랜치를 어떻게 숨기는가.

backend

FastAPI에서 startup dependency를 non-blocking으로 만들기

FastAPI의 lifespan code는 application이 request를 받기 전에 실행돼요. startup이 Kafka 같은 optional dependency를 await하면, 그 dependency 없이도 안전하게 route를 serve할 수 있는데도 Cloud Run cold start가 health check + E2E probe를 실패시킬 수 있어요.

backend

pandas itertuples() vs iterrows()

`iterrows()`는 DataFrame 행을 순회하는 가장 흔한 방법이지만, 매 행마다 pd.Series 객체를 생성해서 느립니다

backend

Keyword-Only 파라미터로 중복 함수 통합하기

두 모듈에 거의 동일한 함수가 존재할 때, Python의 keyword-only 파라미터로 하나로 통합하는 패턴을 소개합니다.

backend

Redis와 BullMQ 큐 패턴

Node.js/NestJS에서 Redis 기반 BullMQ 작업 큐를 사용한 백그라운드 작업 처리 가이드

backend

Sentry N+1 쿼리 감지

Sentry가 런타임에서 N+1 쿼리를 감지하는 방식, 병렬 실행으로 인한 오탐 사례, 그리고 해결 패턴.

backend

Stateless Auth DB 컬럼 Drift

Stateful 인증에서 stateless JWT 검증으로 마이그레이션했어요. 테스트는 통과해요. 모바일 사용자는 access_token이 채워져 있는데 웹 사용자는 NULL이에요. 이 drift는 ops가 컬럼을 쿼리하기 전까지 사용자 동작에서는 드러나지 않아요.

backend

Two-Phase Deletion 패턴

rollback이 없는 시스템을 위한 안전한 삭제 패턴 — 먼저 soft-delete하고, 외부 API가 확인해 준 뒤에만 hard-delete해요.

backend

TypeORM migration:generate는 schema drift 전체를 감지해요

TypeORM migration 생성 결과에 현재 feature와 무관한 SQL이 섞이는 이유와 local DB drift, 이미 배포한 migration 수정까지 구분해서 다루는 방법이에요.

backend

TypeScript Type Narrowing을 Assertion보다 우선하기

프로덕션 코드에서 non-null assertion(!)과 강제 캐스팅(as Type) 대신 type narrowing을 사용해야 하는 이유

backend

Typesense documents/import의 바이트 인식 vs 카운트 기반 청킹

Typesense bulk import를 위한 두 가지 청킹 전략. 잘못된 걸 고르면 어떤 파워 유저가 멀티-MB 문서를 만드는 날 조용히 실패해요.

backend

updatedAt 기반 Staleness Guard

비동기 업데이트(웹훅, 메시지 큐)를 받을 때 소스의 updatedAt과 로컬 타임스탬프를 비교해서 stale 데이터가 최신 변경을 덮어쓰지 않도록 보호하는 패턴.

data

Amplitude Export API의 타임존 처리 방식

Amplitude Export API가 이벤트 데이터 내보내기에서 타임존과 시간 경계를 처리하는 방식

devops

스스로 고치고, 그 고침마저 정리하는 harness

agent가 저지르는 가장 비싼 실수는 극적인 실수가 아니에요.

devops

AI PR 리뷰 검증 패턴

AI 코드 리뷰어(Claude, Copilot, Codex)가 오탐을 만드는 14가지 패턴과, triage를 빠르게 유지하는 분류 프레임워크 + 보강 주석 템플릿.

devops

Airflow CI/CD 개념

주방 비유를 통해 Airflow 배포와 CI/CD 개념을 이해해 봐요.

devops

Airflow DAG 수준 callback

Airflow 2.x는 DAG 수준의 on_success_callback을 조용히 무시해요. 제 환경에서는 task 수준 성공 callback만 동작해서, 성공 알림은 파이프라인 마지막 task에 붙여야 했어요.

devops

Airflow Manual DAG Config 패턴

수동 DAG 트리거 시 커스텀 파라미터를 전달하면서도 예약 실행은 그대로 유지하는 패턴이에요.

devops

boto3 S3 put_object() Body 파라미터 인코딩

ETL 파이프라인에서 JSON 매니페스트 파일을 S3에 업로드할 때 발생하는 파라미터 검증 에러와 해결 방법이에요.

devops

CLAUDE.md가 자꾸 넘칠 땐, budget을 generator로 옮기세요

trim할 때마다 몇 주 뒤면 "Large CLAUDE.md will impact performance" 경고가 돌아왔어요. byte budget을 author discipline에서 파일을 조립하는 generator로 옮기고 나서야 — per-rule warning, total hard-fail, rendered-file ceiling으로 — 완전히 멈췄어요.

devops

포워드 링크만 저장하기: 백링크를 계산하는 Zettelkasten

3B는 작성자가 관리할 수 있는 링크만 저장하고, 역방향 연결은 나중에 계산해요. 그래서 노트에 담긴 고민의 흔적까지 지식의 일부로 남아요.

devops

수동 merge gate로서의 두 단계 호출 패턴

CI/CD automation skill이 "all-in-one" mode(`/skill +flag`)를 지원할 때, all-in-one mode는 default가 아니라 opt-in이어야 해요. 호출을 분리하면 CI green과 되돌릴 수 없는 merge 사이에 의미 있는 일시정지 지점을 보존해요.

devops

Docker Compose CI/CD 패턴

CI/CD 파이프라인에서 Docker Compose를 쓰는 패턴. 개발과 프로덕션 설정 분리, ECR 연동, 배포 전략을 다뤄요.

devops

LibreOffice headless로 DOCX를 PDF로 안정적으로 내보내기

macOS Pages에서 흔들린 layout과 text layer를 LibreOffice headless와 네 단계 artifact 검증으로 확인한 사례예요.

devops

ECR 토큰 갱신 Cron

AWS ECR 인증 토큰은 12시간 후 만료돼요. 오래 실행되는 Docker 호스트에서는 자동 토큰 갱신을 구현해야 해요.

devops

ETL 스케줄 타이밍

데이터 도착 패턴에 맞는 ETL 스케줄을 설정하는 방법을 알아봐요.

devops

폴더가 곧 운명이다: 6계층 정보 생애주기

3B는 폴더 위치만으로 검색 가능 여부, 공개 범위, 노화 정도를 결정해요. 물리적 위치와 의미가 어긋나는 경우에만 frontmatter로 예외를 둬요.

devops

GitHub PR Review API - 인라인 코멘트

GitHub API와 gh CLI로 PR 리뷰에 인라인 코멘트를 다는 방법

devops

하이브리드 CI: 셀프 호스팅 Jenkins + GitHub Actions

하나의 CI 시스템만 쓸 이유가 없어요. 컴퓨팅 집약 작업은 셀프 호스팅 Jenkins로, OIDC가 필요한 PR 게이트는 GitHub Actions로 나누는 방법이에요.

devops

Markdownlint Pre-Commit: MD041 + MD001 heading 함정

YAML frontmatter가 있는 새 markdown 파일에 husky pre-commit을 반복적으로 막는 두 가지 markdownlint 규칙. 둘 다 조용히 fire되고, --fix로 자동 수정되지 않으며, 보통 같이 나타나요 — 하나를 고치면 다른 하나가 노출돼요.

devops

충돌 없이 agent 병렬로 굴리기: Task, Worktree, Lock

agent 병렬 작업은 Git 문제처럼 보이지만, 더 어려운 실패는 어떤 task를 이미 누가 소유했는지 session이 모른다는 데 있어요. task, worktree, lock 디렉터리로 그 소유권을 명시적으로 만드는 이야기예요.

devops

Python 툴링 스택

파편화된 Python 툴링을 asdf, uv, ruff, ty, pre-commit 다섯 개로 정리한 과정과 각각을 선택한 이유

devops

Ruff 3중 게이트 프리플라이트

한 번의 push가 CI 사이클 세 번으로 늘어나면서 깨달은 사실 — CI에서 Ruff는 독립적인 게이트 세 개예요. 4줄짜리 셸 함수면 이 루프를 막을 수 있어요.

devops

S3 경로 정규화 패턴

S3 key prefix에 일관된 trailing slash를 보장하는 정규화 패턴

devops

state-invariant flag drift — reconciliation pass로 복구하기

boolean lifecycle flag가 클리어 코드 경로에 절대 도달하지 못하는 entry들에 계속 끼는 현상이 있었어요. 증상만 고치는 fix는 계속 재발했고, 진짜 해결은 setter나 clearer 어느 쪽이 어떻게 set했든 상관없이 flag가 함의하는 invariant를 강제하는 세 번째 workflow를 추가하는 거였어요.

devops

Stow Symlink 상태 점검

GNU Stow가 만든 symlink이 앱 업데이트로 깨지는 문제를 감지하고 복구하는 방법을 알아봐요.

devops

Wrap Skill Follow-Up 영속화 아키텍처

session-state 대시보드를 매번 오늘 journal 하나만 보고 다시 만들면, 이전 session에서 풀리지 않은 follow-up이 rebuild할 때마다 조용히 사라져요. 단일 source 탐색 + 대화에서만 언급된 항목과 겹치면 동시에 세 갈래로 증발해요. 해결책은 4-layer 아키텍처예요.

frontend

SvelteKit: `+layout.ts`에서 공유 store를 사이트 전역으로 hydration하기

한 페이지의 `onMount`로만 채우는 공유 `writable` store는 다른 모든 route에서 비어 있어요. 루트 `+layout`에서 한 번만 hydration하면 모든 navigation에서 데이터가 따라와요.

general

문서화 패턴

Buffer Pattern은 AI 지원 세션에서 중요한 발견을 보존해요. 세션이 끝나거나 연결이 끊겨도 소중한 인사이트를 잃지 않도록 해주죠.

general

Empirical Close: 자연스러운 trigger에 skill-side test를 맡기기

어떤 verification test는 fixture로 충실히 재현되지 않는 진짜 trigger가 필요해요 — 대화형 prompt, 대화 파싱, AskUserQuestion flow. test를 [~] empirical-close-pending으로 표시하고 다음 자연스러운 trigger가 verify해 주리라 믿는 건, friction-log reopen과 짝지을 때 위생적인 선택이에요.

general

Task를 다시 잡을 때 plan과 실제 shipped 상태가 어긋나는 순간

여러 세션에 걸친 task를 다시 잡으면, 처음 작성한 plan.md가 지금 main에 반영된 모습과 어긋나 있을 때가 많아요. 구현은 도중에 바뀌고, 범위는 옮겨가고, branch는 어느새 merge돼요. 3분짜리 pre-flight check 하나면 한참 동안 obsolete된 작업을 붙들고 있는 시간을 막아줘요.

general

Recharts 다크 테마 커스터마이징

Recharts 차트를 다크 터미널 테마에 맞게 스타일링하는 방법을 CSS 변수와 커스텀 컴포넌트를 통해 설명합니다.

general

Session-State Dashboard: overwrite 말고 merge하기

세션을 가로지르는 dashboard를 다시 만드는 두 가지 방법 — overwrite, 그리고 merge-with-carry-forward — 는 정반대 방향으로 실패해요. 제가 정착한 규칙, 그리고 결국 dashboard를 git에서 아예 추적하지 않게 된 이유를 정리했어요.

general

LLM-robust한 skill 전제조건은 산문보다 체크리스트가 나아요

산문 형태로 쓴 복합 전제조건은 컨텍스트 부담이 커지면 조용히 어긋나요. 절 하나당 체크박스 하나로 명시적인 체크리스트로 바꾸면 전제조건이 LLM 앞에서도 견고해지고, 실제 버그였던 숨은 절들도 드러나요.

google

Google Calendar 동기화 전략

Full sync와 incremental sync는 비슷해 보이지만, 응답에 없다는 사실이 정반대를 의미해요.

google

Google Meet 링크 생성

프로그래밍 방식으로 Google Meet 링크를 생성하면서 배운 교훈이에요.

google

Google Calendar 반복 일정 연산

반복 일정의 `all`, `this`, `thisAndFollowing` 업데이트 구현 패턴이에요.

icalendar

외부 캘린더 데이터 정규화

외부 캘린더 클라이언트는 비표준 RRULE과 타임존 데이터를 내보내서 rrule.js 파싱을 깨뜨려요. 경계에서 정규화 레이어로 처리하는 방법과, offset 매핑 테이블이 숨기고 있던 DST 함정을 정리했어요.

icalendar

부분 접근 반복 일정

시리즈 중간부터 초대받은 사용자에게는 Google Calendar가 부모 일정을 걸러내요. "부모가 없으면 삭제된 시리즈"라고 가정한 orphan 정리 로직은 살아 있는 일정을 지워버려요.

icalendar

rrule BYDAY 타임존 보정

rrule JavaScript 라이브러리가 BYDAY 요일을 이벤트 타임존이 아닌 UTC로 해석하는 문제와 해결 방법을 정리했어요.

icalendar

RRULE EXDATE 타임존 파싱 문제

rrule JavaScript 라이브러리에서 EXDATE가 RRULE보다 먼저 오거나 TZID 파라미터가 있으면 파싱이 제대로 안 됩니다. 해결 방법을 알아봅니다.

payments

Lemon Squeezy 구독 lifecycle 관리

구독 취소, 유예 기간, 만료, 재활성화와 기존 구독의 가격 변경을 구현하며 확인한 lifecycle 경계예요.

security

바이너리 체크섬 검증

SHA256 체크섬을 사용해 다운로드한 바이너리가 변조되지 않았는지 검증하는 방법

security

타입 수준 필수 파라미터로 IDOR 방지하기

optional 파라미터 하나가 repository 메서드를 IDOR 위험으로 만들었어요. userId를 required로 바꾸니 보안 검사가 컴파일 타임으로 옮겨갔어요.

security

인프라 보안 강화 체크리스트

AWS 인프라 보안 강화 체크리스트예요. 네트워크 격리, WAF 배포, 그리고 같은 작업에서 따라온 비용 절감을 다뤄요.

security

OAuth 2.0 구현 패턴

백엔드 서비스에서 OAuth 2.0 플로우를 구현하기 위한 실용적 패턴

security

Traefik, Keycloak, ForwardAuth 이해하기

Traefik을 통해 노출된 Kubernetes 서비스에 인증 레이어가 없는 문제를 해결하는 방법

ai-ml

Multi-Agent 메시지 경쟁에서 HOLD를 안전하게 다루는 법

비동기 agent mailbox에서 명령과 완료 보고가 엇갈릴 때 target state, idempotent guard, live evidence로 중복 실행을 막는 방법이에요.

backend

class-validator의 @IsHexColor는 alpha hex도 허용해요

@IsHexColor()가 허용하는 3, 4, 6, 8자리 형식과 normalizer의 범위가 어긋날 때 생기는 문제를 정리했어요.

backend

사용자 단위 transaction으로 backfill 원자성 지키기

여러 row를 함께 옮겨야 하는 backfill에서 사용자별 transaction, prevalidation, idempotent update, keyset pagination을 조합한 방법이에요.

devops

claude-code-action workflow를 설정하며 놓치기 쉬운 것들

Claude Code Action의 SHA 고정, job 권한, issue_comment branch 동작, model 선택을 서로 다른 설정 레이어로 나눠 점검한 기록이에요.

aws

ECR/ECS 배포 워크플로우

Amazon ECR과 ECS를 사용한 컨테이너 배포 전체 과정 — 인증부터 롤링 업데이트, 트러블슈팅까지 정리했어요.

devops

Codex Skill Mirror 패턴

`.agents/skills/`를 정식 skill 출처로 두는 repo에서 Codex를 깔끔하게 붙이는 방법은 통째로 교체하거나 통째로 심볼릭링크하는 게 아니에요. 정식 출처는 그대로 두고, 필요한 skill에만 어댑터를 다는 mirror 레이어가 답이에요.

devops

tmux 스마트 세션 자동 시작

iTerm2 Profile Command(`tmux-smart-attach`)로 tmux를 자동 시작해서, 새 터미널 창마다 독립된 tmux 세션을 갖고 닫힌 창의 세션은 재사용하는 방법이에요.

google

Google Calendar API: 반복 일정 업데이트

반복 일정에서 "이 일정만", "이후 모든 일정", "전체 일정" 업데이트를 처리하는 방법이에요.

devops

스스로 길을 찾는 rule: 로더가 된 frontmatter

3B에서 YAML frontmatter는 장식용 메타데이터가 아니에요. 어떤 agent가 어떤 rule을 언제, 어떤 모습으로 보게 될지 정하는 라우팅 언어예요.

devops

같은 skill, 세 가지 전달 방식

skill은 한 번만 작성해도 agent마다 다르게 전달돼요. Claude는 canonical 바이트를 symlink로 풀어서 읽고, Codex는 버전이 고정된 adapter를 읽고, AGY는 native 탐색과 plugin 실행 가능 여부를 따로 나눠요.

devops

토큰 스택: 다시 스캔하지 않는 네 겹의 코드 인텔리전스

agent가 context를 태우는 문제에 흔히 나오는 답은 "memory를 붙이자"예요.

devops

게이트 세 개와 감사 로그: agent harness를 위한 HITL

agent workflow의 첫 버전은 보통 안전 규칙이 하나뿐이에요. 위험한 일을 하기 전에 물어봐라.

devops

세션 엔진: /wrap, 클린 슬레이트 rollup, 그리고 세션을 넘나드는 buffer

에이전트 작업은 잘못 고쳤을 때만 실패하지 않아요. 다음 세션이 무슨 일이 있었는지 모를 때도 실패해요.

devops

꺼 둔 Claude 플러그인을 업데이터가 자꾸 다시 켜는 이유

플러그인 몇 개를 일부러 꺼 두고 업데이터를 돌렸더니 다시 켜져 있었어요. 스크립트는 아무것도 다시 켠 적이 없다고 증명할 수 있었는데, 애초에 다시 켜는 건 스크립트가 하는 일이 아니었거든요. 이 반복 작업을 멈춰 준 snapshot-and-reassert guard를 정리했어요.

devops

`gh pr view`의 head-branch 모호성(false negative)

PR이 멀쩡히 열려 있고 branch도 정확히 추적되는데, `gh pr view --json number,state`가 "no pull requests found"를 뱉을 수 있어요. 이 빈 결과는 "PR이 없다"가 아니라 "gh의 branch resolution이 못 찾았다"는 뜻이에요.

devops

Serena MCP — Claude Code 다중 프로필 설정 (cpers/cwork)

Claude Code 이중 프로필 환경(cpers/cwork)과 Codex에 Serena MCP server를 설치하는 전체 절차. 권장 hook 4개, system-prompt 교체, 그리고 설치 도구가 기본 ~/.claude.json에만 쓰고 프로필별 저장소는 놓치는 함정까지 다뤄요.

devops

심볼릭 링크 감지: `test -L` vs `realpath`

POSIX 함정. `test -L child/leaf`는 상위 디렉토리가 심볼릭 링크일 때 false를 반환해요. 체인 자체는 건강한데도요. SoT 체인 검증에는 `realpath`를 써야 해요.

general

Claude Code 멀티 프로필 HUD 설정

Claude Code를 여러 계정(개인 + 업무)으로 운영할 때 HUD 플러그인이 올바른 계정별 사용량 통계를 표시하도록 설정하는 방법

backend

tokio로 다루는 Rust async 채널

tokio의 mpsc, unbounded mpsc, oneshot 채널 중 무엇을 고를지는 성능 문제가 아니라 스트림이냐 핸드오프냐의 문제예요.

frontend

Svelte: async `onMount`의 반환값은 cleanup이 아니에요

Svelte는 `onMount`가 반환한 값을 언마운트 시 cleanup으로 실행해요 — 단, 그 값이 함수일 때만요. `async` 콜백은 Promise를 반환하기 때문에 cleanup이 조용히 무시돼요.

devops

Anthropic Prompt Cache TTL과 비용 메커니즘

Anthropic이 2026년 3월 초쯤 Claude Code의 prompt cache TTL을 1시간에서 5분으로 조용히 줄였어요. 이걸 모르면 메시지 사이에 5분 이상 비는 순간 cache가 날아가고, 다음 메시지에 전체 conversation prefix를 처음부터 다시 써야 해요. 기본 입력 단가의 1.25배짜리 비용으로요.

devops

One Folder, Three Agents: `.agents/` Source of Truth

폴더 하나와 generator로 세 AI agent가 같은 규칙을 따르게 만드는 방법.

frontend

SvelteKit용 Paraglide-JS i18n

번들을 부풀리지 않고 런타임 오버헤드 없이 SvelteKit 정적 블로그에 한국어/영어 다국어 지원을 추가한 방법을 정리했어요.

ai-ml

검색 실패는 재시도하지 말고 진단하세요

검색 결과가 부실할 때 우리는 반사적으로 재시도를 떠올려요. 하지만 Wei et al.(2026)은 out-of-distribution 쿼리에서 재시도가 오히려 오류를 키운다는 걸 보여줍니다. 재시도 대신 실패를 진단하세요.

devops

watcher hook 아래서 `git rev-parse HEAD`와 `git log -1`이 어긋날 때

`gh pr merge` 끝내고 로컬에서 pull 받았는데, `git rev-parse HEAD`는 올바른 merge commit을 가리키고 `git log -1`은 방금 merge로 사라진 feature branch tip을 몇 초간 보여줬어요. checkout 도중에 graphify watcher rebuild가 돌고 있었어요. low-level ref 읽기가 권위 있고, log 렌더링은 늦어질 수 있어요.

ai-ml

Codex `apply_patch`는 직접 도구가 아니라 셸 매개 도구예요

Codex CLI에는 별개의 편집 도구가 없어요. 파일 편집은 `local_shell`을 통해 `apply_patch` 패치 텍스트로 흘러요. 크로스-에이전트 훅은 도구 이름 매처가 아니라 페이로드 파싱 래퍼가 필요해요.

ai-ml

크로스-에이전트 스킬 별칭 일반화

Claude Code, Codex, Gemini가 함께 쓰는 스킬은 한 에이전트의 MCP 도구 별칭을 하드코딩하면 깨져요. 두 단계 패턴 — frontmatter에 두 별칭 패밀리를 모두 선언하고, 본문 prose에는 일반 이름만 써요.

devops

표준 라이브러리만으로 헬퍼 이식성 확보하기

여러 에이전트로 배포되는 헬퍼는 CI에서 비-stdlib 의존성에 기댈 때 깨져요. 표준 라이브러리만 쓰도록 묶어 두세요. PyYAML, npm 패키지, BSD/GNU sed 플래그가 단골 함정 셋이에요.

general

스키마 버전 관리되는 헬퍼 출력 엔벨롭

크로스-에이전트 헬퍼 스크립트를 위한 JSON 출력 엔벨롭 — schema_version, status, error, agent, ts. 안정적인 모양, semver로 올릴 수 있고, 에러를 구분해 줘요.

ai-ml

Phase A→B 분류기 배포: 제로샷에서 파인튜닝까지

라벨링된 데이터 없이 첫날부터 동작하는 인텐트 분류기를 배포하고, 예시가 모이면 도메인 특화 모델로 졸업하는 방법을 알아보세요.

ai-ml

논문 6편, 적용 0개 — 훈련된 읽기로 보낸 한 주

DAIR.AI 4월 6-12일 배치에서 논문 6편을 읽고 3가지 공통 theme을 뽑았지만, 3B에는 한 줄도 적용하지 않았어요. Pattern A(theme saturation before action)가 실제로 어떻게 동작하는지 보여주는 weekly synthesis예요.

devops

JSONL transcript로 Claude Code turn latency 측정하기

이미 disk에 쌓여 있는 JSONL transcript를 파싱해서 Claude Code session의 per-turn latency를 ground-truth로 측정한 이야기. 그 과정에서 스스로 잡아낸 네 가지 측정 trap도 같이 정리했어요.

backend

NestJS @Headers decorator는 string | undefined를 리턴해요

NestJS `@Headers('key')`는 `string[]`가 아니라 `string | undefined`를 리턴해요. Express가 중복된 custom header를 쉼표로 합쳐 주거든요.

backend

NestJS Swagger: content가 있으면 type은 조용히 무시돼요

`@ApiResponse`에 `type`과 `content`를 같이 넣으면 NestJS Swagger가 `type`을 조용히 떨어뜨려요. 그래서 DTO가 Swagger UI Models 탭에 안 나타나요.

devops

macOS VSCode 터미널 locale fallback 문제

macOS에서 VSCode integrated terminal이 조용히 비영어 locale로 바뀔 수 있어요. `git status`가 갑자기 한국어로 말하는 이유, 그리고 `settings.json`에 `LANG`을 고정하는 방법이에요.

ai-ml

Karpathy가 설명하기 전에 이미 만들어 놓았다

Andrej Karpathy가 LLM 기반 지식 관리 시스템 패턴을 발표했는데, 이미 몇 달째 운영하고 있던 시스템과 놀라울 정도로 같았어요. 비교에서 알게 된 것들을 공유해요.

ai-ml

LLM 파인튜닝 전략

LLM 기반 애플리케이션을 구축할 때 프롬프트 엔지니어링, RAG, LoRA 파인튜닝 중 어떤 접근법을 선택할지에 대한 실용적인 의사결정 프레임워크예요.

ai-ml

모델 드리프트 감지를 위한 PSI(Population Stability Index)

배포된 분류기의 입력 분포가 학습 데이터에서 벗어나는 것을 정확도가 떨어지기 전에 감지하는 경량 통계 메트릭을 알아보세요.

devops

Anthropic MCP 컨텍스트 예산 최적화

Anthropic 호스팅 MCP 통합이 세션 시작 시 컨텍스트 윈도우에서 ~71K 토큰을 소비해요 — 호출하지 않아도요. 이 예산을 되찾는 방법을 알아보세요.

devops

Docker 서브넷 충돌과 Static IP 서비스

여러 Docker Compose 프로젝트가 커스텀 브리지 네트워크를 정의하면 서브넷이 조용히 충돌할 수 있어요. 진단하고 해결하는 방법을 알아보세요.

general

PortAudio의 오래된 USB 오디오 디바이스 핸들 문제

PortAudio를 사용하는 장기 실행 오디오 데몬이 USB 디바이스 핸들이 오래되면 조용히 제로 버퍼를 생성해요. 진단하고 해결하는 방법을 알아보세요.

ai-ml

다음 지능 폭발은 사회적이지, 계산적이지 않다

Google 논문이 주장합니다 — 역사 속 모든 주요 지능 폭발은 개인의 인지 능력이 아닌 사회적 조직에서 비롯되었으며, AI도 같은 패턴을 따를 것이라고.

backend

PostgreSQL에서 pgvector HNSW 인덱스 활용하기

semantic search를 위해 별도의 vector database가 필요하지 않아요 — pgvector의 HNSW 인덱스는 10만 건 이하의 vector에서 95% 이상의 recall을 PostgreSQL 안에서 바로 제공해요.

aws

NAT Gateway 아키텍처

NAT Gateway 배치와 VPC 네트워크 흐름 이해하기.

aws

AWS Security Group 기초

Security Group의 stateful 동작, 최소 권한 원칙, 실전 패턴 — 연결 안 되는 원인 1위를 파헤쳐요.

aws

Terraform 기초

AWS 인프라 관리를 위한 핵심 Terraform 개념 정리.

backend

Calendar EXDATE 동작: Apple vs Google

Apple Calendar과 Google Calendar이 반복 일정 삭제를 처리하는 방식의 차이

backend

CPU Cache Locality를 활용한 배치 필드 추출 최적화

같은 배열에 대해 여러 번 `.map()`을 호출하면 CPU가 매번 객체를 메모리에서 다시 불러와야 합니다

backend

DataSource vs Repository 패턴

NestJS/TypeORM 애플리케이션에서 직접 DataSource 사용과 Repository 패턴 중 선택하기 위한 아키텍처 결정 가이드.

backend

NestJS WebSocket 레퍼런스

NestJS에서 WebSocket 기능을 구현하기 위한 종합 레퍼런스.

backend

TypeORM으로 PostgreSQL Advisory Lock 사용하기

PostgreSQL이 관리하는 애플리케이션 수준의 lock으로 분산 환경에서 작업을 조율하는 방법.

backend

TypeORM CLI와 NestJS DataSource 충돌

TypeORM CLI를 NestJS 프로젝트에서 사용할 때 발생하는 연결 충돌 문제와 해결 방법.

backend

Webhook vs 사용자 활동

외부 서비스의 webhook은 그쪽의 활동을 나타내는 것이지, 우리 사용자의 활동이 아니에요. 이 구분이 리소스 관리에 중요해요.

devops

Airflow Celery Worker 로그 서버 설정

CeleryExecutor를 사용할 때 워커가 별도 머신에 있으면 웹서버가 HTTP로 로그를 가져와야 합니다. hostname 설정이 잘못되면 로그 URL에 호스트가 비어서 에러가 납니다.

devops

Airflow DAG start_date와 수동 트리거

DAG를 수동으로 트리거할 때, 트리거 날짜가 start_date보다 이전이면 Airflow가 task 실행을 건너뛸 수 있어요.

devops

Airflow Task 의존성 구문

Airflow의 >> 연산자는 task 의존성을 설정하고 downstream task를 반환해요.

devops

Claude Code PostToolUse Hooks

PostToolUse hook은 도구 실행이 끝난 뒤 발동해요. session 정보, 도구 이름, 입력값, 결과, 작업 디렉토리가 들어 있는 JSON을 stdin으로 받아요.

devops

ECR Credential Helper

ECR 인증 토큰 만료 문제를 해결하는 AWS 공식 credential helper 설정 방법

devops

Linux 기초

컨테이너를 위한 필수 Linux 개념: cgroups, snapshotters, 권한, ACLs

devops

MinIO로 로컬 S3 구축하기

Docker로 실행하는 S3 호환 오브젝트 스토리지 MinIO 설정 가이드

devops

uv.lock 모범 사례

uv.lock을 버전 관리에 커밋해야 하는지에 대한 가이드

frontend

Giscus SvelteKit 통합하기

데이터베이스나 인증 백엔드 없이 정적 생성 SvelteKit 블로그에 댓글 시스템을 추가하는 방법을 알아봅니다.

frontend

모바일 Input UX

커스텀 스타일 input이 모바일 브라우저에서 제대로 동작하도록 만드는 기법을 알아봅니다.

frontend

Svelte 5 $effect Rune

Svelte 5에서 $effect rune의 자동 의존성 추적, cleanup, 그리고 $derived 및 onMount와의 차이를 알아봅니다.

general

CSS Inline-Replaced 요소의 하단 갭

`<textarea>`, `<img>`, `<input>`, `<video>` 같은 요소는 CSS에서 inline-replaced 요소예요. 기본적으로 텍스트 baseline 위에 놓여서 신비한 하단 갭이 생겨요.

general

macOS Keychain 다중 계정 동작 방식

macOS Keychain은 같은 서비스 이름에 다른 계정 속성을 가진 여러 항목을 허용합니다. 이로 인한 인증 버그를 디버깅하고 해결하는 방법을 다룹니다.

general

React 데모 파이프라인 패턴

백엔드 없이 완전히 작동하는 React 대시보드 데모 모드를 구축하는 패턴을 소개합니다.

general

shadcn/ui 수동 설정 (Vite + Tailwind)

Vite + React + TypeScript + Tailwind CSS 프로젝트에서 shadcn CLI 없이 shadcn/ui 컴포넌트 프리미티브를 수동으로 설정하는 방법이에요.

general

Claude Code 스킬에서 zsh 백틱 평가 문제

SKILL.md 파일의 백틱 마크다운 포맷이 zsh 명령어 치환 에러를 일으키는 문제와 해결법을 정리했어요.

backend

Alembic과 Async SQLAlchemy 설정하기

SQLAlchemy의 async engine과 함께 Alembic migration을 설정하는 방법

aws

AWS VPC 네트워킹 기초

CIDR 계산, NAT Gateway 배치, Route Table — 왜 다들 처음에 헤매는지, 어떻게 제대로 잡는지 정리했어요.

backend

Race Condition 방지를 위한 Pessimistic Locking

INSERT 전 존재 여부를 확인할 때 race condition을 방지하기 위해 SELECT FOR UPDATE를 사용하는 방법.

enko