Spring Boot API 장애 분석 - OkHttp 로그 남기기
얼마 전 운영 중이던 Spring Boot 기반 API 서버에서 갑자기 POST 요청이 정상적으로 처리되지 않는 문제가 발생했습니다. 클라이언트에서는 요청을 보내고 있었지만, 서버에서 응답이 오지 않거나 오류가 발생하는 상황이었죠. 이 문제를 해결하기 위해 OkHttp의 요청 로그를 남겨 원인을 분석했던 과정을 공유합니다.
1. 장애 발생 상황
운영 환경에서 챗봇 API를 호출하는 기능이 있었는데, 갑자기 응답 시간이 길어지고 일부 요청은 아예 실패하는 현상이 발생했습니다.
문제를 해결하기 위해 클라이언트에서 API 요청이 정상적으로 보내지는지 확인해야 했습니다. 하지만 기존 코드에는 요청을 상세히 기록하는 로깅 기능이 없었기 때문에, OkHttpClient의 로그를 찍어서 분석하기로 했습니다.
2. OkHttp 요청 로그 남기기
Spring Boot에서 OkHttp를 사용해 POST 요청을 보낼 때, 요청을 그대로 로그로 찍을 수 있는 방법은 인터셉터(Interceptor)를 활용하는 것입니다.
2-1. HttpLoggingInterceptor 활용
OkHttp에서 기본 제공하는 HttpLoggingInterceptor
를 사용하면 요청과 응답을 로그로 남길 수 있습니다.
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>4.11.0</version>
</dependency>
그리고 OkHttpClient를 다음과 같이 설정하면 됩니다.
import okhttp3.*;
import okhttp3.logging.HttpLoggingInterceptor;
public class ChatbotClient {
public static void main(String[] args) throws IOException {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build();
RequestBody body = RequestBody.create(
MediaType.get("application/json"),
"{\"question\":\"Hello, how are you?\"}"
);
Request request = new Request.Builder()
.url("https://chatbot-api.com/answer")
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
System.out.println(response.body().string());
}
}
}
이렇게 설정하면 요청과 응답이 로그로 남게 됩니다.
2-2. 커스텀 인터셉터 활용
만약 더 상세한 로깅이 필요하다면 커스텀 인터셉터를 만들어 적용할 수도 있습니다.
import okhttp3.*;
import java.io.IOException;
public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
System.out.println("Request: " + request.url());
System.out.println("Method: " + request.method());
System.out.println("Headers: " + request.headers());
Response response = chain.proceed(request);
System.out.println("Response Code: " + response.code());
return response;
}
}
이 인터셉터를 OkHttpClient에 추가하면 요청과 응답을 원하는 형태로 로깅할 수 있습니다.
3. 장애 원인 분석 및 해결
위 방법으로 요청을 로깅한 결과, 클라이언트에서 보낸 JSON 데이터가 일부 깨진 형태로 전송되고 있음을 발견했습니다. 원인은 JSON 직렬화 과정에서 일부 필드가 누락된 것이었습니다. 이를 수정하고 재배포한 후 정상적으로 동작하는 것을 확인했습니다.
4. 마무리
이처럼 운영 환경에서 API 장애가 발생하면, 가장 먼저 해야 할 일은 **클라이언트와 서버 간 요청과 응답을 정확히 확인하는 것**입니다. OkHttp의 로깅 기능을 활용하면 빠르게 원인을 파악하고 문제를 해결할 수 있습니다.
이번 경험을 통해 API 로깅의 중요성을 다시 한번 깨닫게 되었고, 앞으로도 운영 환경에서는 기본적인 로깅 기능을 항상 활성화해 두어야겠다고 생각했습니다.
Comments
Post a Comment