티스토리 뷰
1. URI란?
URI(Uniform Resource Identifier)는 우리나라 말로 '통합 자원 식별자'를 의미한다. 앞서 배운 URL이 위치를 의미했다면, URI는 위치에서 더 나아가 통합 자원을 나타내는 하나의 식별 방법을 의미한다. 그 식별 방법이 꼭 위치 정보가 아니어도 되는 것이다.
이런 개념이기에 URI는 URL보다 상위 개념이다. URL이외에도 URN(Uniform Resource Name)이라고 불리는 통합 자원 이름역시 URI의 하위 개념에 속한다.
URL로 우리가 원하는 정보의 주소를 안다면은, URI로 알수 있는 정보는 그 이상이다. 앞서 말한 주소는 물론이고, 인터넷 사용자의 이름, 우리가 찾고자 하는 어떤 데이터 등 모든 정보를 표현할 수 있다. 웹상에 어떤 데이터 모두 URI로 표현이 가능하다. 웹상에서 엑셀파일 하나를 다운로드 받기위해서 어떤 방법으로든 해당 파일을 지정할 수 있어야 하는데 그 지정하는 방법이다.
URI역시 인터넷 사용자가 모두 약속을 하고 한가지 방법으로 표현해야한다. 하나의 파일을 표현하는데 서로 다른 방식을 쓰면 안된다.
<URI 표현 방식>
RFC 2396에 정의되어 있는 URI 형태는 다음과 같다.
scheme:
[//[user[:password]@]host[:port]][/path][?query][#fragment]
여기서 말하는 스킴(scheme)은 우리가 표현하려는 방법을 말한다. 대표적인 scheme에는 다음과 같은 것들이 존재한다.
data : 링크에 직접 포함되어 Base64로 인코딩 된 데이터
file : 디스크에 존재하는 파일
ftp : FTP 서버
http : HTTP를 사용하는 WWW 서버
mailto : 메일 주소
magnet : P2P 네크워크로 다운 받는 리소스
telnet : 텔넷 기반의 서비스
urn : 통합 리소스 이름
2. URI 클래스 (URI Class)
java.net.URI 클래스를 통해 Java 프로그램에서 URI 클래스를 선언 할 수 있다. URI 클래스는 아래와 같은 특징을 지니고 있다.
URI 클래스는 리소스를 식별하고 URI을 분석하는 기능만 제공한다.
URI 클래스는 URI가 참조하는 리소스를 가져오는 메소드를 제공하지 않는다.
URI 클래스는 URL 클래스보다 표준사항을 더 잘 따른다.
URI 객체는 상대적 URI를 표현할 수 있다.
즉, URL 클래스 처럼 네트워크 전송을 위한 프로토콜을 지정하는 것이 아니라 URI이 무엇인지 분석하고 문자열을 조작하는데 그친다. 위에서 보여준 URI 표현 법칙에 맞도록 문자열을 수정하는 기능을 수행하는 클래스이다. 직접 이곳의 데이터를 가져와 사용하는 것은 제공하지 않는다.
아래와 같은 방법으로 URI 클래스를 선언할 수 있다.
public URI(String uri) throws URISyntaxException
public URI(String scheme, String schemeSpecificPart, String fragment) throws URISyntaxException
public URI(String scheme, String host, String path, String fragment) throws URISyntaxException
public URI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException
public URI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException
실제 생성 결과는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | import java.net.URI; import java.net.URISyntaxException; public class Solution { public static void main(String[] args) throws URISyntaxException { // TODO Auto-generated method stub String string = "www.google.co.kr"; URI uri = new URI(string); System.out.println(uri); } } | cs |
3. URI 메소드 (URI Method)
URI 메소드를 통해 우리가 생성한 URI 혹은 우리가 받아온 URI를 통해 scheme 정보를 찾거나, 원하는 데로 URI를 수정할 수 있다. URI는 scheme 여부에 따라 상대적 URI와 절대적 URI로 구분 할 수 있다. 이는 URI에 있어 매우 중요한 요소인다. scheme에 따라 뒤에 올 URI의 양식이 전혀 달라지기 때문이다.
URI가 상대적인지 절대적인지 판단하는 메소드, 다른말로 scheme의 존재 여부를 파악하는 메소드도 제공된다.
public boolean isAbsolute();
그리고 인코딩 된 URI의 각 요소를 판단하는 메소드 역시 제공된다.
public String getScheme();
public String getSchemeSpecificPart();
public String getRawSchemeSpeciticPart();
public String getFragment();
public String getRawfragment();
그리고, URI 클래스는 URI이 계층적인지 알 수 있도록 제공한다.
public boolean isOpaque();
그리고 URI 클래스가 계층적이라면 아래 메소드를 통해 URI의 디코딩 작업을 실시 할 수 있다.
public String getAuthority();
public String getFragment();
public String getHost();
public String getPath();
public String getPort();
public String getQuery();
public String getUserInfo();
이제 다음의 방법으로 우리가 선언한 URI을 어떻게 메소드로 활용 할지 살펴보자.
4. URI 클래스 예제
URI 클래스의 경우 많은 메소드를 제공하지 않는다. 더군다나 메소드들이 실제 프로토콜 접근을 위한 방법이 아닌, URI 형식에 대한 조회와 수정을 제공해 상대적으로 역할이 많지 않다. 그래도 아래와 같은 방식을 통해 우리가 원하는 데이터에 접근하기 위한 프로그램 개발도 가능하다.
만약 자신이 입력한 URI의 정보를 찾아내기 위해서 아래와 같은 방법으로 프로그램을 개발 할 수 있다. 입력한 URI의 정보를 추출하는 기초적인 프로그램을 아래와 같이 만든다.
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.net.URI; import java.net.URISyntaxException; import java.util.Scanner; public class Solution { public static void main(String[] args) throws URISyntaxException { // TODO Auto-generated method stub System.out.println("Input the URI"); Scanner sc = new Scanner(System.in); String string = sc.nextLine(); URI uri = new URI(string); System.out.println("Scheme : "+uri.getScheme()); System.out.println("Host : "+uri.getHost()); System.out.println("Port : "+uri.getPort()); System.out.println("Query : "+uri.getQuery()); } } | cs |
URI 위키 백과에 있는 기본 양식을 가져와 출력하게 된다면 다음과 같이 나타난다.
'Skill > Programming - Network' 카테고리의 다른 글
12. HTTP 연결 (0) | 2019.07.16 |
---|---|
11. 프록시 (Proxy) (0) | 2019.07.07 |
9. URLConnection 클래스 (0) | 2019.06.16 |
8.인터넷 주소 클래스 (InetAddress Class) (0) | 2019.06.02 |
7. 스레드 동기화 (0) | 2019.05.19 |