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 연동, 스트림 처리 예외

🔗 참고 링크

  1. Safe use of HttpURLConnection – Stack Overflow
  2. Java HTTP connection.getInputStream() get response from …
  3. Why are there streams in the HttpURLConnection API?
  4. IOException: stream is closed, NullPointerException with …

댓글 남기기