URL

TaekJun Jung·2025년 12월 15일

Network

목록 보기
2/7
post-thumbnail

네트워크 프로그래밍

'Java Network Programming' 책을 기반으로 간략히 요약하여 정리했습니다.


URL

  • URL (Uniform Resource Locator): 인터넷 상에서 자원의 위치(Location)를 명확하게 식별합니다.
    자바의 URL 클래스는 네트워크 세부 프로토콜을 몰라도 데이터를 쉽게 가져올 수 있게 해주는 가장 간단한 도구입니다.
    (리소스가 '어디에' 있고, '어떻게' 가져올지 알려줌)

  • URI (Uniform Resource Identifier): 자원을 식별하는 더 포괄적인 개념입니다. 위치뿐만 아니라 이름(URN)이나 번호 등으로도 식별할 수 있습니다.
    (리소스가 '무엇'인지 식별)

URL의 본질: URI는 '이름표'라면, URL은 '약도'입니다. 자바의 URL 클래스는 이 약도를 보고 실제로 찾아가서 데이터를 가져올 수 있습니다.


경로의 보안: URL의 경로는 서버의 실제 하드디스크 경로가 아니라, 웹 서버가 설정한 가상의 루트(Document Root)를 기준으로 합니다.


프래그먼트(Ref): '#' 뒤에 오는 부분은 서버가 처리하는 것이 아니라, 클라이언트(브라우저)가 화면의 특정 위치를 찾을 때 사용합니다.


URL 구조

scheme://권한/경로?쿼리

권한(Authority)이 해당 자원의 위치를 해석합니다.

추상화: URI의 경로는 실제 파일 경로와 일치할 수도 있지만, 동적으로 생성된 DB의 결과일 수도 있습니다.


인코딩 필수: 한글이나 특수문자가 포함된 주소는 반드시 '퍼센트 인코딩(UTF-8)'을 통해 ASCII 문자로 변환되어야 네트워크 상에서 안전하게 전송됩니다.


Relative URLs

절대 URL(Absolute URL)

상대 URL(Relative URL)

  • 현재 문서(부모 문서)의 URL 정보를 상속 받아, 변하지 않는 부분(프로토콜, 호스트 등)은 생략하고 변경된 경로만 표기한 URL

상속: 상대 URL은 현재 머물고 있는 페이지의 URL(프로토콜, 호스트, 경로 등)을 빌려 씁니다.

'/'의 유무

  • / 없이 시작: 현재 디렉터리가 기준입니다.
  • / 로 시작: 도메인(호스트)의 최상위 루트가 기준입니다.

유지보수: 사이트 이사나 도메인 변경 시 링크 수정을 최소화하기 위해 상대 URL 사용이 권장됩니다.


The URL Class

URL 객체 생성: InetAddress와 달리 URL 클래스는 new 키워드를 사용하는 생성자를 제공합니다.

1) 문자열로 생성: 절대 URL 문자열 그대로 넣기

try{
	URL u = new URL("http://www.audubon.org/");
    } catch(MalformedURLException ex) { ... }

2) 구성요소로 조립: 프로토콜, 호스트, 파일 경로(및 포트)를 따로 입력하여 조립

URL u = new URL("http", "www.eff.org", "/blueribbon.html#intro");
// 기본 포트 사용 -1, HTTP는 80 사용
URL u = new URL("http", "fourier.dur.ac.uk", 8000, "/~dma3mjh/jsci/");
// 포트 명시 8000

3) 상대 경로로 생성: 링크 파싱하거나 같은 디렉터리 파일 순회할 때 유용

URL base = new URL("http://www.ibiblio.org/javafaq/index.html");

URL specific = new URL(base, "mailinglists.html");
// 결과: http://www.ibiblio.org/javafaq/mailinglists.html)

검증의 한계: URL 생성자는 문법과 프로토콜 지원 여부만 확인할 뿐, 실제로 해당 호스트가 존재하는지, 파일이 있는지는 검사하지 않습니다.


불변 객체: URL 객체는 생성 후 수정이 불가능하므로 멀티스레드 환경에서 안전하게 공유 가능합니다.


조립 가능: 문자열 하나로 만들 수도 있지만, 프로토콜, 호스트, 포트, 경로를 따로 입력하여 동적으로 URL 구성이 가능합니다.


Retrieving Data from a URL

URL 객체를 통해 실제로 데이터를 가져오는 방법.

openStream(): URL의 내용물(Body)만 빠르게 읽어오고 싶을 때 사용하는 가장 쉬운 방법입니다.


자원 정리: 네트워크 리소스 누수를 막기 위해 try-with-resources 구문을 사용하는 것이 필수적입니다.


한계: 인코딩이나 헤더 정보 등 세밀한 제어가 필요하다면 openStream() 만으로는 부족합니다.
-> URLConnection이 필요합니다.


public URLConnection openConnection() throws IOException

public URLConnection openConnection() throws IOException

-> 기능: 지정된 URL에 대해 소켓을 열고, 연결 상태를 관리하는 URLConnection 객체를 반환합니다.

차이점

  • openStream(): 수도꼭지를 틀면 물(데이터)만 나옴
  • openConnection(): 수도꼭지 뿐만 아니라 계량기, 수압 조절 밸브까지 포함된 전체 파이프라인(URLConnection)을 손에 쥔 것

openConnection()은 자바 프로그래밍의 진짜 시작입니다.
단순히 웹 페이지만 긁어오는 수준을 넘어, 웹 브라우저가 하는 거의 모든 일(헤더 해석, 로그인, 파일 전송 등)을 구현하려면 URLConnection 객체가 필수적입니다.


public final Object getContent() throws IOException

스마트한 다운로드: getContent()는 데이터의 내용물(MIME 타입)을 보고 스스로 판단하여 적절한 자바 객체를 리턴합니다.


불확실성: 리턴 타입이 Object이므로, 정확히 어떤 클래스가 반환될지 미리 알기 어렵습니다.
텍스트 처리가 목적이라면 openStream()이 훨씬 명확하고 안전합니다.


활용: 미디어 파일(이미지, 소리)을 다룰 때 유용하게 쓰일 수 있는 잠재력이 있습니다.


public final Object getContent(Class[] classes) throws IOException

getContent의 메서드 오버로딩 버전입니다.


유연성: InputStream보다 다루기 쉬운 String이나 Reader 형태를 선호한다면, 이를 명시적으로 요청 가능합니다.


호환성: 만약 특정 컨텐츠 핸들러가 String 변환 기능을 아직 구현하지 않았더라도,
InputStream을 후순위로 넣어두면 프로그램이 에러 없이 안전하게 데이터를 가져올 수 있습니다.
(Graceful Degradation)


이 메서드는 "데이터를 이런 형태로 받고 싶어"라는 협상 과정입니다.
자바에게 여러 선택지를 주어 가장 적합한 형태로 데이터를 받아낼 때 사용합니다.


Splitting URL into Pieces

URL의 5대 구성 요소

scheme://authority/path?query#fragment

1. Scheme/Protocol: 접근 프로토콜 ex) http, ftp, ...

2. Authority: 자원에 접근할 권한이 있는 주체 (UserInfo + host + port)

3. Path: 자원의 위치

4. Query: 추가 파라미터 ('?' 뒤)

5. Fragment/Ref: 내부 위치 ('#' 뒤)


분해도구: URL 클래스는 복잡한 문자열 파싱 로직을 짤 필요 없이, 메서드 호출만으로 URL의 구성요소를 쉽게 분리해줍니다.


getFile() vs getPath()

  • getFile(): 경로 + 쿼리(/path?query)를 반환, 쿼리 스트링 포함
  • getPath(): 순수 경로(/path)를 반환, 쿼리 스트링(?key=val) 포함 X

포트처리: getPort()가 -1을 반환한다고 해서 포트가 없는 것이 아닙니다.
단지 URL에 숫자가 안 적혀 있을 뿐이며, 이때는 getDefaultPort() 값을 사용하면 됩니다.

profile
e4 best by test

2개의 댓글

comment-user-thumbnail
2025년 12월 16일

흙ㄱㅂㄱ르뷰ㅜㄹ츄 ㅠㅠ 너무 어려워요.. 좀 더 쉽게 설명해주세요 (난 감자니까)

1개의 답글