최근 기록

모든 글
DevOps

PR마다 환경이 뜬다고 했는데 어떤 건 안 됐다

레포마다 되고 안 되고가 갈리던 PR 프리뷰 환경을 직접 띄워 보며, 소개 문서와 실제가 어긋난 지점과 실패도 아니고 성공도 아닌 무반응의 정체를 정리한 기록이다.

CI/CD프리뷰환경GitHub Actions
Database

2년 전에 만들어진 행이 지금 모순을 만들었다

미납 금액이 남은 금액보다 큰 논리적 모순을 조사하다, 2년 전 정정 작업이 금액만 되돌리고 행은 남겨 둔 흔적을 검산으로 복원한 과정을 적었다.

데이터정합성장애조사검산
DevOps

웹 서버를 배포하면 지급이 멈췄다

배치가 발행한 지급 이벤트를 웹 서버가 처리하던 구조에서 배포마다 진행 중인 지급이 끊기던 문제를, 상태 기록과 프로세스 통합 두 단계로 나눠 없앤 과정을 적었다.

배포Graceful Shutdown이벤트
Observability

성공했을 때만 기록을 남기고 있었다

조회가 분명히 있었는데 로그에는 흔적이 없다는 문의를 따라가다, 완주한 작업만 기록되는 구조라 실패는 아예 존재하지 않는 일이 되고 있었다는 것을 확인한 과정을 적었다.

로그장애조사OOM
분산시스템

매일 2,000건이 조용히 사라지던 배치를 고쳤다

4년 동안 드러나지 않던 구조 결함이 작업 단가가 오르자 매일 2,000건씩 데이터를 버리기 시작했다. 큐가 가득 차 신용평가 이벤트가 재시도 없이 사라지던 배치에 백프레셔를 넣은 과정을 적었다.

백프레셔BatchConcurrency
분산시스템

락이 레포마다 다른 방식으로 걸려 있었다

세 서비스에 제각각 구현돼 있던 분산락을 하나로 통일하면서 비정상 종료 회복 시간을 다섯 시간에서 30초로 줄이고, 락 실패 정책을 진입 주체 기준으로 정리한 과정을 적었다.

분산락RedisConcurrency
분산시스템

송금하고 차감하던 순서를 뒤집었다

원금 반영부터 중도상환과 잔액 환급까지 한 흐름에 묶여 있던 배치를 사용자 단위 이벤트로 쪼개고, 재시도해도 중복 환급되지 않도록 처리 순서를 바꾼 과정을 적었다.

멱등성배치분산락
DevOps

검증 하나 때문에 지급 전체가 멈췄다

외부 사이트가 바뀌면 크롤링 검증이 막히고 지급이 통째로 밀리던 구조에서, 그 단계만 운영자가 즉시 끌 수 있는 스위치를 만들며 정한 기준을 적었다.

킬스위치운영Redis
분산시스템

은행이 보낸 결과와 내 원장을 매일 대조했다

트랜잭션이 보장되지 않던 회수 배치를 Java로 옮기면서 외부 출금과 내부 잔액이 어긋나는 경로를 막고, 하루 단위 대사를 따로 세운 과정을 적었다.

정합성Reconciliation배치
Security

평문과 암호문을 두 벌로 들고 있었다

운영 중 암호화로 넘어가려고 만든 이중 쓰기 장치가 전환이 끝난 뒤에도 남아 있어서, 엔티티마다 같은 값을 두 필드로 관리하던 구조를 한 컬럼으로 합친 과정을 적었다.

암호화JPA리팩토링
PG 플랫폼

정기 결제에서 같은 계약이 두 번 승인될 수 있었다

월 15,000건 정기 결제에서 중복 승인, 과거 정산 금액이 달라지는 문제, 외부 장애 복구 시점에 재시도가 몰리는 문제를 각각 다른 방법으로 막은 과정을 적었다.

정기결제멱등성상태머신
분산시스템

최종적 일관성을 믿지 않고 결제와 정산을 대조했다

결제 원장과 정산 대상을 같은 기준으로 집계해 차이를 지연·누락·중복·계약 불일치로 나누고, 자동으로 넘길 것과 사람이 봐야 할 것을 가른 기록이다.

SettlementReconciliationEventual Consistency