티스토리 뷰
이전 시간엔 인터넷 DNS에서 작동하는 인터넷 주소 프로토콜에 관한 클래스 분석을 실시했다. 이번 시간에는 URL을 Java 프로그램에서 인식하는 방법에 대해 한번 이야기를 해볼까 한다.
1. URL (Uniform Resource Locator)
많은 사람들이 헷갈려하는 부분 중에 하나가 URL이 인터넷 주소라고 생각하는 것이다. 우리가 가장 많이 사용하는 URL이 인터넷 주소이기 떄문에 이 2가지를 동일시하는데, 사실 2개는 다른 개념이다.
우리가 알고 있는 일반적인 인터넷 주소는 사실 도메인 주소 (Domain Address)라는 표현이 맞다. 이 도메인 주소를 표현하는데 URL 개념을 사용하는 것이다.
URL은 이름 뜻대로, Uniform Resource Locator로 네트워크 상 어딘가에 있는 인터넷 자원에 대한 위치를 나타내는 주소다. 웹사이트 뿐만 아니라 네트워크 상에 있는 모든 자원을 식별 할 수 있다. 만약 FTP 프로토콜을 사용할거라면 해당 클라이언트를 이용하면 된다. 또한, HTTP 프로토콜을 사용한다면 웹브라우저를 이용한다.
URL은 인터넷의 창시자 팀 버너스리에 의해 그 개념이 확립되었다.
- URL 문법
- 가장 앞에 접근할 프로토콜을 적는다. (ex, ftp, http)
- 프로토콜 다음엔 ':' 를 쓴다.
- 만약 뒤에 IP 주소나 인터넷 주소가 오는 경우 '//' 를 사용한다.
2. URL Class
Java 역시 URL을 담을 수 있는 클래스를 제공합니다.
- 생성자
URL (String spec)
URL (String protocol, String host, int port, String file)
- URL 클래스 메소드
- getContent() : URL Content 리턴
- getFile() : URL 파일 이름 리턴
- getHost() : URL 호소트 이름 리턴
- getPath() : URL 경로 리턴
- getPort() : URL 포트 번호 리턴
- URL 클래스 예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import java.net.MalformedURLException; import java.net.URL; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub URL address = null; try { address = new URL("http://www.google.co.kr"); } catch (MalformedURLException e) { System.out.println("잘못된 URL입니다."); } } } | cs |
3. URLConnection Class
URL 클래스는 URL 정보를 가진 인스턴스를 생성 시킨다. 이제 생성한 인스턴스를 통해 실제 프로토콜에 연결을 위해서는 다양한 정보가 필요하다. 이런 정보를 제어할 수 있도록 Java에서 클래스를 제공하는 데, 이것이 바로 URLConnection 클래스 이다.
즉, URL Class는 프로그램에서 연결하려는 URL에 주소를 통해 연결 해주는 역할을 하고, 해당 메소드는 openConnection()이다. 그리고 이렇게 형성된 URL 연결에 관한 정보를 제어하는 클래스가 URLConnection Class 이다.
URLConnection Class는 추상 클래스이므로 단독적인 클래스 생성이 불가능하다. 따라서, URL 클래스의 메소드로 부터 자원을 받아 생성이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class MainClass { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub URL address = null; try { address = new URL("http://www.google.co.kr"); URLConnection urlcon = address.openConnection(); } catch (MalformedURLException e) { System.out.println("잘못된 URL입니다."); } } } | cs |
- URLConnection 메소드
- getContentEncoding() : 헤더의 content-encoding에 대한 정보 리턴
- getContentLength() : 헤더 필드의 content-length에 대한 값 리턴
- getInputStream() : URLConnetion 객체로부터 InputStream 값 리턴
- getOutputStream() : URLConnetion 객체로부터 OutputStream 값 리턴
- getURL() : URL 필드 리턴
URLConnetion을 사용한다면, URL 정보를 주고 받는 정보를 알 수 있다. 앞서 구글 사이트의 정보를 담은 URL 클래스를 이용해 URLConnection 클래스를 만들었는데, 해당 클래스의 InputStream에 연결 정보를 담아오는 간단한 프로그래밍을 아래와 같이 만들 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class MainClass { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub URL address = null; try { address = new URL("http://www.google.co.kr"); URLConnection urlcon = address.openConnection(); InputStream is = urlcon.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); char[] buff = new char[512]; int len = -1; while( (len = br.read(buff)) != -1) { System.out.print(new String(buff, 0, len)); } } catch (MalformedURLException e) { System.out.println("잘못된 URL입니다."); } } } | cs |
해당 프로그램의 결과 값은 아래와 같다.
- Java Console 결과값
- Chrome 개발자 도구 상의 www.google.co.kr html 코드
4. URLConnection 예제
이번에는 URLConnetion을 통해 간단한 웹 프로그램 예제를 만들어보자. 매우 간단한 프로그램이지만, 우리가 지금 배운 개념을 적용해 기능을 하는 프로그램을 짜보는 것이 매우 중요하다.
이번에 만들 프로그램은 인물 이름을 입력해 그 사람의 생년월일을 구하는 프로그램이다. 생년월일 정보는 영문 위키백과에 있는 정보를 활용할 것이다. 즉, 사람 이름을 영문으로 입력하면 위키 백과 URL 정보를 보고 그 중에서 생년월일을 추출해 다시 사용자에게 돌려 주는 프로그램이다.
원리는 다음과 같다. 우선 사용자가 영문 이름을 입력한다. 위키 백과의 경우 URL 주소가 다음과 같이 구성되어 있다.
https://en.wikipedia.org/wiki/ + "우리가 찾으려는 정보"
따라서, URL 클래스를 만들 때 사용자가 입력한 정보와 영문 위키 주소를 합쳐 선언하면 된다.
그리고, 위키 백과의 경우 인물 정보를 입력하면 사용자의 이름이 들어가 있는 HTML 클래스를 찾아야 한다. 방법은 해당 사이트에 들어간다면 웹 브라우저에 따라 개발자 도구가 있다. 필자는 주로 크롬을 사용하므로 단축키 'F12'를 누르면 개발자 도구를 볼 수 있다. 웹 사이트와 비교하며 생년월일 정보가 담긴 클래스를 찾는다.
<span class="bday">1955-06-08</span>
해당 클래스 명은 "bday"이다. 즉, 우리는 위의 클래스의 > 뒤에 정보를 가져온다면 우리가 원하는 프로그램을 만들 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.Scanner; public class MainClass { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub URL address = null; Scanner sc = new Scanner(System.in); System.out.println("Input the name"); String name = sc.nextLine(); try { address = new URL("https://en.wikipedia.org/wiki/"+name); URLConnection urlcon = address.openConnection(); InputStream is = urlcon.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String buff; while( (buff=br.readLine())!= null) { if(buff.contains("bday")){ //System.out.println(buff); System.out.println("Born :"+buff.split("class=\"bday\">")[1].split("</span>")[0]); } } } catch (MalformedURLException e) { System.out.println("잘못된 URL입니다."); } } } | cs |
'Skill > Programming - Network' 카테고리의 다른 글
11. 프록시 (Proxy) (0) | 2019.07.07 |
---|---|
10. URI Class (0) | 2019.06.30 |
8.인터넷 주소 클래스 (InetAddress Class) (0) | 2019.06.02 |
7. 스레드 동기화 (0) | 2019.05.19 |
6. 스레드 폴링, 콜백 (0) | 2019.05.07 |