네트워크는 둘 이상의 컴퓨터와 이들을 연결하는 링크의 조합이다.
- 물리적 네트워크는 네트워크를 구성하는 하드웨어(어댑터, 케이블 및 전화선과 같은 장비)이다.
- 논리적 네트워크는 소프트웨어 및 개념모델이다.
Uniform Resource Locator
- 정형화된 자원의 경로를 뜻한다.
- 자원의 경로를 표기할 때 형식을 갖추어서 표기한다.
- 웹 주소를 의미한다.
프로토콜(통신규약)
://호스트
/서버경로
?파라미터(서버경로로 보내주고싶은 데이터들)
=값&파라미터
주소 | 명칭 |
---|---|
https | 프로토콜(통신규약) |
search.naver.com | 호스트 |
search.naver | 서버경로 |
where=nexearch | 파라미터 |
try {
// URL 처리를 위한 URL 클래스
String apiURL = " https://search.naver.com/search.naver?query=날씨";
URL url = new URL(apiURL);
// URL 확인 // if(con.getResponseCode() == 200) {}; // 조건을 걸어도 된다.
System.out.println("프로토콜 : " + url.getProtocol());
System.out.println("호스트 : " + url.getHost());
System.out.println("파라미터 : " + url.getQuery());
} catch (MalformedURLException e) {
System.out.println("API 주소 오류");
}
HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 여부를 나타낸다.
- 정보응답 (100-199)
- 성공적인 응답(200-299)
- 리디렉션 메시지(300-399) (리디렉션은 방문자에게 초기에 요청한 URL이 아닌 다른 URL을 제공하는 행위)
- 클라이언트 오류 응답(400-499)
- 서버 오류 응답(500-599)
인터넷을 이용하다보면 종종 404 에러문구를 볼 때가 있다. 이는 클라이언트 오류 응답의 한 종류로 서버가 요청한 리소스를 찾을 수 없을 때 나타낸다.
이런 형식으로 HTTP에서는 상태에대한 정보를 코드로 나타낸다.
주요로 보아야 할것은 200
번대오류와, 400
번대오류, 500
번대오류를 잘 보면 된다.
요청을 받았으며 프로세스를 계속 진행시킨다는 의미.
요청의 문법이 잘못되었거나 요청을 처리할 수 없다는 의미.
서버가 명백히 유효한 요청에 대한 충족을 실패했다는 의미.
HttpURLConnection
클래스를 이용하여 응답코드를 출력할 수 있다.
try {
// 접속하기
String apiURL = "https://www.google.co.kr";
URL url = new URL(apiURL);
// 자식커넥션 // URL커넥션 (부모)
HttpURLConnection con = (HttpURLConnection)url.openConnection();
// HTTP 응답 코드
// 1. 200 : 정상
// 2. 40X : 요청이 잘못됨(사용자 잘못)
// 3. 50X : 서버 오류
// 접속 확인
System.out.println("응답 코드 : " + con.getResponseCode());
System.out.println("정상 : " + HttpURLConnection.HTTP_OK);
System.out.println("NOT FOUND : " + HttpURLConnection.HTTP_NOT_FOUND);
System.out.println("Internal Error : " + HttpURLConnection.HTTP_INTERNAL_ERROR);
System.out.println("컨텐트 타입 : " + con.getContentType()); // Google : text/html; charset=ISO-8859-1 (html, ISO-8859-1)
// Naver : text/html; charset=UTF-8 (html, utf-8)
System.out.println("요청 방식 : " + con.getRequestMethod()); // GET (GET POST PUT DELETE ... etc)
// 접속 끊기
con.disconnect(); // 접속 해제(생략 가능)
} catch (MalformedURLException e) { // 주소가 잘못된 형식
System.out.println("API 주소 오류");
} catch (IOException e) {
System.out.println("API 접속 오류");
}
connection이라는 것은 스트림을 만들기 위한 도구이다.
Naver 메인페이지의 정보를 자바로 html파일을 만들어 파일을 저장해봅시다.
try {
String apiURL = "https://www.naver.com";
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
// 바이트 입력 스트림
InputStream in = con.getInputStream();
// 문자 입력 스트림으로 변환
InputStreamReader reader = new InputStreamReader(in);
// 모두 읽어서 StringBuilder에 저장
StringBuilder sb = new StringBuilder();
char[] cbuf = new char[100]; // 100글자씩 처리
int readCnt = 0; // 실제로 읽은 글자 수
while((readCnt = reader.read(cbuf)) != -1) {
sb.append(cbuf, 0, readCnt);
}
// StringBuilder의 모든 내용을 C:\\storage\\naver.html로 내보내기
File file = new File("c:\\storage", "naver.html");
FileWriter fw = new FileWriter(file);
// 내보내기
fw.write(sb.toString());
fw.close();
reader.close();
con.disconnect();
} catch (MalformedURLException e) {
System.out.println("주소 오류");
} catch (IOException e) {
System.out.println("API 접속 및 연결 오류");
}
}
// server -> client = in Stream(바이트 기반 스트림)
// client -> server = out Stream(바이트 기반 스트림)
- 인코딩(Encoding) : UTF-8 방식으로 암호화 하는 것을 말한다.
- 디코딩(Decoding) : UTF-8 방식으로 복호화 하는 것을 말한다.
순서 : 원본데이터 -> 인코딩 -> 전송 -> 디코딩 -> 원본데이터
우리 웹페이지의 주소에도 %
와 &
이 있는 경우가 있는데, 이것은 복호화 되어있는 코드이다.
우리가 데이터를 이용하여 웹페이지를 생성할 때도 인코딩과 디코딩을 활용하여 데이터를 다루어야 하므로 잘 알아두자.
try {
// 원본데이터
String str1 = "한글 english !@#$+";
// 인코딩
String encode = URLEncoder.encode(str1, "UTF-8");
System.out.println(encode); // %ED%95%9C%EA%B8%80+english+%21%40%23%24%2B
// 영어와 숫자는 그대로 출력되고, 한글과 특수기호는 암호화되고, 공백은 + 기호로 바뀌었다.
// 디코딩
String decode = URLDecoder.decode(encode, StandardCharsets.UTF_8);
System.out.println(decode);
} catch (UnsupportedEncodingException e) { // 오타났을때 쓰는 예외처리
e.printStackTrace();
}
이렇게 한글과 특수기호, 공백을 같이 함께 정상적으로 원본대로 출력하기 위해서 encoding과 decoding을 한다.
API문서를 읽을 때도 한글은 인코딩을 해주어야 정상적으로 읽힌다.
- UTF-8 : 하나의 문자를 1~4바이트의 가변길이로 표현된다. 1바이트 영역은 ASCII코드와 하위 호환되며 ASCII코드의 128개 문자 집합은 UTF-8과 동일하게 호환된다. 현재 인터넷에서 가장 많이 쓰이는 인코딩이며 뛰어난 크로스플랫폼 호환성도 갖고 있다,
- UTF-16 : 모든 문자를 2바이트의 고정크기로 표현하고 UTF-8과 마찬가지로 ACII코드의 128개 문자 집합에 대해 호환성을 가진다. 바이트 순서가 정해지지 않아 리틀/빅 엔디안 문제가 발생하기 때문에 인터넷 상에서의 사용을 권고하지 않는다. Java와 .NET Framework의 기본 인코딩이다.
정말 대단해요👍