
네트워크 프로그래밍
'Java Network Programming' 책을 기반으로 간략히 요약하여 정리했습니다.
URL의 본질: URI는 '이름표'라면, URL은 '약도'입니다. 자바의 URL 클래스는 이 약도를 보고 실제로 찾아가서 데이터를 가져올 수 있습니다.
경로의 보안: URL의 경로는 서버의 실제 하드디스크 경로가 아니라, 웹 서버가 설정한 가상의 루트(Document Root)를 기준으로 합니다.
프래그먼트(Ref): '#' 뒤에 오는 부분은 서버가 처리하는 것이 아니라, 클라이언트(브라우저)가 화면의 특정 위치를 찾을 때 사용합니다.
scheme://권한/경로?쿼리
권한(Authority)이 해당 자원의 위치를 해석합니다.
추상화: URI의 경로는 실제 파일 경로와 일치할 수도 있지만, 동적으로 생성된 DB의 결과일 수도 있습니다.
인코딩 필수: 한글이나 특수문자가 포함된 주소는 반드시 '퍼센트 인코딩(UTF-8)'을 통해 ASCII 문자로 변환되어야 네트워크 상에서 안전하게 전송됩니다.
상속: 상대 URL은 현재 머물고 있는 페이지의 URL(프로토콜, 호스트, 경로 등)을 빌려 씁니다.
'/'의 유무
유지보수: 사이트 이사나 도메인 변경 시 링크 수정을 최소화하기 위해 상대 URL 사용이 권장됩니다.
URL 객체 생성: InetAddress와 달리 URL 클래스는 new 키워드를 사용하는 생성자를 제공합니다.
try{
URL u = new URL("http://www.audubon.org/");
} catch(MalformedURLException ex) { ... }
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
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 구성이 가능합니다.
URL 객체를 통해 실제로 데이터를 가져오는 방법.
openStream(): URL의 내용물(Body)만 빠르게 읽어오고 싶을 때 사용하는 가장 쉬운 방법입니다.
자원 정리: 네트워크 리소스 누수를 막기 위해 try-with-resources 구문을 사용하는 것이 필수적입니다.
한계: 인코딩이나 헤더 정보 등 세밀한 제어가 필요하다면 openStream() 만으로는 부족합니다.
-> URLConnection이 필요합니다.
public URLConnection openConnection() throws IOException
-> 기능: 지정된 URL에 대해 소켓을 열고, 연결 상태를 관리하는 URLConnection 객체를 반환합니다.
차이점
openConnection()은 자바 프로그래밍의 진짜 시작입니다.
단순히 웹 페이지만 긁어오는 수준을 넘어, 웹 브라우저가 하는 거의 모든 일(헤더 해석, 로그인, 파일 전송 등)을 구현하려면 URLConnection 객체가 필수적입니다.
스마트한 다운로드: getContent()는 데이터의 내용물(MIME 타입)을 보고 스스로 판단하여 적절한 자바 객체를 리턴합니다.
불확실성: 리턴 타입이 Object이므로, 정확히 어떤 클래스가 반환될지 미리 알기 어렵습니다.
텍스트 처리가 목적이라면 openStream()이 훨씬 명확하고 안전합니다.
활용: 미디어 파일(이미지, 소리)을 다룰 때 유용하게 쓰일 수 있는 잠재력이 있습니다.
getContent의 메서드 오버로딩 버전입니다.
유연성: InputStream보다 다루기 쉬운 String이나 Reader 형태를 선호한다면, 이를 명시적으로 요청 가능합니다.
호환성: 만약 특정 컨텐츠 핸들러가 String 변환 기능을 아직 구현하지 않았더라도,
InputStream을 후순위로 넣어두면 프로그램이 에러 없이 안전하게 데이터를 가져올 수 있습니다.
(Graceful Degradation)
이 메서드는 "데이터를 이런 형태로 받고 싶어"라는 협상 과정입니다.
자바에게 여러 선택지를 주어 가장 적합한 형태로 데이터를 받아낼 때 사용합니다.
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()
포트처리: getPort()가 -1을 반환한다고 해서 포트가 없는 것이 아닙니다.
단지 URL에 숫자가 안 적혀 있을 뿐이며, 이때는 getDefaultPort() 값을 사용하면 됩니다.
흙ㄱㅂㄱ르뷰ㅜㄹ츄 ㅠㅠ 너무 어려워요.. 좀 더 쉽게 설명해주세요 (난 감자니까)