Spring Boot OkHttpClient Timeout 문제 해결하기

Spring Boot OkHttpClient Timeout 문제 해결하기

Spring Boot OkHttpClient Timeout 문제 해결하기

얼마 전 웹 화면에서 API 요청을 보냈는데 아무런 응답이 오지 않는 문제가 발생했습니다. 처음에는 단순한 네트워크 문제라고 생각했지만, 자세히 분석해 보니 OkHttpClient의 기본 timeout 값(10초)이 원인이었습니다. 이번 포스팅에서는 문제 발생 과정부터 해결 방법까지 차근차근 정리해 보겠습니다.


1. 문제 상황 분석

웹 화면에서 특정 버튼을 클릭하면 API 요청을 보내도록 구현했는데, 예상과 달리 아무런 변화도 없었습니다. F12 개발자 도구(Chrome DevTools)를 열어 확인해 보니, 요청은 정상적으로 전송되었으나 응답이 전혀 오지 않았습니다.

WAS(Spring Boot 기반) 서버 로그를 확인한 결과, API 서버로 요청을 보낸 후 정확히 10초 후에 timeout이 발생하고 있었습니다. 하지만 timeout 예외 처리가 되어 있지 않아 화면에서는 아무런 피드백이 없었습니다.

서버 로그 확인

2024-02-25 10:15:30.123  INFO  --- Sending request to API server...
2024-02-25 10:15:40.456 ERROR --- java.net.SocketTimeoutException: timeout

로그를 보면 요청을 보낸 후 10초 후에 timeout이 발생한 것을 확인할 수 있습니다.


2. 원인 분석

Spring Boot에서 외부 API 서버와의 통신을 위해 OkHttpClient를 사용하고 있었습니다. 기본적으로 OkHttpClient는 10초의 timeout을 설정하고 있기 때문에, 응답이 늦어질 경우 자동으로 요청이 실패하게 됩니다.

OkHttpClient의 기본 Timeout 설정

OkHttpClient client = new OkHttpClient();

위처럼 기본 설정으로 OkHttpClient를 생성하면 connectTimeout, readTimeout, writeTimeout이 모두 10초로 설정됩니다. 따라서 응답이 10초 이상 걸리는 경우 timeout이 발생할 수밖에 없습니다.

이 문제를 해결하려면 timeout 값을 조정하거나, 예외 처리를 추가하여 사용자에게 적절한 메시지를 전달해야 합니다.


3. 해결 방법 적용

문제를 해결하기 위해 OkHttpClient의 timeout 값을 30초로 늘리고, 적절한 예외 처리를 추가했습니다.

OkHttpClient Timeout 설정 변경

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build();

이렇게 설정하면 10초였던 timeout이 30초로 증가하여, 응답 시간이 긴 경우에도 요청이 실패하지 않도록 할 수 있습니다.

예외 처리 추가

try {
    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) {
        throw new IOException("Unexpected code " + response);
    }
    System.out.println(response.body().string());
} catch (SocketTimeoutException e) {
    System.err.println("Timeout occurred: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Network error: " + e.getMessage());
}

이렇게 하면 timeout이 발생하더라도 적절한 로그를 남기고, 화면에 피드백을 줄 수 있습니다.


4. 코드 적용 후 개선 사항

수정된 코드를 배포한 후 다시 테스트해 보았습니다. 결과적으로 화면에서 API 요청이 정상적으로 처리되었으며, timeout으로 인한 응답 지연 문제가 해결되었습니다.

  • API 요청이 10초 이상 걸려도 실패하지 않음
  • 네트워크 오류 발생 시 적절한 예외 메시지가 출력됨
  • 사용자 경험(UX) 개선 – 화면이 응답 없이 멈추는 현상 제거

5. 추가적으로 고려할 사항

timeout 값을 무작정 늘리는 것이 항상 좋은 해결책은 아닙니다. 너무 긴 timeout은 서버 리소스를 불필요하게 점유할 수 있으며, 사용자 경험을 저하시킬 수도 있습니다. 따라서 API의 특성과 서비스의 요구 사항을 고려하여 적절한 값을 설정하는 것이 중요합니다.

적절한 timeout 설정 전략

  • API 응답 시간이 일정하면, 평균 응답 시간 + 여유 시간을 고려하여 timeout 설정
  • 긴 응답 시간이 필요한 API는 비동기 요청을 고려
  • 사용자에게 로딩 UI를 제공하여 기다릴 수 있도록 안내

이번 문제를 해결하면서 timeout 설정의 중요성을 다시 한 번 깨닫게 되었습니다. 비슷한 문제를 겪고 있는 개발자분들께 도움이 되길 바랍니다. 😊

Comments