LabHub

블로그

국내 개발 블로그 명글 큐레이션 2 — 장애 회고와 트러블슈팅, 직접 열어 확인한 12편

한국어English日本語

한국 개발자가 가장 잘 쓰는 장르

한국어 개발 글을 오래 읽다 보면 한 가지 인상이 남습니다. 개념 정리 글은 영어권과 겹치는 내용이 많은데, 장애 회고는 그렇지 않습니다. 자기 서비스에서 자기가 겪은 일을 쓰기 때문에 대체 불가능하고, 실패를 감추지 않는 글일수록 정보 밀도가 높습니다.

선정 방법은 시리즈 전체와 같습니다. 검색으로 후보를 찾은 뒤 글을 직접 열어 확인했고, 그중에서 설명이 구체적이고 재현 가능한 것을 골랐습니다. 이 글에서는 기준을 하나 더 붙였습니다. 증상과 원인이 다른 곳에 있었던 글, 즉 처음에 의심한 것이 범인이 아니었던 과정이 남아 있는 글을 우선했습니다. 그런 글이 실제 조사에 가장 가깝기 때문입니다.

이 목록은 편집자의 선택이며 순위가 아닙니다. 조회수나 인기는 측정하지 않았고 측정할 수단도 없습니다. 다른 사람이 골랐다면 목록이 달라졌을 것입니다.

출처는 개인 블로그를 우선했습니다. 이 글은 velog 비중이 높은데, 장애 회고라는 장르 자체가 velog에 몰려 있기 때문이지 velog가 더 낫다는 뜻은 아닙니다.

링크는 2026-08-12에 직접 열어 확인했습니다. 개인 블로그 글은 사라지거나 주소가 바뀔 수 있습니다.

원인이 엉뚱한 곳에 있던 사건들

좋은 트러블슈팅 글의 표식은 하나입니다. 처음 의심한 곳과 실제 원인 사이의 거리가 남아 있는가.

사내 서비스 장애 해결 일대기 - p6spy 사용시 DB Routing 안됨, HikariCP 커넥션 누수

이 글이 목록의 첫 자리에 있는 이유는, 원인이 있으리라고 아무도 의심하지 않을 위치에 있었기 때문입니다. SQL을 예쁘게 찍어 주려고 붙인 라이브러리가 커넥션을 감싸면서 지연 획득 프록시를 건너뛰게 만들었고, 그 결과 라우팅이 무력화되었습니다. 개발 편의를 위해 넣은 도구가 런타임 동작을 바꾸는 전형적인 사례이고, 이런 종류는 코드 리뷰로 잡히지 않습니다. 저자가 발견한 내용을 상류에 알린 대목까지 있어서 조사의 마무리가 어떤 모습이어야 하는지도 보여 줍니다.

Timeout이 작동하지 않은 이유

타임아웃을 설정했으니 안전하다고 생각하는 것은 흔한 오해이고, 이 글은 그 오해가 깨지는 지점을 정확히 짚습니다. 이름 해석은 대개 HTTP 클라이언트의 타임아웃 바깥에서 동기적으로 일어나기 때문에, 설정값이 걸리지 않는 구간이 남습니다. 클라이언트 구현에 따라 동작이 갈린다는 점까지 비교해 놓아서, 자기 스택에서 확인할 항목이 분명해집니다. 짧지만 이 글을 읽고 나면 타임아웃 설정을 보는 눈이 달라집니다.

문제 현상 이면에 숨겨진 원인 찾기: TCP 통신 트러블슈팅

제목이 이 글의 요지를 그대로 담고 있습니다. 예외 메시지는 중복 처리 문제를 가리키고 있었지만 실제로는 연결이 절반만 닫힌 상태로 남아 다음 접속을 막고 있었습니다. 애플리케이션 로그만 보고 있었다면 영원히 찾지 못했을 원인이고, 패킷을 떠 본 것이 전환점이 됩니다. 계층을 넘나들며 조사하는 과정이 그대로 남아 있어서, 조사 범위를 언제 넓혀야 하는지에 대한 감각을 얻을 수 있습니다.

쿠버네티스 네트워크 문제 트러블슈팅

이 글의 규모가 인상적입니다. 세 명이 2주 동안 붙었고, 그 과정에서 지웠던 가설들이 남아 있습니다. 최종 원인은 로드 밸런서 구성 요소들이 서로를 인식하는 데 쓰는 포트가 막혀 있었고, 그 결과 여러 노드가 같은 가상 IP를 동시에 광고하면서 ARP 테이블이 흔들린 것이었습니다. 차트 기본값이 만든 문제라는 점에서, 관리형 구성 요소를 쓰는 모든 팀에게 해당하는 이야기입니다. 조사 도구와 순서가 구체적으로 적혀 있어 재현 가능성도 높습니다.

메모리와 CPU를 붙잡고 늘어진 기록

느리다와 죽는다는 다른 문제이고, 조사 도구도 다릅니다. 이 절의 글들은 그 도구를 실제로 씁니다.

Java의 heap dump를 이용한 OOM 원인 분석 with Eclipse MAT

원인 자체도 흥미롭습니다. 사용자가 제출한 무한 루프 코드가 거대한 출력 파일을 만들었고, 그것을 통째로 읽어 들이는 코드가 힙을 채웠습니다. 하지만 이 글의 더 큰 가치는 사후 대비입니다. 덤프가 생기면 자동으로 보관 저장소로 올리는 장치를 만들어 두었기 때문에, 다음 번에는 재현을 기다리지 않아도 됩니다. 히스토그램과 도미네이터 트리를 어떤 순서로 보는지도 구체적으로 나와 있어서 도구 사용법 문서로도 씁니다.

3. [400분이 걸리는 10만 개의 알림 요청 시간을 줄여보자] 왜 CPU 스파이크가 발생할까? JVM WarmUP으로 해결해보자

배포 직후의 성능 저하를 캐시가 비어서라고 뭉뚱그리는 경우가 많은데, 이 글은 프로파일이 없는 상태에서 JIT 컴파일러가 하는 일까지 내려갑니다. 스레드 덤프와 모니터링 화면과 부하 테스트 결과가 함께 붙어 있어 주장이 관측으로 뒷받침됩니다. 시리즈의 세 번째 편이라 앞뒤 맥락이 있고, 10만 건 처리라는 구체적인 목표가 있어 개선 폭도 숫자로 나옵니다. 워밍업이 필요한 조건과 필요 없는 조건을 구분하는 데도 도움이 됩니다.

[Java] 에러 스택 트레이스 최적화를 도와주는 -XX:+OmitStackTraceInFastThrow(사라진 예외 스택 트레이스)

이 현상은 조사하는 사람을 정확히 막아섭니다. 가장 자주 나는 예외일수록 스택 트레이스가 없어지기 때문입니다. 원인이 로깅이 아니라 JVM의 최적화라는 것을 모르면 엉뚱한 곳을 몇 시간 뒤지게 됩니다. 반복 호출로 트레이스가 사라지는 것을 직접 재현하는 예제가 붙어 있어 자기 환경에서 확인해 볼 수 있습니다. 아는 사람에게는 상식이지만 모르면 절대 못 찾는 종류의 지식이고, 그런 지식을 한국어로 정리해 둔 글은 귀합니다.

데이터베이스와 커넥션이 만든 사고들

애플리케이션 코드는 멀쩡한데 데이터 계층에서 무너지는 경우가 많습니다. 원인이 프레임워크의 기본 동작에 있을 때가 특히 그렇습니다.

[트러블슈팅 - DB] 외래키(Foreign Key)와 데드락(DeadLock) 그리고 쿼리 지연 실행

이 글은 두 가지 지식을 연결합니다. 자식 행이 바뀌면 부모 행에 잠금이 전파된다는 것과, ORM이 쓰기를 미뤘다가 정해진 순서로 내보낸다는 것입니다. 각각은 알려진 사실이지만 둘이 겹쳤을 때 데드락이 결정적으로 재현된다는 대목이 이 글의 기여입니다. 해결책으로 외래키 제약을 제거하는 선택을 했고 그 판단의 근거도 적어 두었습니다. 동의하든 않든 판단 과정이 드러나 있어 논쟁의 재료로 쓸 수 있습니다.

HikariCP Connection 고갈 문제

풀이 마르는 문제는 대개 풀 크기가 아니라 반납되지 않는 경로에 있습니다. 이 글은 오래 열려 있는 연결이 트랜잭션 범위와 겹치면서 커넥션이 붙잡히는 구조를 짚고, 프레임워크 설정 하나가 그 구조를 만들고 있었다는 것을 보여 줍니다. 코드를 나누어 연결 유지와 데이터 접근을 분리하는 쪽으로 해결하는데, 설정만 끄는 것보다 근본에 가깝습니다. 실시간 기능을 붙일 계획이 있다면 미리 읽어 둘 값어치가 있습니다.

MySQL 트러블슈팅 회고 (feat. 대소문자 구분)

비교 기준이 계층마다 다를 수 있다는 것은 알고 있어도, 그것이 실제 사고로 이어지는 모습은 보기 어렵습니다. 이 글은 그 장면을 그대로 보여 줍니다. 원인은 콜레이션 설정 하나이고, 증상은 동기화 로직 전체가 이상해지는 것입니다. 해결책으로 비교 방식을 명시하는 방법과 스키마를 바꾸는 방법을 모두 제시해서 상황에 맞게 고를 수 있습니다. 다국어나 이메일 주소를 다루는 서비스라면 남 일이 아닙니다.

JPA가 Fetch Join에 대한 On절을 지원하지 않는 이유

금지된 문법에는 대개 이유가 있고, 그 이유가 이렇게 무서운 경우는 드뭅니다. 조건을 걸어 일부만 가져오면 영속성 컨텍스트는 나머지가 삭제된 것으로 해석하고, 그 해석이 실제 삭제 쿼리로 나갈 수 있습니다. 예제가 붙어 있어 왜 그렇게 되는지 따라갈 수 있고, 결과적으로 ORM의 동작 모델을 한 단계 더 이해하게 됩니다. 기업 소속 블로그이지만 이 주제에 대해 한국어로 정리된 글 중 인과가 가장 선명해서 넣었습니다.

사람이 만든 사고, 그리고 그것을 쓴 용기

기술적 원인만큼이나 자주 일어나는 것이 절차의 사고입니다. 그리고 그것을 공개하는 데는 다른 종류의 용기가 필요합니다.

주니어 개발자의 첫 장애 회고 (새벽에 문자발송이라니..)

사고의 구조가 교과서적입니다. 테스트 환경이 실제 발송 경로와 연결되어 있었고, 문제를 인지하고 되돌리려던 배포가 헬스 체크 시간 초과로 자동 롤백되면서 문제의 코드가 살아 있는 버전으로 되돌아갔습니다. 하나의 실수가 아니라 두 개의 안전장치가 각각 어긋나면서 커진 사고이고, 그 연쇄가 시간 순으로 적혀 있습니다. 주니어 시절의 사고를 이 정도로 자세히 공개한 글은 흔하지 않고, 읽는 쪽에는 자기 팀의 어느 이음매를 봐야 하는지가 남습니다. 이 목록에 넣은 이유는 반면교사가 아니라 회고의 형식 자체가 좋기 때문입니다.

이 블로그의 관련 글과 도구

시리즈의 다른 글

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다