7. URLConnection Class

URL Connection Class : URL이 가리키는 리소스에 대해 활성화된 connection을 나타내는 추상 클래스

  1. (특히 HTTP 서버와 통신시) URL Class보다 더 향상된 제어 방법을 제공함

    • 서버가 보낸 header를 확인, 적절한 응답 제공 가능

    • 클라이언트 요청에 사용도니 헤더 필드 설정 가능

    • 다양한 http method 를 사용하여 데이터를 보낼 수 있음

  2. JAVA의 프로토콜 핸들러 매커니즘의 한 부분

URL Connectioin

URLConnection 열기

URLConnection 을 사용하면 아래와 같은 절차를 거친다.

1. URL 객체 생성
2. 생성된 URL에 대한 URL Connection 객체를 얻기 위해 
		URL 객체의 openConnection() 메서드 호출
3. 반환된 URLConnection 객체 설정
4. 헤더 필드 읽기
5. 입력 스트림 구하고 데이터 읽기
6. 출력 스트림 구하고 데이터 쓰기
7. 연결 종료
  • 항상 이 절차를 수행해야 하는 것은 아님.

    • URLConnection 기본 설정을 하면 3단계는 생략 가능

    • 메타정보가 필요하지 않은 경우에도 4단계 생략 가능

    • 응답 데이터가 필요하지 않으면 (받기만 하는 경우) 6번 생략 가능

//URLConnection 클래스 생성자는 protected
protected URLConnection(URL url) 

//URL 클래스의 openConnection 메서드 사용해서 생성 가능
public URLConnection openConnection()

서버에서 데이터 읽기

URL Connection 객체를 사용해 URL로부터 데이터를 읽기 위한 단계는 아래와 같다

1. URL 객체 생성
2. 생성된 URL에 대한 URLConnection 객체를 얻기 위해 URL 객체의 openConnection()메서드 호출
3. 반환된 URLConnection 객체의 getInputStream() 메서드 호출
4. 일반적인 스트림 API를 사용하여 입력 스트림에서 읽기

getInputStream() 메서드는 서버가 보낸 데이터를 읽거나 분석할 수 있는 일반적인 InputStream 객체를 반환함.

  • URLConnection 객체로부터 InputStream을 반환한다. 이렇게 단순한 InputStream을 사용할 때에응 URL Class와 URLConnection Class 사이의 차이점이 명백하게 드러나지 않는다. 하지만 아래와 같은 큰차이점이 있다.

    • URLConnection 클래스는 HTTP header에 접근할 수 있음

    • URLConnection 클래스는 서버로 보내는 요청 매개변수를 설정할 수 있음

    • URLConnection 클래스는 서버로부터 데이터를 읽는 것뿐만 아니라 쓸 수도 있음

public static void main (String[] args) {
        if  (args.length > 0) {
            try {
                // Open the URLConnection for reading
                URL u = new URL(args[0]);
                URLConnection uc = u.openConnection();
                try (InputStream raw = uc.getInputStream()) { // autoclose
                    InputStream buffer = new BufferedInputStream(raw);
                    // chain the InputStream to a Reader
                    Reader reader = new InputStreamReader(buffer);
                    int c;
                    while ((c = reader.read()) != -1) {
                        System.out.print((char) c);
                    }
                }
            } catch (MalformedURLException ex) {
                System.err.println(args[0] + " is not a parseable URL");
            } catch (IOException ex) {
                System.err.println(ex);
            }
        }
    }

헤더 읽기

[예시]

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
  • URLConnection 클래스는 헤더로부터 특정 필드를 가져오는 메서드를 제공한다.

캐시

오랫동안 페이지나 이미지 파일에 대해서 캐시(chche)를 사용해 옴. 사이트의 로고 이미지를 반복해서 사용하는 경우, 한번만 원격의 로고를 읽고 로고를 브라우저의 캐시에 저장한다. 그리고 해당 로고는 캐시로부터 읽는다. Expires와 Cache-control을 포함한 몇몇 HTTP 헤더를 사용하면 캐시를 제어할 수 있다.

  • HTTPS나 POST 를 통해 접근하면 캐시에 저장되지 않지만 HTTP헤더를 이용해 조절할 수 있다.

  • cache-control 헤더 확인 방법 : CacheControl class 확인

  • JAVA에서 Cache 제어

    • CacheRequest, CacheResponse abstract Class 를 사용하여 서브클래스를 구현해 캐시를 관리한다.

연결 설정

클라이언트가 서버에 요청을 생성하는 방법을 정의하는 7개의 protected instance 필드를 제공함

protected URL url;
protected boolean doInput = true;
protected boolean doOutput = false;
protected boolean allowUserInteraction = defaultAllowUserInteraction;
protected boolean useCaches;
protected long ifModifiedSince = 0;
protected boolean connected = false;

서버에 데이터 쓰기

getOutputStream 메서드는 서버에 데이터를 전송하기 위해 쓸 수 있는 OutputStream 을 반환함.

OutputStream을 구하고 나면 BufferedOutputStream이나 BufferedWriter에 연결하여 버퍼 기능을 추가한다. 또한 OutputStream 보다 사용하기 편리한 DataOutputStream이나 OutputStreamWriter와 같은 클래스에 연결할 수도 있다.

HttpURLConnection Class

URLConnection 클래스의 추상 서브 클래스이다. public abstract class HttpURLConnection extends URLConnection 이 클래스는 http URL을 처리할 때 도움이 되는 몇몇 추가적인 메서드를 제공한다.

//이 클래스의 유일한 생성자. 하지만 protected
//

protected HttpURLConnection (URL u) {
    super(u);
}
  • 따라서 HttpURLConnection 의 인스턴스를 직접 만들 수 없음.

    하지만 http URL을 사용하는 URL객체를 만든 후 openConnection 메서드로 반환받은 URLConnection 객체는 HttpURLConnection의 인스턴스가 될 수 있다. 반환받은 URLConnection을 HttpURLConnection으로 다음과 같이 캐스팅할 수 있다.

    // #1
    URL u = new URL("<https://www.naver.com>");
    URLConnection uc = u.openConnection();
    HttpURLConnection http = (HttpURLConnection) uc;
    
    //#2
    URL u = new URL("<https://www.naver.com>");
    HttpURLConnection http = (HttpURLConnection) u.openConnection();

Last updated