3 minute read

[Java] HttpURLConnection 그리고 Timeout 이야기

갑자기 잘 돌아가던 내 Data Migration API가 연결이 끊겨 적어보는 포스팅,,

0. 들어가기전에

이번포스팅에선 먼저 네트워크 URL에 대해 알아본 후, 본격적으로 URLConnection&HttpURLConnection 이 무엇인지 알아보려 한다. 그리고 이곳에서 발생하는 여러가지 Timeout들에 대해서도 다루어볼 예정이다.

  • 차례

    • URL

    • URLConnection

    • HttpURLConnection Code

    • HttpURLConnection

    • TimeOut

1. URL (Uniform Resource Locator)

보통 우리가 일반적으로 아는 URL은 인터넷 주소이다. 뭐 틀린 말은 아니지만 우리가 말하는 인터넷 주소는 정확히는 도메인 주소 (Domain Address)라고 표현하는것이 맞다. 이 도메인 주소를 표현하는데 URL 개념이 사용되는것일 뿐이다.

URL은 이름 그대로 Uniform Resource Locator로 네트워크의 자원(resource)의 위치를 나타내는 주소이다. 웹사이트 도메인 주소 뿐만 아니라 네트워크 상에 있는 모든 자원의 식별이 가능하다는 뜻이다. 만약 FTP 프로토콜을 사용할거라면 해당 클라이언트를 이용하면 된다. HTTP 프로토콜을 사용한다면 웹브라우저를 사용한다.

1-0 URL 용어 정리

http://www.example.co.kr/news/LatestNews.do?news_id=11234

  • 프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신 규약

  • 호스트명 : 자원을 제공하는 서버의 이름 (http://www.example.co.kr/)

  • 포트번호 : 통신에 사용되는 서버의 포트번호(80)

  • 경로명 : 접근하려는 자원이 저장된 서버상의 위치

  • 파일명 : 접근하려는 자원의 이름

  • 쿼리(query) : URL에서 ‘?’ 이후의 부분

1-1 URL 사용 문법

  • 가장 앞에 접근할 프로토콜을 적는다 (ex : http, ftp)

  • 프로토콜 다음엔 ‘:’ 를 쓴다.

  • 만약 뒤에 IP주소나 인터넷 주소가 오는 경우 ‘//’를 사용한다.

예시 1) http://www.naver.com - 네이버 홈페이지 도메인 주소

예시 2) ftp://id:pass@192.168.1.1234/a.gif - 해당 ip에 gif 파일이 존재하는 형태

1-2 URL CLASS

URL 클래스의 주요 생성자는 아래와 같다.

  • URL(String spec) : 문자열 spec 이 지정하는 자원에 대한 URL객체 생성

  • URL(String protocol, String host, int port, String file) : 프로토콜 식별자 protocol, 호스트 주소 host, 포트번호 port , 파일이름 file 이 지정하는 자원에 대한 URL 객체를 생성한다.

1-3 URL 클래스의 주요 메소드

  • Object getContent() : 이 URL의 컨텐트를 리턴

  • String getFile() : 이 URL의 파일 이름을 리턴

  • String getHost() : 이 URL의 호스트 이름을 리턴

  • String getPath() : 이 URL의 경로 부분 리턴

  • int getPort() : 이 URL의 포트 번호 리턴

  • String getProtocol() : 이 URL의 프토토콜 이름 리턴

  • InputStream openStream() : URL주소와 연결한 뒤 이 연결로부터 입력 받을수 있는 InputStream 객체 리턴

  • URLConnection openConnection() : URL 주소의 원격 객체에 접속한 뒤 통신할 수 있는 URLConnection 객체를 리턴

    • 내가 지금 사용하는 방법 (단순 URLClass 와 URLConnection Class의 차이는 HTTP POST방식으로 서버에 데이터를 전송이 가능하다.)

    • 이걸 조금더 깊게 알아보자

1-4 URL Class 사용 예제

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class URL_Ex1 { 
   
    public static void main(String[] args) throws IOException {
        URL url = new URL("www.naver.com");
        
        System.out.println("프로토콜: " + url.getProtocol()); //해당 프로토콜을 출력한다.
        System.out.println("호스트: " + url.getHost());
        System.out.println("포트: "+ url.getPort());
        System.out.println("파일: "+url.getFile());
        
        InputStream ins = url.openStream(); //해당 url로 일단 접속한뒤 inputstream 으로 반환된다 우리는 이것을 읽오오면 된다
                 
        BufferedReader br = null;
        br = new BufferedReader( new InputStreamReader(ins)); // ins의 inputstream 내용을 buffer에 저장한다
         
        String str = "";
        while((str = br.readLine()) != null) {
              System.out.println(str);
        }
        br.close(); 
        ins.close();

    }


}

2. URLConnection

URLConnection Class는 URL이 가리키는 리소스에 대한 활성화된 connection을 나타내는 추상 클래스이다.

  • 사용자 인증이나 보안이 설정되어 있지 않은 웹서버에 접속하여 파일 등을 다운로드하는데 많이 사용한다

  • URLConnection은 리소스에 연결하기 전에 구성 되어야 한다.

  • URLConnection 인스턴스는 재사용 될 수 없다.

  • URLClass 를 넘어 URLConnection은 데이터를 보내는것또한 가능하다.

2-1 GET & POST

  • GET 방식은 위에서 알아본 쿼리를 이용하는 방법이다. URL 중 ? 뒤에 인자값을 넣어서 사용한다. 그래서 외부에 노출되어 보안성이 약하며, 길이 제한 이 있다.

  • POST : Http body 숨겨서 보낸다. 그래서 노출이 되지 않아 GET에 비해 보안성이 좋다. 또한 길이의 제한이 없어 많은 양의 Data를 보내는것이 가능하다.

3. HTTPURLConnection

갓대희님의 블로그 참조

  • java.net.HttpURLConnection 클래스는 URLConnection을 구현한 클래스(java.net 클래스에서 제공하는 URL 요청을 위한 클래스)

  • URLConnection은 웹을 통해 데이터를 주고 받는데 사용된다.

  • 주로 미리 길이를 알지 못하는 스트리밍 데이터를 주고 받는데 사용된다.

  • http URL을 처리할 때 도움이 되는 몇가지 추가적인 메서드를 가지고 있다.

  • 요청 방식을 확인 or 설정, redirect 여부 결정, 응답 코드와 메세지를 Read, 프록시 서버가 사용되었는지 여부 확인 메서드 등을 가지고 있다.
    • 프록시서버 :
      • 프록시 서버 위키백과
      • 프록시 서버는 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다.
      • 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 ‘프록시’
      • 이 중계 기능을 하는 것을 프록시 서버라고 한다.
  • 다양한 HTTP 응답 코드에 해당하는 상수 값들이 정의되어 있다.

  • URLConnection 클래스와 마찬가지로 생성자가 protected로 선언되어있기 때문에 기본적으로는 개발자가 HTTPURLConnection 객체를 생성불가하다.

  • 그렇기 때문에 http URL을 사용하는 URL Class의 openConnection() 메서드가 리턴하는 URLConnection 객체는 HttpURLConnection의 인스턴스가 될 수 있다.
    • URLConection을 다음처럼 HttpUrlConnection으로 캐스팅 하여 사용한다. 내 코드도 그렇게 설정됌
URL url = new URL("http://www.naver.com");
HttpURLConnection http = (HttpURLConnection) u.openConnection();

출처: https://goddaehee.tistory.com/161 [갓대희의 작은공간]

  • HttpURLConnection 기본적으로 GET 메서드를 사용한다.

  • setRequestMethod() 를 통해 메서드를 변경 가능

public class PostRequest {
	private String inputLine = null;

    public String postUrl(String url, String parameter) throws Exception{
            logger.info(url);
            URL obj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();

            con.setDoOutput(true);
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json");
            con.setRequestProperty("Accept-Charset", "UTF-8");
            con.setConnectTimeout(10000);
            con.setReadTimeout(200000);     
            
            OutputStream os = con.getOutputStream();
            os.write(parameter.getBytes("UTF-8"));
            os.flush();
            Charset charset = Charset.forName("UTF-8");
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream(),charset));
            
            StringBuffer outResult = new StringBuffer();
            
            while ((inputLine = in.readLine()) != null) {
                outResult.append(inputLine);
            }
            con.disconnect();
            
            return outResult+"";
    }
}

Categories:

Updated: