sitelink1 https://www.omnibuscode.com/board/index...._srl=38075 
sitelink2  
sitelink3  
sitelink4  
sitelink5  
sitelink6  

-- 2024.03.15

지금까지 HttpURLConnection 클래스의 connection pool 관리에 대해 잘 알지 못하고 있었다.

그래서 내가 만들어 사용하던 util 클래스에서 조차 잘못된 코드를 사용하고 있었는데

올바른 사용을 위한 내용은 아래와 같다.

 

Chat AI 를 통해서 매우 유용하고 명확한 API 사용법을 알게 되었다.

결론적으로 getInputStream(), getOutputStream() 함수들중 어느것을 호출해도 연결하려는 서버에 실제 연결하게 되는데

이유는 두 함수들 내부적으로 connect() 함수를 호출하기 때문이었다.

그래서 API 호출 순서는 getOutputStream() 호출후 getResponseCode() 를 통해서 연결이 정상인지 확인후 

getInputStream() 으로 응답 데이터를 받아오면 무사히 프로그램이 수행되게 된다.

다음은 Gemini 에게 위 내용에 대한 질문을 던져서 받은 답변이다.

 

Q. HttpURLConnection 클래스는 어떤 함수 호출시에 실제 서버와 통신을 시도하지?

 

A. HttpURLConnection 클래스에서 실제 서버와 통신을 시도하는 함수 호출은 다음과 같습니다:

 

* **getInputStream():** 서버로부터 응답 데이터를 읽을 때 사용합니다. 이 함수 호출 시 실제 서버와 통신이 이루어집니다.

* **getOutputStream():** 서버로 데이터를 전송할 때 사용합니다. 이 함수 호출 시에도 실제 서버와 통신이 이루어집니다.

* **connect():** 서버에 연결을 시도할 때 사용합니다. 옵션으로 사용할 수 있으며, `getInputStream()` 또는 `getOutputStream()` 호출 전에 명시적으로 호출하지 않아도 서버와 통신은 이루어집니다.

 

**참고:**

 

* `getInputStream()` 또는 `getOutputStream()` 호출 시 `connect()` 함수가 자동으로 호출됩니다.

* `getResponseCode()` 함수는 서버와 통신을 시도하지 않고 응답 코드만 확인합니다.

* `getHeaderField()` 함수는 서버와 통신을 시도하지 않고 응답 헤더 정보만 확인합니다.

 

**예시:**

 

```java

// URL 설정

URL url = new URL("https://api.example.com/");

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

 

// 서버와 통신

connection.getInputStream();

 

// 응답 처리

// ...

```

 

**추가 정보:**

 

* HttpURLConnection 클래스: [https://developer.android.com/reference/java/net/HttpURLConnection](https://developer.android.com/reference/java/net/HttpURLConnection)

* getInputStream(): [유효하지 않은 URL 삭제됨]()

* getOutputStream(): [유효하지 않은 URL 삭제됨]()

* connect(): [유효하지 않은 URL 삭제됨]()

 
또한 위와 같은 답변 내용으로 작성 할 수 있는 샘플 코드는 다음과 같다.
 
String token = "YOUR_ACCESS_TOKEN"; // Bearer Token 값
 
// URL 설정
URL url = new URL("https://api.example.com/");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
 
// HTTP 헤더에 Bearer Token 추가
connection.setRequestProperty("Authorization", "Bearer " + token);
 
// HTTP 요청 전송
int responseCode = connection.getResponseCode();
InputStream inputStream = connection.getInputStream();
 
// 응답 처리
if (responseCode == 200) {
  // 성공
  // inputStream으로 응답 데이터 처리
} else {
  // 실패
  // 에러 처리
}
 
위와 같은 내용으로 현재는 코드를 고쳐서 올바르게 잘 사용하고 있다.
아래의 내용은 지금까지 잘못된 사용법으로 이해하고 있었던 내용의 기록이다.
 
 
 
 
 





아래와 같은 코드에서 OutputStream의 write(), flush(), close() 만 호출해주면 서버에 Request를 전달하는 줄 알았다

그런데 아무리 코드를 수행해도 서버에 통신시도를 하지 않는 것이었다

나중에서야 알았는데

    HttpURLConnection.getOutputStream();

    HttpURLConnection.getInputStream();

위 두 코드가 모두 수행되어야만 서버와의 통신을 시도한다는 것을 알게 되었다

 

샘플코드

            URL url = new URL("http://[도메인]:[포트]/rd/service");

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            conn.setDoInput(true);

            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");

            conn.setRequestMethod("POST");

            conn.setDoOutput(true);

            conn.setUseCaches(false);

 

            String param = "CMD=SYNC_BATCH_START&ID="+URLEncoder.encode(id,"UTF-8"));+"&PASS="+URLEncoder.encode(pw,"UTF-8"));;

            

            OutputStream out_stream = null;

            try {

                out_stream = conn.getOutputStream();

                out_stream.write(param.getBytes("UTF-8"));

                out_stream.flush();

                out_stream.close();

                //여기까지의 코드로 서버와 통신을 시도하여 요청을 전달하는 줄 알았음

                InputStream is = null;

                BufferedReader in = null;

                String data = "";

 

                is = conn.getInputStream(); //여기서 서버와 통신을 수행한다

                in = new BufferedReader(new InputStreamReader(is), 8 * 1024);

 

                String line = null;

                StringBuffer buff = new StringBuffer();

 

                while ((line = in.readLine()) != null) {

                    buff.append(line + "\n");

                }

                data = buff.toString().trim();                

            } catch (IOException ioe) {

                System.out.println("RD 접속이 불가합니다 - "+ioe);

            } finally {

                out_stream = null;

                conn = null;

                url = null;

            }

 

 

번호 제목 글쓴이 날짜 조회 수
43 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8649
42 jQuery JSON 데이터 통신의 특성 (HttpServletRequest) 황제낙엽 2019.06.23 581
» [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 650
40 응답 헤더의 Content-disposition 속성 황제낙엽 2019.04.16 902
39 Java에서 User-Agent 파써 사용하기 황제낙엽 2017.11.20 844
38 서버구동시 주기적으로 동작을 수행하는 스레드를 함께 실행하는 서블릿 황제낙엽 2017.08.02 551
37 JSP 파일에서 getOutputStream() has already been called for this response 에러 황제낙엽 2013.04.24 11974
36 [The type HttpUtils is deprecated] javax.servlet.http.HttpUtils 황제낙엽 2013.03.20 628
35 Java에서 URL 다루기 file 황제낙엽 2012.06.24 454
34 HttpServletResponse.setContentType(java.lang.String type) 과 MIME 타입 황제낙엽 2012.04.20 576
33 한글 파일명 깨짐으로 살펴본 다국어 처리 문제 (UTF-8) 황제낙엽 2012.03.22 10508
32 <jsp:include>, include지시자 file 황제낙엽 2011.07.24 498
31 <jsp:include> 액션태그 황제낙엽 2011.07.24 451
30 Servlet의 각종 Listener 사용방법 및 샘플 황제낙엽 2010.10.26 450
29 ServletContext 초기화 및 소멸 황제낙엽 2010.10.26 461
28 ServletConfig 이용하기 황제낙엽 2010.03.15 521
27 Transfer-Encoding: chunked VS Content-Length 황제낙엽 2009.09.17 573
26 서블릿 응답 헤더(Response Header) 황제낙엽 2009.09.17 525
25 MultipartRequest (cos.jar)와 서블릿을 이용한 업로드 file 황제낙엽 2009.06.19 713
24 JSP session 정보 얻기 황제낙엽 2009.01.21 492