티스토리 뷰
URL (Uniform Resource Locator)
URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현한 것입니다.
"프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조" 형식으로 되어 있습니다.
URL 객체를 사용하는 이유
- URL 객체를 사용하여 URL 문자열을 파싱하여 프로토콜, 호스트, 포트, 경로 등의 구성 요소를 쉽게 추출하기 위해
- URL 객체를 사용하여 URL 주소를 조합하여 새로운 URL을 생성하기 위해
- URL 객체는 네트워크 리소스에 접근할 수 있는 핸들 역할을 하며 URLConnection 객체를 사용하여 웹페이지를 연결하기 위한 기본 객체로 사용하기 위해
URL 클래스의 메서드
공식 문서 Java17 API : https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/URL.html
메서드 | 설명 |
URL(String spec) | 지정된 문자열 정보의 URL 객체를 생성하는 생성자 메서드 |
URL(String protocol, String host, String file) | 지정된 값으로 구성된 URL 객체를 생성하는 생성자 메서드 |
URL(String protocol, String host, int port, String file) | 지정된 값으로 구성된 URL 객체를 생성하는 생성자 메서드 |
String getAuthority() | 호스트명과 포트를 문자열로 반환 |
Object getContent() | URL의 Content 객체를 반환 |
Object getContent(Class[] classes) | URL의 Content 객체를 반환 |
int getDefaultPort() | URL의 기본 포트를 반환 (http : 80 , https : 443) |
String getFile() | 파일명을 반환 |
String getHost() | 호스트명을 반환 |
String getPath() | 경로명을 반환 |
int getPort() | 포트번호를 반환 , URL에 명시하지 않으면 -1 반환 |
String getProtocol() | 프로토콜을 반환 |
String getQuery() | 쿼리를 반환 |
String getRef() | 참조(anchor)를 반환 |
String getUserInfo() | 사용자 정보를 반환 |
URLConnection openConnection() | URL과 연결된 URLConnection을 얻음. |
URLConnection openConnection(Proxy proxy) | URL과 연결된 URLConnection을 얻음. |
InputStream openStream() | URL과 연결된 URLConnection의 InputStream을 얻음. |
boolean sameFile(URL otherUrl) | 두 URL이 서로 같은 것인지 체크 |
void set(String protocol, String host, int port, String file, String ref) |
URL 객체의 속성을 지정된 값으로 설정 |
void set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref) |
URL 객체의 속성을 지정된 값으로 설정 |
String toExterbalForm() | URL을 문자열로 변환하여 반환 |
URL toURL() | URL을 URI로 변환하여 반환 |
Tip) URL 객체를 생성하는 방법
- 예시 1) : URL(String spec)
URL url1 = new URL("https://www.naver.com/"); - 예시 2) : URL(String protocol, String host, String file)
URL url2 = new URL("https", "www.naver.com", "/"); - 예시 3) : URL(String protocol, String host, int port, String file)
URL url3 = new URL("https", "www.naver.com", 443, "/");
Tip) URL 형식이 잘못 되거나 없는 URL을 입력했을 경우 MalformedURLException이 발생합니다.
URL 메서드 사용 예시
네이버의 삼성전자 주식의 정보 사이트 주소를 가지고 예시를 들겠습니다.
import java.net.URL;
public class webController {
public static void main(String[] args) throws Exception {
URL url = new URL("https://finance.naver.com/item/main.naver?code=005930#title");
System.out.println("getAuthority() - 호스트명과 포트를 문자열로 반환 : " + url.getAuthority());
// getAuthority() - 호스트명과 포트를 문자열로 반환 : finance.naver.com
System.out.println("getContent() - URL의 Content객체 반환 : " + url.getContent());
// getContent() - URL의 Content객체 반환 :
// (이어서 작성) sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@72f926e6
System.out.println("getDefaultPort() - 기본 포트 반환 : " + url.getDefaultPort());
// getDefaultPort() - 기본 포트 반환 : 443
System.out.println("getProtocol() - 해당 URL 프로토콜 반환 : " + url.getProtocol());
// getProtocol() - 해당 URL 프로토콜 반환 : https
System.out.println("getHost() - 해당 URL 호스트명 반환 : " + url.getHost());
// getHost() - 해당 URL 호스트명 반환 : finance.naver.com
System.out.println("getPort() - 해당 URL 포트 반환 : " + url.getPort());
// getPort() - 해당 URL 포트 반환 : -1
System.out.println("getPath() - 해당 URL 경로 반환 : " + url.getPath());
// getPath() - 해당 URL 경로 반환 : /item/main.naver
System.out.println("getQuery() - 해당 URL 쿼리스트링 반환 : " + url.getQuery());
// getQuery() - 해당 URL 쿼리스트링 반환 : code=005930
System.out.println("getFile() - 해당 URL 파일명 반환 : " + url.getFile());
// getFile() - 해당 URL 파일명 반환 : /item/main.naver?code=005930
System.out.println("getRef() - 해당 URL 참조를 반환 : " + url.getRef());
// getRef() - 해당 URL 참조를 반환 : title
System.out.println("getUSerInfo() - 사용자 정보 반환 : " + url.getUserInfo());
// getUSerInfo() - 사용자 정보 반환 : null
System.out.println("toExternalForm() - 해당 URL을 문자열로 반환 : " + url.toExternalForm());
// toExternalForm() - 해당 URL을 문자열로 반환 :
// (이어서 작성) https://finance.naver.com/item/main.naver?code=005930#title
System.out.println("toURI() - 해당 URL을 URI로 반환 : " + url.toURI());
// toURI() - 해당 URL을 URI로 반환 :
// (이어서 작성) https://finance.naver.com/item/main.naver?code=005930#title
}
}
URLConnection
URLConnection은 JAVA 애플리케이션과 URL간의 통신 연결을 나타내는 클래스입니다
그리고 최상위 클래스이며 추상클래스입니다.
이 클래스를 상속 받아 구현한 클래스는 "HttpURLConnection"과 "JarURLConnection"이 있습니다.
HttpURLConnection 와 URLConnection은 새 인스턴스를 직접 만들지는 못하고 URL클래스를 통하여 연결을 하여 URLConnection의 인스턴스를 얻는 방식입니다.
HttpURLConnection 이란
Java에서 HTTP 프로토콜을 사용하여 서버와 통신해야 할 때, HttpURLConnection 클래스는 그 중심 역할을 담당합니다.
HttpURLConnection은 Java에서 제공되며, HTTP 통신을 위한 다양한 기능과 메서드를 제공합니다.
그럴거면 RestTemplate 클래스도 있는 것 같은데...
사용하는 이유
- Java 애플리케이션과 외부 웹 페이지와 통신하여 웹 페이지에 접근하고 해당 페이지의 HTML 내용을 가져올 수 있습니다.
- Java 애플리케이션에서 이미지, 동영상, 파일 등의 리소스를 다운로드 하기 위해 사용합니다.
사용 방법
1. URL 객체 생성
URL url = new URL("http://www.google.com");
2. URL에서 URLConnection 얻기
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection()
3. 옵션 설정
자주 사용하고 알아두면 좋은 것들은 색상을 다르게하여 처리하였습니다.
- setRequestMethod (String method)
HTTP 메서드 GET, POST, HEAD, OPTIONS, PUT, DELETE 및 TRACE 중 하나인 URL 요청에 대한 메서드를 설정합니다.
기본 값은 GET입니다. - setChunkedStreamingMode (int ChunkLength)
콘텐츠 길이를 미리 알 수 없는 경우 내부 버퍼링 없이 HTTP 요청 본문 스트리밍을 활성화합니다. - setFixedLengthStreamingMode (long contentLength)
콘텐츠 길이가 미리 알려진 경우 내부 버퍼링 없이 HTTP 요청 본문 스트리밍을 활성화합니다. - setFollowRedirects (boolean follow)
이 정적 메서드는 HTTP 리디렉션이 이 클래스의 향후 객체 뒤에 자동으로 따라야 하는지 여부를 설정합니다
기본값은 true - setInstanceFollowRedirects (boolean follow)
HTTP 리디렉션 뒤에 이 HttpURLConnection클래스의 인스턴스가 자동으로 따라와야 하는지 여부를 설정합니다.
기본값은 true - setConnectTimeout (int timeout)
연결 시간 제한을 밀리초 단위로 설정합니다. 연결이 설정되기 전에 제한시간이 만료되면 java.net.SocketTimeoutException이 발생합니다.
시간 초과 0은 무한 시간 초과(기본값)를 나타냅니다. - setReadTimeout (int timeout)
읽기 시간 제한을 밀리초 단위로 설정합니다. 제한 시간이 만료되고 연결의 입력 스트림에서 읽을 수 있는 데이터가 없으면 SocketTimeoutException이 발생합니다.
시간 초과 0은 무한 시간 초과(기본값)를 나타냅니다. - setDefaultUseCaches (boolean default)
URLConnection이 기본적으로 캐시를 사용할지 여부를 설정합니다(기본값은 true).
이 메서드는 URLConnection클래스의 향후 인스턴스에 영향을 줍니다. - setUseCaches (boolean useCaches)
이 연결이 캐시를 사용할지 여부를 설정합니다.
기본값은 true - setDoInput (boolean doInput)
이 URLConnection을 서버에서 콘텐츠를 읽는 데 사용할 수 있는지 여부를 설정합니다.
기본값은 true - setDoOutput (boolean doOutput)
이 URLConnection을 서버에 데이터를 보내는 데 사용할 수 있는지 여부를 설정합니다
기본값은 false - setIfModifiedSince (long time)
주로 HTTP 프로토콜에 대해 클라이언트가 검색한 콘텐츠의 마지막 수정 시간을 설정합니다.
예를 들어, 서버가 지정된 시간 이후 콘텐츠가 변경되지 않았음을 발견하면 콘텐츠를 가져오지 않고 상태 코드 304(수정되지 않음)를 반환합니다. 클라이언트는 지정된 시간보다 최근에 수정된 경우 새로운 콘텐츠를 받게 됩니다. - setAllowUserInteraction (boolean allow)
사용자 상호 작용을 활성화하거나 비활성화합니다(예: 필요한 경우 인증 대화 상자 표시
기본값은 false - setDefaultAllowUserInteraction (boolean dafault)
향후 모든 URLConnection에 대한 사용자 상호 작용의 기본값을 설정합니다. - setRequestProperty (String key, String value)
키=값 쌍으로 지정된 일반 요청 속성을 설정합니다. 해당 키가 있는 속성이 이미 존재하는 경우 이전 값을 새 값으로 덮어씁니다.
사용 예시
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class WebController {
public static void main(String[] args) throws Exception {
// 웹 페이지 URL 생성
URL url = new URL("https://aoxx.co.kr/");
// HttpURLConnection 객체 생성
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 연결 옵션 설정
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000); // 연결 타임아웃 설정
connection.setReadTimeout(5000); // 읽기 타임아웃 설정
connection.setUseCaches(false); // 캐시 사용하지 않음
connection.setDoInput(true); // 입력 스트림 사용
// 연결 수행
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 연결이 성공한 경우, 데이터 읽기
BufferedReader reader = // 줄이 길어서 줄바꿈으로 해줌
new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuilder content = new StringBuilder();
while ((line = reader.readLine()) != null) {
content.append(line);
}
reader.close();
System.out.println("코아시스의 페이지 HTML 내용:\n" + content.toString());
} else {
System.out.println("통신에 실패! 응답 코드 : " + responseCode);
}
// 연결 종료
connection.disconnect();
}
}
출력
진짜 해당 페이지의 HTML 코드를 전체 보여줍니다. 너무 길고 많아서 생략하게 되었습니다.
결론
그럼 HttpURLConnection도 Rest로 통신해서 데이터를 가져오거나 넣거나 수정하거나 할 수 있겠네?
라고 생각하는 계기가 되었던 것같습니다.
감사합니다.
'프로그래밍 언어 > 💫JAVA' 카테고리의 다른 글
[JAVA] 객체지향 프로그래밍을 배우는 블랙잭 게임 (1/4) : 설계 단계 (0) | 2024.06.06 |
---|---|
[JAVA] 멀티쓰레드와 쓰레드 풀 : 동시 프로그래밍의 핵심 (0) | 2024.02.14 |
[JAVA] Optional 옵션널 : 예측 불가능한 널 포인터 예외에서 벗어나다 (0) | 2023.12.04 |
[JAVA] Stream 스트림 : 코드에 스마트함을 부여하여 개발을 한 단계 업그레이드하자! (0) | 2023.11.22 |
[JAVA] Comparator 비교 : 데이터 정렬을 우리가 바꾸는 방법은? (0) | 2023.11.15 |
- Total
- Today
- Yesterday
- Front
- 디자인패턴
- 개발
- 자바스크립트
- 프로세스
- Fetch
- Mac
- DBeaver
- 개발환경
- 개발블로그
- java
- Spring Security
- spring
- aws
- 템플릿
- 오라클
- 코딩테스트
- 개발자
- git
- 프론트
- 데이터 베이스
- JavaScript
- Cors
- 비동기
- 네트워크
- AJAX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |