All Posts
WAF Allowlist 패턴
라우트 allowlist를 사용한 block-by-default WAF 접근 방식. 알 수 없는 라우트가 자동 차단되어 blocklist보다 보안이 강해요.
Redis와 BullMQ 큐 패턴
Node.js/NestJS에서 Redis 기반 BullMQ 작업 큐를 사용한 백그라운드 작업 처리 가이드
AI PR 리뷰 검증 패턴
AI 코드 리뷰어(Claude, Copilot, Codex)가 오탐을 만드는 흔한 패턴과 재발 방지 방법.
Claude Code Agent Teams
여러 Claude Code 인스턴스를 팀으로 조율하는 실험적 기능의 설정, 패턴, 주의사항을 알아봅니다.
Gemini 비대칭 Embedding 활용하기
Gemini text-embedding-004는 task_type을 통해 query와 document를 다르게 인코딩하는 asymmetric embedding을 지원하며, symmetric 모델보다 훨씬 나은 검색 결과를 만들어줘요.
RAG Hybrid Search 아키텍처
단일 검색 방식이 왜 실패하는지, 그리고 dense, sparse, fuzzy, managed search를 Reciprocal Rank Fusion으로 결합해서 시맨틱 이해와 키워드 정확도를 모두 잡는 검색 파이프라인을 만드는 방법.
PostgreSQL에서 pgvector HNSW 인덱스 활용하기
semantic search를 위해 별도의 vector database가 필요하지 않아요 — pgvector의 HNSW 인덱스는 10만 건 이하의 vector에서 95% 이상의 recall을 PostgreSQL 안에서 바로 제공해요.
EBS vs EFS: AWS 스토리지 비교
EBS(블록 스토리지)와 EFS(네트워크 파일 시스템)를 언제 사용해야 하는지 정리.
ECS Autoscaling 패턴
Race condition 방지를 위한 마이그레이션 태스크 분리와 ECS 서비스 autoscaling 구현 가이드.
NAT Gateway 아키텍처
NAT Gateway 배치와 VPC 네트워크 흐름 이해하기.
AWS Security Group 기초
Security Group의 stateful 동작, 최소 권한 원칙, 실전 패턴 — 연결 안 되는 원인 1위를 파헤쳐요.
Terraform 기초
AWS 인프라 관리를 위한 핵심 Terraform 개념 정리.
Terraform RDS 자격증명 관리
하드코딩 대신 변수를 사용해서 RDS 자격증명을 안전하게 관리하는 방법.
AWS WAF 구현
Allowlist 방식의 Web Application Firewall 설정 가이드.
Amplitude ETL 파티셔닝
Amplitude 이벤트 데이터를 raw에서 refined 스토리지로 이동할 때 파티셔닝하는 방법
Amplitude Export API 응답 형식
Amplitude Export API는 오해하기 쉬운 중첩 압축 형식으로 데이터를 반환해요
조기 종료 시 Backfill 통계 매니페스트
조기 종료 경로가 있는 작업에서는 항상 stats/status 매니페스트를 저장해서 다운스트림 콜백이 유의미한 정보를 표시할 수 있게 해야 해요.
Calendar EXDATE 동작: Apple vs Google
Apple Calendar과 Google Calendar이 반복 일정 삭제를 처리하는 방식의 차이
Celery API-Side Dispatch 패턴
Worker의 task 모듈을 import하지 않고 API 서비스에서 별도의 worker 서비스로 task를 전달하는 send-only Celery 클라이언트 만들기
class-transformer undefined 자체 속성 버그
ES2022+ TypeScript 타겟에서 plainToInstance()가 클래스 인스턴스를 생성할 때, 모든 optional 클래스 필드가 undefined 값을 가진 자체 속성이 되는 문제.
CPU Cache Locality를 활용한 배치 필드 추출 최적화
같은 배열에 대해 여러 번 `.map()`을 호출하면 CPU가 매번 객체를 메모리에서 다시 불러와야 합니다
DataSource vs Repository 패턴
NestJS/TypeORM 애플리케이션에서 직접 DataSource 사용과 Repository 패턴 중 선택하기 위한 아키텍처 결정 가이드.
ETL 데이터 분리 전략
자동화된 ETL 데이터와 수동 백필 데이터를 같은 S3 경로에 섞어두면 추적, 처리, 디버깅이 어려워집니다
NestJS WebSocket 레퍼런스
NestJS에서 WebSocket 기능을 구현하기 위한 종합 레퍼런스.
pandas itertuples() vs iterrows()
`iterrows()`는 DataFrame 행을 순회하는 가장 흔한 방법이지만, 매 행마다 pd.Series 객체를 생성해서 느립니다
TypeORM으로 PostgreSQL Advisory Lock 사용하기
PostgreSQL이 관리하는 애플리케이션 수준의 lock으로 분산 환경에서 작업을 조율하는 방법.
PostgreSQL IN 절 파라미터 제한
TypeORM의 `In([...])` 연산자로 대량 ID를 쿼리하면 생성된 SQL이 ID당 하나의 바인드 파라미터를 만들어 성능이 저하됩니다
Keyword-Only 파라미터로 중복 함수 통합하기
두 모듈에 거의 동일한 함수가 존재할 때, Python의 keyword-only 파라미터로 하나로 통합하는 패턴을 소개합니다.
Sentry N+1 쿼리 감지
Sentry가 런타임에서 N+1 쿼리를 감지하는 방식, 병렬 실행으로 인한 오탐 사례, 그리고 해결 패턴.
캘린더 동기화에서 Stale Block과 Orphan Block의 차이
Google Calendar API 동기화 시 발생하는 두 가지 정리 시나리오와 각각의 처리 전략
Sync Token 무효화 복구 (410 GONE)
Google Calendar API가 410 GONE을 반환하면 sync token이 무효화되고 전체 재동기화가 필요해요. 올바른 처리 방법을 알아봐요.
TypeORM CLI와 NestJS DataSource 충돌
TypeORM CLI를 NestJS 프로젝트에서 사용할 때 발생하는 연결 충돌 문제와 해결 방법.
TypeScript Type Narrowing을 Assertion보다 우선하기
프로덕션 코드에서 non-null assertion(!)과 강제 캐스팅(as Type) 대신 type narrowing을 사용해야 하는 이유
updatedAt 기반 Staleness Guard
비동기 업데이트(웹훅, 메시지 큐)를 받을 때 소스의 updatedAt과 로컬 타임스탬프를 비교해서 stale 데이터가 최신 변경을 덮어쓰지 않도록 보호하는 패턴.
Webhook vs 사용자 활동
외부 서비스의 webhook은 그쪽의 활동을 나타내는 것이지, 우리 사용자의 활동이 아니에요. 이 구분이 리소스 관리에 중요해요.
Amplitude Export API의 타임존 처리 방식
Amplitude Export API가 이벤트 데이터 내보내기에서 타임존과 시간 경계를 처리하는 방식
Airflow Celery Worker 로그 서버 설정
CeleryExecutor를 사용할 때 워커가 별도 머신에 있으면 웹서버가 HTTP로 로그를 가져와야 합니다. hostname 설정이 잘못되면 로그 URL에 호스트가 비어서 에러가 납니다.
Airflow CI/CD 개념
주방 비유를 통해 Airflow 배포와 CI/CD 개념을 이해해 봐요.
Airflow DAG 수준 Callback
Airflow 2.x는 DAG 수준의 on_success_callback을 무시해요. task 수준 callback만 동작해요.
Airflow DAG start_date와 수동 트리거
DAG를 수동으로 트리거할 때, 트리거 날짜가 start_date보다 이전이면 Airflow가 task 실행을 건너뛸 수 있어요.
Airflow Manual DAG Config 패턴
수동 DAG 트리거 시 커스텀 파라미터를 전달하면서도 예약 실행은 그대로 유지하는 패턴입니다.
Airflow Task 의존성 구문
Airflow의 >> 연산자는 task 의존성을 설정하고 downstream task를 반환해요.
Bash set -e와 명령어 치환
set -e(에러 시 종료)를 사용할 때, 명령어 치환이 커스텀 에러 메시지와 함께 예상과 다르게 동작하는 경우.
boto3 S3 put_object() Body 파라미터 인코딩
ETL 파이프라인에서 JSON 매니페스트 파일을 S3에 업로드할 때 발생하는 파라미터 검증 에러와 해결 방법입니다.
Claude Code PostToolUse Hooks
PostToolUse hook은 도구 실행 완료 후 발생하며, stdin으로 세션 정보, 도구 이름, 입력, 결과, 작업 디렉토리가 포함된 JSON을 받습니다.
DAG 배포 전략
Airflow DAG를 배포하는 다양한 방법과 트레이드오프 분석
Docker Compose CI/CD 패턴
CI/CD 파이프라인에서 Docker Compose를 사용하는 패턴. 특히 개발과 프로덕션 설정을 분리하는 방법.
ECR Credential Helper
ECR 인증 토큰 만료 문제를 해결하는 AWS 공식 credential helper 설정 방법
ECR 토큰 갱신 Cron
AWS ECR 인증 토큰은 12시간 후 만료돼요. 오래 실행되는 Docker 호스트에서는 자동 토큰 갱신을 구현해야 해요.
ETL 스케줄 타이밍
데이터 도착 패턴에 맞는 ETL 스케줄을 설정하는 방법을 알아봐요.
Linux 기초
컨테이너를 위한 필수 Linux 개념: cgroups, snapshotters, 권한, ACLs
MinIO로 로컬 S3 구축하기
Docker로 실행하는 S3 호환 오브젝트 스토리지 MinIO 설정 가이드
Python 툴링 스택
애플리케이션 프로젝트를 위한 표준 Python 개발 툴링 구성
S3 경로 정규화 패턴
S3 key prefix에 일관된 trailing slash를 보장하는 정규화 패턴
Stow Symlink 상태 점검
GNU Stow가 만든 symlink이 앱 업데이트로 깨지는 문제를 감지하고 복구하는 방법을 알아봐요.
Terraform 상태 복구
Terraform state 파일이 AWS 실제 상태와 맞지 않을 때 복구하는 절차를 정리했어요.
tmux 스마트 세션 자동 시작
숫자 세션 이름으로 .zshrc에서 tmux를 자동 시작해서, 새 터미널 창마다 독립된 tmux 세션을 사용하는 방법이에요.
uv.lock 모범 사례
uv.lock을 버전 관리에 커밋해야 하는지에 대한 가이드
Giscus SvelteKit 통합하기
데이터베이스나 인증 백엔드 없이 정적 생성 SvelteKit 블로그에 댓글 시스템을 추가하는 방법을 알아봅니다.
모바일 Input UX
커스텀 스타일 input이 모바일 브라우저에서 제대로 동작하도록 만드는 기법을 알아봅니다.
SvelteKit용 Paraglide-JS i18n
번들을 부풀리거나 런타임 오버헤드 없이 SvelteKit 정적 블로그에 한국어/영어 다국어 지원을 추가하는 방법을 알아봅니다.
Svelte 5 $effect Rune
Svelte 5에서 $effect rune의 자동 의존성 추적, cleanup, 그리고 $derived 및 onMount와의 차이를 알아봅니다.
Claude Code 전문가 워크플로우
세 명의 전문가 소스에서 합성한 Claude Code 활용 패턴: Boris Cherny(도구 설정), Mia Heidenstedt(프로세스 규율), YK Dojo(실무 워크플로우)
CSS Inline-Replaced 요소의 하단 갭
`<textarea>`, `<img>`, `<input>`, `<video>` 같은 요소는 CSS에서 inline-replaced 요소예요. 기본적으로 텍스트 baseline 위에 놓여서 신비한 하단 갭이 생겨요.
문서화 패턴
Buffer Pattern은 AI 지원 세션에서 중요한 발견을 보존해요. 세션이 끝나거나 연결이 끊겨도 소중한 인사이트를 잃지 않도록 해주죠.
macOS Keychain 다중 계정 동작 방식
macOS Keychain은 같은 서비스 이름에 다른 계정 속성을 가진 여러 항목을 허용합니다. 이로 인한 인증 버그를 디버깅하고 해결하는 방법을 다룹니다.
Markdownlint 컨벤션 가이드
7,500개 이상의 markdownlint 에러를 수정하며 정립한 Markdown 포맷팅 규칙과 설정 방법을 정리합니다.
React 데모 파이프라인 패턴
백엔드 없이 완전히 작동하는 React 대시보드 데모 모드를 구축하는 패턴을 소개합니다.
shadcn/ui 수동 설정 (Vite + Tailwind)
Vite + React + TypeScript + Tailwind CSS 프로젝트에서 shadcn CLI 없이 shadcn/ui 컴포넌트 프리미티브를 수동으로 설정하는 방법입니다.
Claude Code 스킬에서 zsh 백틱 평가 문제
SKILL.md 파일의 백틱 마크다운 포맷이 zsh 명령어 치환 에러를 일으키는 문제와 해결법을 정리했어요.
Google Calendar API: 반복 일정 업데이트
반복 일정에서 "이 일정만", "이후 모든 일정", "전체 일정" 업데이트를 처리하는 방법이에요.
Google Calendar 반복 일정 연산
반복 일정의 `all`, `this`, `thisAndFollowing` 업데이트 구현 패턴이에요.
외부 캘린더 데이터 정규화
Apple Calendar, GNOME Evolution, 여행 앱 등의 외부 캘린더 데이터는 비표준 형식을 포함하는 경우가 많아서 파싱이 깨져요. 정규화 레이어로 이 edge case를 처리하는 방법이에요.
부분 접근 반복 일정
반복 시리즈의 중간부터 초대받은 사용자의 경우, Google Calendar API가 예상과 다르게 동작해요. 제대로 처리하지 않으면 데이터 무결성 문제가 발생해요.
rrule BYDAY 타임존 보정
rrule JavaScript 라이브러리가 BYDAY 요일을 이벤트 타임존이 아닌 UTC로 해석하는 문제와 해결 방법을 알아봅니다.
RRULE EXDATE 타임존 파싱 문제
rrule JavaScript 라이브러리에서 EXDATE가 RRULE보다 먼저 오거나 TZID 파라미터가 있으면 파싱이 제대로 안 됩니다. 해결 방법을 알아봅니다.
Lemon Squeezy 구독 관리
구독 라이프사이클, 취소, 만료, 재활성화에 대한 정리예요.
바이너리 체크섬 검증
SHA256 체크섬을 사용해 다운로드한 바이너리가 변조되지 않았는지 검증하는 방법
타입 수준 필수 파라미터로 IDOR 방지하기
API가 사용자에게 ID를 조작해서 다른 사용자의 리소스에 접근할 수 있게 허용하는 IDOR 취약점을 타입 레벨에서 방지하는 방법
Alembic과 Async SQLAlchemy 설정하기
SQLAlchemy의 async engine과 함께 Alembic migration을 설정하는 방법
Claude Code 멀티 프로필 HUD 설정
Claude Code를 여러 계정(개인 + 업무)으로 운영할 때 HUD 플러그인이 올바른 계정별 사용량 통계를 표시하도록 설정하는 방법
ECR/ECS 배포 워크플로우
Amazon ECR과 ECS를 사용한 컨테이너 배포 전체 과정 — 인증부터 롤링 업데이트, 트러블슈팅까지 정리했어요.
AWS VPC 네트워킹 기초
CIDR 계산, NAT Gateway 배치, Route Table — 왜 다들 처음에 헤매는지, 어떻게 제대로 잡는지 정리했어요.
FastAPI Dependency Injection 패턴
모든 라우트 핸들러에서 `Depends(get_current_user)`를 반복하면 보일러플레이트가 생기고 불일치가 발생하기 쉽습니다
Race Condition 방지를 위한 Pessimistic Locking
INSERT 전 존재 여부를 확인할 때 race condition을 방지하기 위해 SELECT FOR UPDATE를 사용하는 방법.
AWS ECS/ALB에서의 WebSocket 아키텍처
ALB, ECS, Redis Pub/Sub를 활용한 실시간 알림용 WebSocket 연결 구조
OAuth 2.0 구현 패턴
백엔드 서비스에서 OAuth 2.0 플로우를 구현하기 위한 실용적 패턴
Traefik, Keycloak, ForwardAuth 이해하기
Traefik을 통해 노출된 Kubernetes 서비스에 인증 레이어가 없는 문제를 해결하는 방법
Claude Code: 공유 + 개인 AI 설정 패턴
AI 지시사항을 커밋되는 공유 레이어와 gitignore되는 개인 레이어로 분리해서 새 개발자는 즉시 AI 지시사항을 사용하고 기존 개발자는 개인 확장을 유지하는 패턴입니다.
Recharts 다크 테마 커스터마이징
Recharts 차트를 다크 터미널 테마에 맞게 스타일링하는 방법을 CSS 변수와 커스텀 컴포넌트를 통해 설명합니다.
AI 코드 리뷰 패턴
AI 리뷰어(Claude, Copilot, Codex)가 잘못되거나 오해의 소지가 있는 피드백을 생성하는 패턴 정리.
Google Meet 링크 생성
프로그래밍 방식으로 Google Meet 링크를 생성하면서 배운 교훈이에요.
배치 처리 트레이드오프
데이터베이스 작업을 공유하는 여러 엔티티를 처리할 때, 엔티티별 배칭과 크로스 엔티티 배칭 간의 트레이드오프를 분석해요.
ECS Auto-Scaling 심층 분석
ECS auto-scaling의 알고리즘, 쿨다운, 비용 최적화 — 비례 제어를 이해하면 flapping과 과금 폭탄을 피할 수 있어요.
GitHub PR Review API - 인라인 코멘트
GitHub API와 gh CLI로 PR 리뷰에 인라인 코멘트를 다는 방법
Two-Phase Deletion 패턴
rollback 기능이 없는 시스템에서 외부 API 호출이 성공해야만 데이터를 영구 삭제하는 안전한 삭제 패턴.
인프라 보안 강화 체크리스트
AWS 인프라를 위한 종합 보안 강화 체크리스트예요. 네트워크 격리, WAF 배포, 비용 효율적인 보안 개선을 다뤄요.
Google Calendar 동기화 전략
Full sync와 incremental sync 패턴, 그리고 캘린더 분류 로직을 정리했어요.