Java HttpURLConnection 사용 시 OutputStream 후 disconnect 호출 이후 getResponseCode, getInputStream 호출 가능 여부
Java에서 HttpURLConnection을 사용할 때, OutputStream
을 통해 데이터를 전송한 후 disconnect()
를 호출하고 나서 getResponseCode()
또는 getInputStream()
을 호출할 수 있는지에 대한 의문이 많다. 이 글에서는 그 동작 원리를 명확히 설명한다.
1. disconnect() 호출 이후 getResponseCode(), getInputStream() 호출 가능할까?
disconnect()
는 즉시 연결을 종료하지 않고, 내부 연결 리소스를 해제하고 재사용을 막는 역할을 한다. 따라서 이미 서버에 요청이 전송된 상태라면 응답을 수신할 수 있다.
- getResponseCode(): 대부분의 경우 disconnect 이후에도 호출 가능하다.
- getInputStream(): 응답이 서버에서 도착한 경우 정상적으로 스트림을 읽을 수 있다. 단, 연결이 완전히 닫힌 경우
IOException
발생 가능.
2. 안전한 사용 순서 예시
아래는 HttpURLConnection
을 안전하게 사용하는 코드 예시이다.
HttpURLConnection connection = null;
try {
URL url = new URL("http://example.com");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
// 데이터 전송
OutputStream os = connection.getOutputStream();
os.write("data".getBytes());
os.flush();
os.close();
// 응답 코드 확인
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
// 응답 내용 읽기
InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
}
3. 주의할 점
- disconnect()는 연결을 즉시 끊지 않으며, 연결 재활용을 방지하는 역할이 더 크다.
- 응답 코드 및 스트림은 가능한 한 disconnect 호출 전에 처리하는 것이 안정적이다.
disconnect()
이후 동작은 구현체 및 JVM 버전에 따라 다를 수 있으므로 테스트가 필요하다.
따라서 최선의 방법은 모든 응답 처리 이후에 disconnect()를 호출하는 것이다.
관련 주제: Java HTTP 통신, REST API 연동, 스트림 처리 예외