+ 가장 값싼 관측부터 신중하게 범위를 좁힌다.
- 일부 단계는 정확한 반분보다 긴 점검표에 가깝다.
추측으로 고치기 전에 무엇을 확인해 범위를 반으로 줄일지 정합니다.
| 분류 | 개발 › 코딩 |
|---|---|
| 태그 | 분석코드개발자 |
Help me narrow down this bug. *Do not propose a fix yet.* Produce: 1. The possibility space — where the cause could be, grouped by layer. 2. Observations in order, each chosen to eliminate roughly half of what remains. For each: what to run or check, and what each outcome rules out. 3. What my symptom already rules out, before I run anything. 4. What the things I already tried tell us — including the ones that did not work, which are often more informative. 5. The single cheapest observation with the highest information value. Start there. Rules: - *Binary search over the possibility space, not a list of likely culprits.* A ranked guess list is what I am already doing and it is not working. - Where my description is not specific enough to design a check, say what detail you need. - Flag any assumption in my description that might itself be wrong. Bugs hide behind those.
버그를 고치려고 여기저기 바꾸면 더 헤맨다. 이 프롬프트는 수정안 대신 "이걸 확인하면 가능성이 절반으로 준다"는 관찰을 순서대로 준다.
ChatGPT가 가정을 경계하며 가장 충실히 이진 탐색한다. Gemini는 구체적이나 과도한 단정과 DB 추적 오류가 있고, [C]는 제시되지 않았다.
+ 가장 값싼 관측부터 신중하게 범위를 좁힌다.
- 일부 단계는 정확한 반분보다 긴 점검표에 가깝다.
+ 계층별 원인과 분기 검사를 구체적으로 연결했다.
- 근거 없이 원인을 배제·확정한 대목이 많다.
| 기준 | ChatGPT | Gemini | 앞선 모델 |
|---|---|---|---|
| 지시 준수 | 9 | 7 | ChatGPT +29% |
| 정확성 | 9 | 4 | ChatGPT +125% |
| 구체성 | 9 | 9 | 동점 |
| 구성·가독성 | 9 | 8 | ChatGPT +13% |
| 분량 적정성 | 8 | 6 | ChatGPT +33% |
gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-24). 측정값이 아니라 AI 심사 결과입니다.
같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.
증상: 결제 완료 후에도 주문 상태가 'PENDING'에 멈춰 있는 케이스가 전체 결제의 약 2~3%에서 발생함. 사용자는 결제는 됐는데 주문 확인 페이지에서 계속 로딩 중으로 보임. 시도해본 것: 1) PG사 webhook 로그를 보면 결제 성공 콜백은 정상적으로 도착함. 2) orders 테이블 update 쿼리 자체는 로그에 남아있는데 status 컬럼이 그대로인 경우가 있어서 트랜잭션 커밋 문제로 의심해 재시도 로직(3회)을 추가했지만 발생 빈도가 그대로임. 3) 로컬/스테이징에서 부하 없이 재현 시도했지만 한 번도 재현 안됨. 4) 같은 시간대 로그를 보면 Redis idempotency 락 관련 에러가 몇 건 같이 찍혀있긴 한데 상관관계는 확실치 않음. 시스템 구성: Node.js 18 + Express 결제 서비스, PostgreSQL 15 (RDS), 결제 webhook 수신 후 Redis에 idempotency key로 중복 처리 방지, 서버 3대를 ALB로 로드밸런싱, PG사는 토스페이먼츠
가장 먼저 할 관찰은 **“실제로 PENDING인가, 아니면 읽는 경로만 PENDING으로 보이는가”**입니다.
PENDING 상태를 계속 표시함UPDATE ... WHERE 조건이 맞지 않아 rowCount = 0PENDING → PAID 전이 조건이나 상태명이 실제 데이터와 다름await되지 않았거나 결과가 확인되지 않음PENDING으로 덮어씀각 단계는 결과에 따라 남은 공간을 크게 두 갈래로 나눕니다.
문제가 된 주문 하나를 골라 다음 세 값을 같은 시점에 비교합니다.
SELECT id, status, updated_at
FROM orders
WHERE id = '<order_id>';
그리고:
결과:
PAID인데 API/화면이 PENDINGPENDING실패 사례 20~50건에 대해 같은 correlation key로 다음 순서를 맞춥니다.
결과:
현재의 “webhook 로그에 도착했다”는 관찰만으로는 handler가 끝까지 실행됐다는 뜻이 아닙니다.
각 실패 사례의 SQL 로그에서 단순히 SQL 문자열이 아니라 다음을 확인합니다.
rowCountWHERE 조건결과:
rowCount = 0rowCount = 1인데 primary DB가 PENDINGrowCount 기록 자체가 없음특히 UPDATE에 다음과 같은 조건이 있다면 중요합니다.
WHERE order_id = $1
AND status = 'PENDING'
이 경우 SQL이 실행됐다는 사실과 실제로 행이 변경됐다는 사실은 다릅니다.
rowCount = 1인 실패 사례만 골라 transaction 로그를 대조합니다.
결과:
재시도 3회가 빈도를 바꾸지 않았다는 점은 일시적인 commit 실패만이 주원인일 가능성을 낮춥니다. 다만 재시도도 같은 lock, 같은 조건, 같은 서버 상태를 반복했다면 구조적 실패는 그대로 남습니다.
Redis 에러가 있었던 시간대의 사례를 다음 세 그룹으로 나눕니다.
결과:
상태 변경 감사 로그, CDC, application write 로그, PostgreSQL audit/WAL 기반 기록이 있다면 주문별로 모든 상태 변경을 시간순으로 봅니다.
결과:
PAID 이후 다시 PENDING 기록이 있음PAID 기록 자체가 없음PAID 기록은 있고 현재 DB가 PENDING현재 설명만으로 어느 정도 배제되는 것은 다음입니다.
반대로 아직 배제되지 않은 것:
PG webhook 성공 콜백이 도착한다
PG 결제 성공과 내부 주문 상태 반영은 분리되어 있다는 뜻입니다. 다만 webhook handler가 성공적으로 완료됐다는 증거는 아닙니다.
UPDATE SQL 로그가 남지만 상태가 그대로다
SQL 발행과 상태 변경은 다릅니다. rowCount, commit, 이후 overwrite를 확인해야 합니다. 현재 증거만으로 transaction commit 문제라고 결론 내릴 수 없습니다.
3회 재시도 후 빈도 변화가 없다
일시적 DB 오류 하나가 원인일 확률은 낮아집니다. 재시도가 lock 실패, 잘못된 조건, 잘못된 ID, 같은 경쟁 상황을 반복했을 가능성도 있습니다.
로컬/스테이징에서 재현되지 않는다
부하가 없어서만 발생하는 문제라고 단정할 수 없습니다. 서버 3대, ALB, Redis, RDS topology, 실제 webhook 중복/순서, production 데이터 분포 중 하나 이상이 필요할 수 있습니다.
Redis lock 에러가 같은 시간대에 있다
시간적 상관관계만 있습니다. 실패 주문의 idempotency key에 대해 실제로 lock 획득 실패 또는 처리 스킵이 있었는지 연결해야 합니다.
실패한 주문 한 건을 골라 primary PostgreSQL의 orders.status와 주문 확인 API의 응답을 비교하세요.
PAID, API가 PENDING이면 처리/write 경로를 즉시 크게 배제할 수 있습니다.PENDING이면 그때 webhook handler → Redis → UPDATE row count → commit 순서로 추적하면 됩니다.이 관찰을 하려면 다음 정보가 필요합니다.
orders 조회에 캐시가 있는지order_id, webhook의 payment/order 식별자rowCount, commit/rollback 로그가 있는지| 방산 CV 12개월 로드맵 프롬프트 | |
| 2046 퍼즐 게임 제작 프롬프트 | |
| React 컴포넌트 통합 프롬프트 | |
| 3D 아바타 팩토리 요구 프롬프트 | |
| 3D FPS 게임 개발 프롬프트 |