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
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초")));
}
이렇게 설정된 시간이 잘 동작하는 걸 확인할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] OutOfMemoryError - GC overhead limit exceeded 원인 분석 및 해결 (1) | 2024.11.20 |
---|---|
[Spring/Mybatis] 마이바티스 조회 시 NULL 반환 이슈(returnInstanceForEmptyRow) (0) | 2024.06.24 |
[SpringBoot] H2 데이터베이스 PostgreSQL 모드로 변경하기 (0) | 2024.03.13 |
[Springboot] 외부에서 로컬 서버 접속하기 (0) | 2024.03.12 |
Mybatis cannot change the executortype when there is an existing transaction (2) | 2024.03.07 |
댓글