본문 바로가기

network

ConnectionTimeout, SocketTimeout, ReadTimeout 개념과 차이점

Java 애플리케이션에서 네트워크 통신 시 발생할 수 있는 시간 초과 오류에는 ConnectionTimeout, SocketTimeout, ReadTimeout이 있습니다. 이들 개념을 이해하기 위해 HTTP 호출 과정과 TCP Connection 방식을 살펴보겠습니다.

HTTP 호출 과정

웹 브라우저가 네이버 서버에 접속하기 위해서는 서버와 연결된 상태가 되어야 합니다. 이 연결은 TCP Connection을 통해 이루어지며, 3-way Handshake 방식을 사용합니다. 연결이 성립되면 데이터 전송이 시작됩니다.

  1. TCP 3-way Handshake
    • SYN: 클라이언트가 서버에 연결 요청을 보냅니다.
    • SYN-ACK: 서버가 클라이언트의 요청을 수락하고 응답합니다.
    • ACK: 클라이언트가 서버의 응답을 확인하고 연결을 완료합니다.

ConnectionTimeout

ConnectionTimeout은 클라이언트가 서버와 연결을 맺기 위해 3-way Handshake를 완료하는 데까지 소요되는 시간입니다. 서버와의 연결이 설정되지 않으면 ConnectionTimeout이 발생합니다.

  • 설명: 3-way Handshake가 정상적으로 수행되어 서버에 연결되기까지 소요된 시간.
  • 예제 코드:
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000); // 5초 타임아웃 설정
connection.connect();

SocketTimeout

SocketTimeout은 클라이언트와 서버가 연결된 후 데이터 전송 중 발생하는 시간 초과 오류입니다. 여러 개의 패킷으로 나누어 전송되는 데이터의 각 패킷 간 시간 차이가 임계치를 넘으면 SocketTimeout이 발생합니다.

  • 설명: 데이터를 여러 개의 패킷으로 나누어 보낼 때 각 패킷 간의 시간 간격.
  • 예제 코드:
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5000); // 5초 타임아웃 설정
InputStream in = connection.getInputStream();

ReadTimeout

ReadTimeout은 서버와의 연결이 설정된 후, 서버로부터 응답을 받기까지의 시간입니다. 서버가 응답을 보내기까지 소요되는 시간이 임계치를 넘으면 ReadTimeout이 발생합니다.

  • 설명: 서버와 연결을 맺은 후, 응답을 받기까지 소요되는 시간의 임계치.
  • 예제 코드:
URL url = new URL("http://example.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setReadTimeout(5000); // 5초 타임아웃 설정
InputStream in = connection.getInputStream();

그림으로 표현

|---------------------------------|
|      HTTP Connection Process    |
|---------------------------------|
|
|----   Connection Timeout    ----|
|           (3-way Handshake)     |
|
|----       Read Timeout      ----|
|     (Waiting for response)      |
|
|----      Socket Timeout     ----|
|   (Data packet transmission)    |
|

왜 시간 설정이 중요한가?

이러한 시간 설정이 중요한 이유는 다음과 같습니다:

  1. URL 접속 무한 대기 방지: ConnectionTimeout, ReadTimeout, SocketTimeout을 설정하지 않으면 클라이언트는 서버 응답을 무한히 대기할 수 있습니다.
  2. 자원 낭비 방지: 시간 초과 설정이 없으면 네트워크 리소스가 불필요하게 사용됩니다.
  3. 사용자 경험 개선: 적절한 시간 초과 설정을 통해 사용자는 빠르고 예측 가능한 응답을 받을 수 있습니다.

예제 코드 전체

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class TimeoutExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("http://example.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // ConnectionTimeout 설정
            connection.setConnectTimeout(5000); // 5초

            // SocketTimeout 설정
            connection.setReadTimeout(5000); // 5초

            // 연결 시도
            connection.connect();

            // 응답 읽기
            InputStream in = connection.getInputStream();
            int data = in.read();
            while (data != -1) {
                System.out.print((char) data);
                data = in.read();
            }
            in.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이 코드에서는 URL로 HTTP 호출을 수행하며, ConnectionTimeout, SocketTimeout, ReadTimeout을 각각 설정하여 안정적인 네트워크 통신을 보장합니다. 이와 같은 설정을 통해 네트워크 자원을 효율적으로 사용하고, 사용자에게 신속한 응답을 제공할 수 있습니다.

반응형