공공부하자개발 · 영어 학습 노트
자바
실무 확장Excel · 파일 업로드 · DB 연동0/22 완료
  • 01Excel(XLSX) 구조와 순수 JDK로 읽기/쓰기
  • 02Apache POI로 Excel 업로드/다운로드
  • 03파일 업로드/다운로드 서버 (HttpServer)
  • 04JDBC 기초와 트랜잭션 (H2)
  • 05MyBatis 어노테이션 매퍼로 쿼리 연동
  • 06MyBatis XML 매퍼 · Oracle 방언 · PageHelper · Spring Boot
  • 07REST API 서버와 JSON
  • 08Vue 3 SPA 와 Java 서버 연동
  • 09@Scheduled 운영
  • 10로깅 실무: 레벨·계층, MDC 추적, 예외·성능, 마스킹, 롤링, JSON 로그
  • 11외부 API 연동
  • 12테스트 실무
  • 13암호화·개인정보 보호
  • 14인코딩·한글 실무
  • 15@Transactional 심화
  • 16긴 작업 비동기 처리와 진행률
  • 17SFTP·FTP 파일 연계
  • 18로컬 캐시와 @Cacheable
  • 19메일·알림 발송
  • 20웹 보안 체크리스트
  • 21빌드 도구와 폐쇄망 의존성 반입
  • 22성능 측정: p50·p95·p99, 측정 계층, JFR, JMH 함정, 자체 부하 테스트, 병목 순위
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 실무 확장 › 11 / 22

외부 API 연동

타임아웃·재시도·멱등성·서킷 브레이커·동시 한도·폴백
섹션 7진행 0 / 22
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

5. 자주 하는 실수 (Tip)

아래 10가지는 이 레슨의 데모와 실제 운영 장애에서 반복적으로 나오는 실수입니다. 앞의 2·3·4절 코드를 그대로 쓰면 대부분 자동으로 피해집니다.

❌ 실수 1: 타임아웃 없이 호출해 톰캣 스레드가 고갈된다

증상은 특정 API 하나가 느려졌을 뿐인데 사이트 전체가 응답 없음이 되는 것입니다. 원인은 응답 타임아웃을 지정하지 않아, 요청을 처리하던 톰캣 스레드가 상대 응답을 무한히 기다리는 것입니다. 모든 외부 호출에 연결·응답 타임아웃을 반드시 지정해야 합니다.

❌ 실수 2: 4xx 도 재시도해 같은 실패를 반복한다

증상은 잘못된 요청 하나가 응답 시간을 3배로 늘리는 것입니다. 원인은 재시도 조건에서 상태 코드를 구분하지 않은 것입니다. retryable() 처럼 4xx 를 제외하는 판단을 재시도 루프 앞단에 둬야 합니다.

❌ 실수 3: POST 재시도로 중복 결제가 발생한다

증상은 사용자가 결제를 한 번 눌렀는데 두 번 청구되는 것입니다. 원인은 타임아웃 후 재시도한 POST 를 상대가 새 요청으로 처리한 것입니다. 멱등 키를 붙이거나, 지원하지 않으면 재시도 대신 4.2 절처럼 상태를 조회해 확정해야 합니다.

❌ 실수 4: 재시도 간격 없이 즉시 3연타로 보낸다

증상은 상대가 잠깐 흔들렸다가 우리 재시도 폭주로 완전히 다운되는 것입니다. 원인은 백오프 없이 곧바로 다시 보내는 재시도 로직입니다. 지수 백오프와 지터를 반드시 넣어야 상대에게 회복할 틈을 줍니다.

❌ 실수 5: 서킷 없이 죽은 상대에게 계속 타임아웃을 기다린다

증상은 상대가 완전히 죽었는데도 매 요청이 똑같이 느리게 실패하는 것입니다. 원인은 실패가 반복돼도 계속 같은 방식으로 호출을 시도하는 것입니다. 서킷 브레이커로 반복 실패를 감지해 일정 시간 호출 자체를 끊어야 합니다.

❌ 실수 6: 화면 요청 스레드에서 외부 호출 3개를 직렬로 부른다

증상은 화면 하나를 열 때마다 API 응답 시간의 합만큼 기다리는 것입니다. 원인은 서로 독립인 호출 3개를 순서대로 기다린 것입니다. CompletableFuture(고급 09 레슨)로 병렬 호출해 가장 느린 하나의 시간만 기다리게 바꿔야 합니다.

❌ 실수 7: 상대 한도를 무시해 429 로 차단당한다

증상은 배치를 돌릴 때마다 뒷부분 요청이 전부 429 로 실패하는 것입니다. 원인은 상대가 정한 동시·분당 한도를 우리 쪽에서 지키지 않은 것입니다. 세마포어나 토큰 버킷으로 상대 한도보다 먼저 우리 쪽을 제한해야 합니다.

❌ 실수 8: 폴백 값이 오래됐다는 표시를 안 한다

증상은 환율이 몇 시간 전 값인데도 화면에는 방금 조회한 것처럼 보이는 것입니다. 원인은 캐시 폴백 값과 실시간 값을 화면에서 구분하지 않은 것입니다. "n분 전 값" 같은 stale 표시를 반드시 같이 보여줘야 합니다.

❌ 실수 9: TrustAll 로 인증서 검증을 우회한다

증상은 사내 CA 인증서 오류를 없애려고 검증 자체를 꺼버리는 것입니다. 원인은 truststore 에 사내 CA 를 정식으로 등록하는 절차를 건너뛴 것입니다. 검증을 끄면 중간자 공격에 그대로 노출되므로 keytool -importcert 로 CA 를 등록해야 합니다.

❌ 실수 10: HttpClient 를 요청마다 새로 만든다

증상은 호출량이 늘수록 커넥션 수립 비용이 누적되는 것입니다. 원인은 HttpClient.newBuilder().build() 를 매 호출마다 실행해, 커넥션 풀 재사용 효과를 스스로 버린 것입니다. HttpClient 는 스레드 안전하므로 상대 API 별로 하나씩 만들어 재사용해야 합니다.

자주 하는 실수 (Tip)
  • ❌ 실수 1: 타임아웃 없이 호출해 톰캣 스레드가 고갈된다
  • ❌ 실수 2: 4xx 도 재시도해 같은 실패를 반복한다
  • ❌ 실수 3: POST 재시도로 중복 결제가 발생한다
  • ❌ 실수 4: 재시도 간격 없이 즉시 3연타로 보낸다
  • ❌ 실수 5: 서킷 없이 죽은 상대에게 계속 타임아웃을 기다린다
  • ❌ 실수 6: 화면 요청 스레드에서 외부 호출 3개를 직렬로 부른다
  • ❌ 실수 7: 상대 한도를 무시해 429 로 차단당한다
  • ❌ 실수 8: 폴백 값이 오래됐다는 표시를 안 한다
  • ❌ 실수 9: TrustAll 로 인증서 검증을 우회한다
  • ❌ 실수 10: HttpClient 를 요청마다 새로 만든다
이전 섹션4 응용 변형 예제5 / 7다음 섹션6 연습 문제