아래 10가지는 이 레슨의 데모와 실제 운영 장애에서 반복적으로 나오는 실수입니다. 앞의 2·3·4절 코드를 그대로 쓰면 대부분 자동으로 피해집니다.
증상은 특정 API 하나가 느려졌을 뿐인데 사이트 전체가 응답 없음이 되는 것입니다. 원인은 응답 타임아웃을 지정하지 않아, 요청을 처리하던 톰캣 스레드가 상대 응답을 무한히 기다리는 것입니다. 모든 외부 호출에 연결·응답 타임아웃을 반드시 지정해야 합니다.
증상은 잘못된 요청 하나가 응답 시간을 3배로 늘리는 것입니다. 원인은 재시도 조건에서 상태 코드를 구분하지 않은 것입니다. retryable() 처럼 4xx 를 제외하는 판단을 재시도 루프 앞단에 둬야 합니다.
증상은 사용자가 결제를 한 번 눌렀는데 두 번 청구되는 것입니다. 원인은 타임아웃 후 재시도한 POST 를 상대가 새 요청으로 처리한 것입니다. 멱등 키를 붙이거나, 지원하지 않으면 재시도 대신 4.2 절처럼 상태를 조회해 확정해야 합니다.
증상은 상대가 잠깐 흔들렸다가 우리 재시도 폭주로 완전히 다운되는 것입니다. 원인은 백오프 없이 곧바로 다시 보내는 재시도 로직입니다. 지수 백오프와 지터를 반드시 넣어야 상대에게 회복할 틈을 줍니다.
증상은 상대가 완전히 죽었는데도 매 요청이 똑같이 느리게 실패하는 것입니다. 원인은 실패가 반복돼도 계속 같은 방식으로 호출을 시도하는 것입니다. 서킷 브레이커로 반복 실패를 감지해 일정 시간 호출 자체를 끊어야 합니다.
증상은 화면 하나를 열 때마다 API 응답 시간의 합만큼 기다리는 것입니다. 원인은 서로 독립인 호출 3개를 순서대로 기다린 것입니다. CompletableFuture(고급 09 레슨)로 병렬 호출해 가장 느린 하나의 시간만 기다리게 바꿔야 합니다.
증상은 배치를 돌릴 때마다 뒷부분 요청이 전부 429 로 실패하는 것입니다. 원인은 상대가 정한 동시·분당 한도를 우리 쪽에서 지키지 않은 것입니다. 세마포어나 토큰 버킷으로 상대 한도보다 먼저 우리 쪽을 제한해야 합니다.
증상은 환율이 몇 시간 전 값인데도 화면에는 방금 조회한 것처럼 보이는 것입니다. 원인은 캐시 폴백 값과 실시간 값을 화면에서 구분하지 않은 것입니다. "n분 전 값" 같은 stale 표시를 반드시 같이 보여줘야 합니다.
증상은 사내 CA 인증서 오류를 없애려고 검증 자체를 꺼버리는 것입니다. 원인은 truststore 에 사내 CA 를 정식으로 등록하는 절차를 건너뛴 것입니다. 검증을 끄면 중간자 공격에 그대로 노출되므로 keytool -importcert 로 CA 를 등록해야 합니다.
증상은 호출량이 늘수록 커넥션 수립 비용이 누적되는 것입니다. 원인은 HttpClient.newBuilder().build() 를 매 호출마다 실행해, 커넥션 풀 재사용 효과를 스스로 버린 것입니다. HttpClient 는 스레드 안전하므로 상대 API 별로 하나씩 만들어 재사용해야 합니다.