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;

            }

 

 

번호 제목 글쓴이 날짜 조회 수
60 [ChatGPT] javax.* 패키지와 jakarta.* 패키지의 혼합 사용 방안 황제낙엽 2025.04.15 535
59 [ChatGPT] *.servlet.http.HttpServlet 클래스를 사용할 수 있는 주요 WAS 목록 황제낙엽 2025.04.14 487
58 jakarta.servlet 패키지를 이용한 File Upload 구현 (2024.03.03, Servlet 5.0) 황제낙엽 2025.01.02 648
57 [ChatGPT] Java EE가 Jakarta EE로 전환 황제낙엽 2025.01.01 787
56 [ChatGPT] <jsp:include>에서 flush="true"를 설정시의 몇 가지 문제점 과 대안 황제낙엽 2024.07.19 741
55 [Copilot] JSP, Servlet, web.xml, mysql 한글 설정 황제낙엽 2024.07.12 637
54 Base64 클래스의 encode, decode 에서 URL-safe 황제낙엽 2024.07.10 831
53 [Copilot] JSP 에서 다른 페이지를 현재 페이지에 포함시키는 문법 (include) 황제낙엽 2024.06.26 717
52 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 704
51 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 1068
50 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 1205
49 어떤 multi-part 설정도 제공되지 않았기 때문에, part들을 처리할 수 없습니다. file 황제낙엽 2023.08.23 1428
48 (Bard) the request was rejected because no multipart boundary was found file 황제낙엽 2023.08.23 727
47 (Bard) multipart/form-data 요청 처리를 위한 MultipartHttpServletRequest file 황제낙엽 2023.08.21 583
46 ajax 로 post 데이터를 servlet 으로 전달 받기 (with nexacro) [1] secret 황제낙엽 2023.02.26 0
45 [JSP] 파일 다운로드 테스트 file 황제낙엽 2021.04.12 3975
44 [HttpURLConnection] Authorization 헤더를 넣어 GET Request 황제낙엽 2020.08.12 1488
43 [AWS, 웹 프로젝트] AWS+MySQL+SpringFrameWork5+JAVA8+ React+Gradle+Webpack+GIT+Jenkins file 황제낙엽 2020.04.08 966
42 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8904
» [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 861