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;

            }

 

 

번호 제목 글쓴이 날짜 조회 수
55 [Gemini] HttpURLConnection 클래스를 이용한 데이터 전송 방식 비교 황제낙엽 2024.03.14 7
54 servlet name 에 camel case 를 사용해서는 안되는 이유 황제낙엽 2023.10.24 2
53 org.apache.commons.fileupload.servlet.ServletFileUpload 이용 예시 황제낙엽 2023.08.25 2
52 ServletFileUpload.parseRequest() 실행 결과 리스트가 비어있는 오류 황제낙엽 2023.08.25 18
51 어떤 multi-part 설정도 제공되지 않았기 때문에, part들을 처리할 수 없습니다. file 황제낙엽 2023.08.23 99
50 (Bard) the request was rejected because no multipart boundary was found file 황제낙엽 2023.08.23 9
49 (Bard) multipart/form-data 요청 처리를 위한 MultipartHttpServletRequest file 황제낙엽 2023.08.21 4
48 ajax 로 post 데이터를 servlet 으로 전달 받기 (with nexacro) [1] secret 황제낙엽 2023.02.26 0
47 HttpServletRequest, HttpServletResponse, JSONObject, POST 황제낙엽 2022.01.12 31
46 [JSP] 파일 다운로드 테스트 file 황제낙엽 2021.04.12 123
45 [HttpURLConnection] Authorization 헤더를 넣어 GET Request 황제낙엽 2020.08.12 376
44 [AWS, 웹 프로젝트] AWS+MySQL+SpringFrameWork5+JAVA8+ React+Gradle+Webpack+GIT+Jenkins file 황제낙엽 2020.04.08 48
43 세션의 timeout 설정 >> HttpSession.setMaxInactiveInterval() 황제낙엽 2019.07.03 8311
42 jQuery JSON 데이터 통신의 특성 (HttpServletRequest) 황제낙엽 2019.06.23 103
» [HttpURLConnection] 서버와의 통신 시도 시점 관련 황제낙엽 2019.06.23 116
40 응답 헤더의 Content-disposition 속성 황제낙엽 2019.04.16 534
39 Java에서 User-Agent 파써 사용하기 황제낙엽 2017.11.20 418
38 서버구동시 주기적으로 동작을 수행하는 스레드를 함께 실행하는 서블릿 황제낙엽 2017.08.02 131
37 JSP 파일에서 getOutputStream() has already been called for this response 에러 황제낙엽 2013.04.24 11479
36 [The type HttpUtils is deprecated] javax.servlet.http.HttpUtils 황제낙엽 2013.03.20 276