블로그
GPU·LLM·MLOps·쿠버네티스, 그리고 마음가짐에 관한 글 · 3672 편
#2026-03 762#culture 283#deep-dive 275#kubernetes 260#career 233#ai 220#llm 216#devops 195#2026-04 158#security 147#observability 118#database 113#communication 108#history 107#architecture 101#productivity 98#performance 93#linux 90#networking 89#finance 87#economy 84#mindset 80#psychology 79#ai-papers 78#food 78#it 78#travel 78#japanese 76#deep-learning 75#english 74#gpu 74#ai-agent 69#business-travel 69#postgresql 66#cs-fundamentals 63#rag 63#systems 63#python 55#learning 54#self-improvement 53
Dockerfile에서 반복되는 실수 — root 실행, PID 1, 이미지에 남는 시크릿
빌드는 통과하는데 운영에서만 터지는 Dockerfile 문제들을 원인부터 정리합니다. USER를 지정하지 않아 root로 도는 컨테이너, latest 태그와 재현성, ADD를 피해야 하는 이유, shell form CMD가 SIGTERM을 삼켜 배포 때마다 10초를 버리고 137로 죽는 구조, PID 1의 좀비 수확 책임과 tini, ARG와 ENV로 넣은 토큰이 docker history에
2026-07-26 · 20 분 읽기 #docker#dockerfile#container-security#pid1#devopsgit merge vs rebase — 무엇을 언제 쓰고, 공유 브랜치는 왜 리베이스하지 않는가
merge와 rebase의 차이는 그림이 아니라 커밋 해시로 봐야 정확합니다. 리베이스는 커밋을 옮기는 명령이 아니라 부모가 달라진 새 커밋을 만드는 명령이고, 해시가 바뀐다는 그 사실 하나가 공유 브랜치를 리베이스하지 말라는 황금률의 유일한 근거입니다. 이 글은 실제 커밋 해시와 reflog 출력으로 그 변화를 보여 주고, 머지 커밋이 소음이라는 통념을 first-parent 로그로 반박하
2026-07-26 · 19 분 읽기 #git#rebase#merge#version-control#workflow.gitignore가 작동하지 않을 때 — 원인 1위와 패턴 규칙 정독
무시 목록에 분명히 적었는데 파일이 계속 올라오는 이유는 대부분 하나입니다. 이미 추적 중인 파일에는 무시 규칙이 적용되지 않습니다. 이 글은 인덱스에서 빼는 정확한 명령과 그 명령이 동료의 작업 디렉터리에서 파일을 지운다는 부작용, 어느 규칙이 범인인지 Git에게 직접 물어보는 check-ignore 사용법과 추적 중인 파일에서는 아무것도 출력하지 않는 함정, 선행 슬래시와 후행 슬래시와
2026-07-26 · 19 분 읽기 #git#gitignore#troubleshooting#security#version-control컨테이너와 VM은 무엇이 다른가 — namespace, cgroup, 그리고 커널 공유의 청구서
"컨테이너는 가벼운 VM"이라는 설명이 왜 오해를 낳는지부터 정리합니다. 컨테이너는 namespace로 시야가 가려지고 cgroup으로 자원이 제한된 평범한 리눅스 프로세스일 뿐이며, 호스트 커널을 그대로 공유합니다. pid/mnt/net/uts/ipc/user/cgroup 네임스페이스가 각각 무엇을 격리하는지, cgroup v2가 무엇을 제한하는지를 실제 명령으로 확인하고, 커널 공유가 만
2026-07-26 · 23 분 읽기 #docker#container#linux-namespace#cgroup#virtualization도커 이미지 크기 줄이기 — 레이어의 진실, 멀티스테이지, 베이스 이미지의 실제 비용
도커 이미지가 1.9GB까지 부푸는 원인을 dive로 레이어 단위로 특정하는 법부터 정리합니다. 유니온 파일시스템 때문에 RUN rm 으로는 이미지가 한 바이트도 줄지 않는 이유, 멀티스테이지 빌드에서 정확히 무엇만 복사해야 하는지, alpine의 musl libc가 파이썬 휠 재빌드와 DNS 문제로 청구하는 숨은 비용, distroless와 slim의 트레이드오프를 실제 Dockerfile
2026-07-26 · 20 분 읽기 #docker#dockerfile#multi-stage-build#container#devopsEXPLAIN ANALYZE 읽는 법 — 실행 계획에서 진짜 병목을 찾는 순서
EXPLAIN ANALYZE 출력을 처음부터 끝까지 읽는 방법을 정리합니다. 노드를 어떤 순서로 읽어야 하는지, cost가 왜 시간 단위가 아닌지, 예상 행 수와 실제 행 수의 괴리가 무엇을 알려 주는지, loops가 곱해지는 함정은 어떻게 피하는지 실제 출력과 함께 설명합니다. Nested Loop, Hash Join, Merge Join이 각각 선택되는 조건과 BUFFERS로 캐시 적중을
2026-07-26 · 21 분 읽기 #database#postgresql#explain#query-optimization#performance도커 빌드 캐시가 자꾸 깨지는 이유 — 레이어 캐시 키, ARG, BuildKit 캐시 마운트
코드 한 줄만 고쳤는데 npm ci가 5분 동안 다시 도는 문제의 원인을 캐시 키 수준에서 설명합니다. RUN의 캐시 키는 명령 문자열이고 COPY의 캐시 키는 파일 내용 해시라는 차이, 한 레이어가 깨지면 그 아래가 전부 깨지는 규칙, ARG가 BuildKit과 구 빌더에서 다르게 동작하는 지점을 다룹니다. CI 러너에는 캐시가 없다는 사실과 함께 캐시 마운트가 레지스트리 캐시로 내보내지지
2026-07-26 · 18 분 읽기 #docker#buildkit#build-cache#ci-cd#devops트랜잭션 격리 수준과 실제 이상 현상 — 표준 정의가 구현과 다른 지점
트랜잭션 격리 수준 네 가지와 dirty read, non-repeatable read, phantom read를 정리하되, 교과서의 표 하나로 끝내지 않습니다. PostgreSQL의 Read Committed가 왜 처음부터 dirty read를 만들 수 없는지, Repeatable Read가 왜 사실은 스냅샷 격리이고 직렬화 실패를 애플리케이션이 재시도해야 하는지, MySQL InnoDB의
2026-07-26 · 22 분 읽기 #database#postgresql#transaction#isolation-level#mysql커넥션 풀 크기, 크게 잡으면 손해인 이유 — 대기열을 어디에 세울 것인가
커넥션 풀을 키웠더니 오히려 느려지는 현상의 원리를 정리합니다. PostgreSQL의 프로세스 모델에서 커넥션이 왜 비싼지, 디스크와 CPU 병렬성이 유한하므로 대기열을 데이터베이스 안이 아니라 풀에 세우는 편이 나은 이유, 자주 인용되는 코어 수 기반 공식의 근거와 한계를 다룹니다. 마이크로서비스에서 인스턴스 수와 풀 크기의 곱이 최대 커넥션을 넘기는 전형적 사고, PgBouncer 세 가
2026-07-26 · 26 분 읽기 #database#postgresql#connection-pool#pgbouncer#performance인덱스를 만들었는데 안 타는 이유 — 옵티마이저가 맞고 내가 틀린 경우들
인덱스를 만들었는데 실행 계획에 Seq Scan이 그대로 남는 이유를 원인별로 정리합니다. 선택도가 낮아서 옵티마이저가 일부러 무시하는 경우, 컬럼에 함수나 연산이 걸려 sargable하지 않은 경우, 타입 불일치로 암묵적 캐스팅이 일어나는 경우, LIKE 선행 와일드카드, OR 조건, 복합 인덱스 선두 컬럼 규칙, 통계 노후화, NULL 처리까지 실제 SQL과 실행 계획으로 확인합니다. 부
2026-07-26 · 21 분 읽기 #database#postgresql#index#query-optimization#mysql3막 구조는 법칙인가 관습인가 — 이야기 구조론의 계보와 그 한계
영화들이 대체로 같은 자리에서 꺾이는 것은 우연이 아닙니다. 아리스토텔레스는 3막을 말한 적이 없고, 오늘날의 3막 구조는 시드 필드가 1979년에 페이지 수로 못 박으면서 산업 표준이 된 20세기의 발명품입니다. 표준 비트가 실제로 하는 기능적 일, 블레이크 스나이더의 비트 시트가 헐리우드를 균질하게 만들었다는 비판, 갈등 없이 작동하는 기승전결과 댄 하먼의 스토리 서클 같은 대안, 그리고
2026-07-26 · 23 분 읽기 #storytelling#screenwriting#narrative#film#craft시크릿 관리, .env 파일만으로는 부족한 이유 — 환경변수가 새는 경로와 로테이션 설계
.env 파일을 .gitignore에 넣었다고 시크릿이 안전해지지는 않습니다. 프로세스 환경은 같은 호스트에서 /proc/PID/environ으로 그대로 읽히고, 크래시 리포트와 디버그 페이지와 CI 로그에 실려 나가며, 컨테이너 이미지 레이어에 영구히 남습니다. 이 글은 환경변수가 새어 나가는 실제 경로를 하나씩 보여주고, 시크릿이 이미 커밋된 경우의 대응 순서가 왜 히스토리 재작성이 아니
2026-07-26 · 27 분 읽기 #security#secrets#devops#vault#kubernetes평균 응답 시간이 거짓말하는 이유 — p50, p95, p99를 제대로 읽는 법
평균 응답 시간이 80ms인 서비스에서 사용자가 3초를 기다리는 일은 흔합니다. 롱테일 분포에서 평균이 무엇을 감추는지, p50과 p95, p99, p99.9가 각각 어떤 질문에 답하는지, 그리고 p99가 왜 "100명 중 1명"이 아닌지를 숫자로 설명합니다. 백분위는 평균낼 수 없다는 결정적 사실과 그래서 히스토그램이 필요한 이유, 프로메테우스 histogramquantile의 선형 보간
2026-07-26 · 18 분 읽기 #observability#percentile#prometheus#histogram#sloHTTP Keep-Alive와 커넥션 재사용 — 간헐적 502를 만드는 타임아웃 경쟁 조건
백엔드 로그에는 아무 오류가 없는데 로드밸런서에서만 간헐적으로 502가 섞여 나온다면 대부분 커넥션 재사용 경쟁 조건입니다. 서버가 유휴 커넥션을 닫는 바로 그 순간 클라이언트가 그 커넥션에 요청을 쓰면 FIN과 요청이 엇갈립니다. 왜 백엔드 keepalive 타임아웃을 로드밸런서 유휴 타임아웃보다 길게 잡아야 하는지, curl -w로 namelookup과 connect와 appconnect
2026-07-26 · 26 분 읽기 #network#http#performance#load-balancer#tcp잘 결정하는 법 — 좋은 결정과 좋은 결과는 다릅니다
슈퍼볼 마지막 패스가 인터셉트되자 모두가 최악의 선택이라고 불렀습니다. 하지만 결과로 결정을 채점하는 습관은 배울 수 있는 것을 거의 다 지워 버립니다. 애니 듀크의 리절팅 개념, 되돌릴 수 있는 문과 없는 문을 나누는 베이조스의 기준, 사전 부검과 10/10/10, 만족화와 극대화의 차이, 그리고 결정 일지까지 정리했습니다. 결정의 품질을 실제로 높이고 나중에 채점할 수 있게 만드는 절차에
2026-07-26 · 22 분 읽기 #mindset#decision-making#psychology#productivity#self-improvementCPU steal time과 스로틀링 — top의 st, 버스터블 크레딧, CFS 쿼터를 가르는 법
CPU 사용률은 40%인데 p99 지연이 튀고, top의 st 열에는 20%가 찍혀 있습니다. 겉으로 비슷해 보이는 이 증상에는 세 가지 전혀 다른 원인이 있습니다. 하이퍼바이저가 vCPU에 물리 CPU를 주지 않는 steal time, 버스터블 인스턴스의 CPU 크레딧 고갈, 그리고 top에 아예 보이지 않는 cgroup CFS 쿼터 스로틀링입니다. st가 몇 퍼센트부터 문제인지, nrth
2026-07-26 · 28 분 읽기 #linux#cpu#cgroups#kubernetes#cloud지도는 왜 거짓말을 하는가 — 메르카토르에서 검색 알고리즘까지
그린란드는 아프리카의 14분의 1 크기지만 교실 벽의 세계지도에서는 비슷해 보입니다. 이것은 실수가 아니라 설계입니다. 구면을 평면에 펴는 일이 수학적으로 불가능하다는 가우스의 증명에서 출발해, 항해용으로 각도를 지키려고 면적을 포기한 1569년 메르카토르 도법, 정치적 항의로 등장했으나 그 자체로 왜곡을 안고 있던 페터스 도법 논쟁, 중심과 위쪽을 어디에 두느냐의 정치, 그리고 정확성이 아
2026-07-26 · 26 분 읽기 #humanities#history#cartography#geography#power도커 네트워크 모드와 연결 문제 — bridge, host, overlay, 그리고 127.0.0.1의 함정
컨테이너는 떴는데 접속이 안 되는 상황을 모드별 동작 원리로 풀어냅니다. 기본 bridge에서 컨테이너가 서로를 이름으로 못 찾는 이유와 사용자 정의 네트워크의 내장 DNS, 포트 퍼블리싱이 실제로 만드는 iptables DNAT 규칙, 바인딩 주소를 127.0.0.1로 제한하는 것의 보안 의미를 다룹니다. 컨테이너 안의 루프백이 호스트가 아니라는 점과 host.docker.internal,
2026-07-26 · 22 분 읽기 #docker#docker-network#iptables#networking#devops데드락 진단과 예방 — 로그에서 두 쿼리를 특정하는 법
deadlock detected 오류를 만났을 때 무엇을 봐야 하는지 순서대로 정리합니다. PostgreSQL의 데드락 리포트와 MySQL의 SHOW ENGINE INNODB STATUS 출력을 한 줄씩 해석해 어느 두 쿼리가 엮였는지 특정하는 방법, 실무에서 반복되는 세 가지 패턴인 갱신 순서 불일치와 인덱스 부재로 인한 락 범위 확대와 외래 키가 유발하는 부모 행 잠금을 다룹니다. dea
2026-07-26 · 25 분 읽기 #database#postgresql#deadlock#locking#mysql사이드 프로젝트를 커리어 자산으로 만드는 법 — 완성 기준, 공개 시점, 회고
대부분의 사이드 프로젝트는 재능이 부족해서가 아니라 완성 기준이 없고, 공개 시점이 없고, 회고가 없어서 죽습니다. 자산이 되는 프로젝트에는 남이 볼 수 있고, 내 판단이 드러나고, 이야기로 말할 수 있다는 세 가지 조건이 있습니다. 스코프를 2주 안에 배포 가능한 크기로 강제하는 법, 면접에서 실제로 물어보는 것이 왜 완성도가 아니라 판단의 흔적인지, 글쓰기와 발표가 코드보다 레버리지가 큰
2026-07-26 · 21 분 읽기 #career#side-project#portfolio#growth#productivity