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;

            }

 

 

번호 제목 글쓴이 날짜 조회 수
291 자바 소수점 n번째 자리까지 반올림하기 황제낙엽 2019.07.29 163
290 java base64 encodeing,decoding 사용법 황제낙엽 2019.07.24 103
289 java.lang.StackTraceElement Class의 내용 출력 황제낙엽 2019.07.03 131
288 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8311
287 jQuery JSON 데이터 통신의 특성 (HttpServletRequest) 황제낙엽 2019.06.23 103
» [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 116
285 역컴파일러 (decompiler, jad.exe) file 황제낙엽 2019.06.20 129
284 Microsoft SQL Server JDBC 드라이버 2.0 file 황제낙엽 2019.05.22 137
283 수치 데이터 처리 유틸리티 file 황제낙엽 2019.05.12 79
282 한글 초성 중성 종성 분리 유틸리티(자작) file 황제낙엽 2019.05.07 244
281 한글 초성 중성 종성 분리 (자모분리) 황제낙엽 2019.05.07 100
280 한글 인코딩의 이해 1편: 한글 인코딩의 역사와 유니코드 황제낙엽 2019.05.07 198
279 한글 인코딩의 이해 2편: 유니코드와 Java를 이용한 한글 처리 file 황제낙엽 2019.05.07 231
278 응답 헤더의 Content-disposition 속성 황제낙엽 2019.04.16 534
277 StringUtils - 문자열 처리 유틸리티 file 황제낙엽 2019.04.15 178
276 JSON과 GSON 황제낙엽 2019.03.24 134
275 File.length() 에 대하여 황제낙엽 2019.03.24 221
274 File.delete() 와 File.deleteOnExit() 황제낙엽 2019.03.24 1887
273 List to Array / Array to List 황제낙엽 2019.03.24 43
272 Oracle JAVA 유료화에 관련한 최신 기사 황제낙엽 2019.01.23 65