본문 바로가기
Spring

[Test] ConnectionTimeout / ReadTimeout 테스트 하기

by 상후 2024. 4. 9.
728x90
반응형

 

 

Connection Timout, Read Timeout 테스트하기

타 시스템과 연동 시 타임아웃 설정은 필수적이다. 그 이유는 설정을 해주지 않으면, 무한으로 대기하는 현상이 발생할 수 있다. 테스트하는 방법에 앞서, Connection Timeout과 Read Timeout에 대해 간단하게 이해하고 넘어가자

 

급한 사람들을 위해

Connection Timeout 테스트 시 사용할 URL > http://example.com:81
Read Timeout 테스트시 사용할 URL >  http://httpbin.org/delay/10

Read Timeout은 마지막 URL 숫자가 처리 시간을 의미한다.
http://httpbin.org/delay/10 > 10초
http://httpbin.org/delay/30 > 30초

 

 

Connection Timeout
설정한 시간이 지나도록 연결에 성공하지 못할 시 예외를 발생시킨다.

 

Read Timeout
연결된 후 설정한 시간이 지나도록 작업을 처리하지 못할 시 예외를 발생시킨다.

 

설정 방법

 

URL url = new URL("http://example.com/api");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setConnectTimeout(5000); // 5초
connection.setReadTimeout(10000); // 10초

 

 

설정하는 방법은 set 메서드를 이용하여 원하는 시간을 설정하면 된다. ms 단위이므로 1000 = 1초이다.

내가 사용한 커넥션 객체를 살펴보면 A timeout of zero is interpreted as an infinite timeout. 이라는 문장이 있다.

0으로 설정 시 무한임을 유의해야 합니다. 기본값은 0 입니다.


 

Connection Timout 테스트하기

테스트하기 위한 API가 필요하다. 사용한 API URL은 http://example.com:81 이다.

항상 응답시간 초과를 응답해 주는 사이트이다. 이 외에도 다양한 방법들이 있으니 위 방법이 막혔을 때 확인해 보면 좋겠다

 

https://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-error

 

Artificially create a connection timeout error

I've had a bug in our software that occurs when I receive a connection timeout. These errors are very rare (usually when my connection gets dropped by our internal network). How can I generate this...

stackoverflow.com

 

try {
    URL url = new URL("http://example.com:81");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);

    connection.setConnectTimeout(5000);
    connection.setReadTimeout(10000);

    System.out.println("start = " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH시 mm분 ss초")));
    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write("data=example");
    writer.flush();
    writer.close();
    connection.disconnect();
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("end = " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH시 mm분 ss초")));
}

 

 

설정한 5초 뒤에 Timeout이 발생한 것을 확인할 수 있다.

 


Read Timout 테스트하기

마찬가지로 테스트하기 위한 API가 필요하다. 사용한 API URL은 http://httpbin.org/delay/10 이다.

URL의 마지막 식별자에 원하는 처리시간을 적어주면 된다. http://httpbin.org/delay/10는 10초 뒤를 의미하고 

http://httpbin.org/delay/30은 30초후에 응답이 온다. 나는 ReadTimeout 설정을 10초로 걸었으니, 15초짜리로 호출해 보겠다.( http://httpbin.org/delay/15 )

 

try {
    URL url = new URL("http://httpbin.org/delay/15");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);

    connection.setConnectTimeout(5000);
    connection.setReadTimeout(10000);

    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write("data=example");
    writer.flush();
    writer.close();

    System.out.println("start = " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH시 mm분 ss초")));
    int responseCode = connection.getResponseCode();
    System.out.println("Response code: " + responseCode);
    connection.disconnect();
} catch (Exception e) {
    e.printStackTrace();
    System.out.println("end = " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH시 mm분 ss초")));
}

 

 

 

 

 

이렇게 설정된 시간이 잘 동작하는 걸 확인할 수 있다.

728x90
반응형

댓글