![060_JAVA의 웹 통신](https://inblog.ai/_next/image?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D060_JAVA%25EC%259D%2598%2520%25EC%259B%25B9%2520%25ED%2586%25B5%25EC%258B%25A0%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3Dchodong&w=1920&q=75)
Contents
MIME 타입웹, 통신의 기본 순서
- 서버를 만드는 건 애플리케이션(Application)을 만드는 것이다. → 서버는 “app → os → hw” 순으로 되어 있는 것
- 애플리케이션 레벨에서 나눠진 데이터를 합치지 못하면 쓰레기 데이터가 된다. → 의미 있게 합치기 위해서는 확장자가 필요하다.
- 웹, 통신에서는 확장자가 없기 때문에 “프로토콜(약속)”을 통해서 합친다. → 이로 인해 기준이 필요하다 (프로토콜, 표준)
HTTP
프레임 텍스트에 표시하는 것을 Markup Language 이라한다
→ ex) <h1>안녕</h1>, <u>안녕</u>
확장자를 .HTML(HyperText Markup Language)로 하는데 이게 "브라우저” 이다.
내 CPU가 감당이 가능한 리퀘스트 요청만큼만 만듬
요청이 들어오면 HEAP을 쓰는데 이런걸 다 계산해서 스레드 풀을 만든다.
→ 넘어 버리면 wait가 걸린다.
최초의 프로토콜
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fb1939378-3cd6-4f1f-9032-6c4df0711232%2F1533570c-bc52-41e1-a4bc-292971c47d16%2FIMG_2680.jpg?table=block&id=7216a835-be19-49c3-b3bc-90f8382731a2&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fb1939378-3cd6-4f1f-9032-6c4df0711232%2F1b62b426-bd0c-4c32-9d0c-55ee96d66784%2FIMG_2683.jpg?table=block&id=de8e3d2a-9cce-4111-95fa-70c30749b0b6&cache=v2)
프로토콜은 보안때문에 점점 발전했다.
내가 잘모르는 개념
캐싱(Caching)은 데이터나 계산 결과를 임시로 저장하여 빠른 액세스를 제공하는 메커니즘입니다. 데이터나 작업의 반복 액세스를 줄여 시스템의 성능을 향상시킵니다.
파싱(Parsing)은 입력 데이터를 구문 규칙에 따라 분석하고 해석하는 과정을 말합니다. 이는 프로그래밍 언어의 문법 분석이나 데이터 형식의 구조 분석에 사용됩니다. 파싱을 통해 입력 데이터를 구조화하고 의미를 부여하여 프로그램이 데이터를 이해하고 처리할 수 있게 됩니다.
최초의 프로토콜
1번
내가 url을 주면 너는 자원을 찾아서 응답해줘
→ get 요청이라 한다.
state less를 하지않으면 과부하가 온다.
http body 데이터 → 우리가 보내는 메시지(서버가 클라이언트에게 줘야 하는 데이터)
요청(응답) http header (request header)
→ get 요청시 get이 담기고 url이 담기고 소스주소(출발지 IP 주소)가 담긴다.(APP이 담음)
요청(응답) http body (request body)
→ get 요청시 비어있음
브라우저가 의미있게 파싱한다. → http header, http body로 나누니깐
웹에서는 확장자라는 개념이 없어서 MIME을 담는다.
서버는 먼저 get을 본다
WAS → html 서버를 찾아줌
uri
통신 코드는 내부적으로 스레드가 구현되어있다.
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // HTTP 프로토콜이 적용된 객체 소켓이다.
src → .java파일이 모여있는곳
resources → .java를 제외한 모든 파일
앱을 만들때 도메인 이름을 반대로 적고 마지막에는 프로젝트 명으로 한다
ex) com.naver.myproject
MIME 타입
프로토콜이 너무 거대해져서 생긴 것이 RFC 문서이다.
→ 너무 커지다 보니 다른 곳에선 인터페이스 처럼 들러 붙게 된다.
RFC문서로 인해 MIME 타입이 생겼다. ( RFC 6838 )
MIME → 파일 종류를 표기하기 위한 방법 → 웹 브라우저가 서버로 부터 받는 데이터 형식이 무엇인지 알 수 있도록 해준다.
MIME 타입으로
MIME 타입에 명시 되어 있는 명칭이 정확하게 이름이 정해져 있어야지 파싱(구분 분석)이 가능하다.
MIME 타입은 정확하게 명시 해야 파싱이 된다 EX) image/jpeg, image/png 등
MIME 타입은 무조건 HTTP Body가 있어야지 사용
get에 대한 응답이 있어야지 사용
MIME 타입의 종류 → 주로 사용하는 것 ( 통신에 99프로 사용하는 MIME 타입 )
application/json
application/x-www-form-urlencoded
text/html
text/plain
→ 타입을 모르고 사용시 검색해보는 것이 좋다.
텍스트 프레임 → 웹 프로토콜에서 데이터를 전송할 때 ‘프레임’단위로 나눠서 전송하는 것을 말한다.
MIME 중에 JSON(JavaScript Object Notation) 을 배울 것이다.
JSON → 자바 스크립트 오브젝트 표기법
데이터 전송의 목적으로 사용
자바 스크립트
JSON과 자바 스크립트는 데이터의 출력은 비슷한데
JSON에 키에는 쌍따움표가 있다는게 차이이다
JSON을 사용하는 이유
- 모든 데이터는 통신으로 넘어 갈때는 “문자열”로 넘어간다. → 문자열로 변환 되니깐 오브젝트로 변환해야한다. (그래야지 “파싱”이 가능하다)
- 자바스크립트가 자바에 데이터를 던질 때 오브젝트로 변환할 때 다른 자바에서는 언어를 이해 하지 못한다 → String으로 와서 파싱이 불가능 하기 때문
하지만 이 문제를 해결 할 수 있는게 JSON이다.
HTML 논문
통신으로 받은 데이터를 파싱하려고 → Todo
빈생성자를 만들고 set로 데이터를 넣어준다.
json데이터를 자바 데이터로 만들때는 빈 생성자가 필요하다.
json 오브젝트는 중괄호로 시작해서 중괄호로 끝난다
ctrl + alt + L
웹 통신의 기본
- 기본 틀
package com.metacoding.myhttp; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class MyApp { public static void main(String[] args) { try { URL url = new URL("https://jsonplaceholder.typicode.com/todos/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader br = new BufferedReader( new InputStreamReader(conn.getInputStream()) ); String download = ""; while (true) { String line = br.readLine(); if (line == null) break; download = download + line; } //System.out.println(download); ObjectMapper om = new ObjectMapper(); Todo todo = om.readValue(download, Todo.class); System.out.println(todo.getTitle()); } catch (Exception e) { throw new RuntimeException(e); } } }
- 파싱
package com.metacoding.myhttp; public class Todo { private int userId; private int id; private String title; private boolean completed; public Todo() { } public Todo(int userId, int id, String title, boolean completed) { this.userId = userId; this.id = id; this.title = title; this.completed = completed; } public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return title; } public boolean isCompleted() { return completed; } }
- 롬복 깔기
- MVN 에서 검색 lombok
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fb1939378-3cd6-4f1f-9032-6c4df0711232%2F1d24558b-826a-4de5-817f-29f190d8f2d3%2FUntitled.png?table=block&id=4acf7baf-768f-4ccb-9b18-5be6952fbac0&cache=v2)
- 안의 세팅
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2Fb1939378-3cd6-4f1f-9032-6c4df0711232%2F86c5e56a-06ff-4c54-ac2a-7da12586f672%2FUntitled.png?table=block&id=7dbbc3ec-5b07-4432-8083-7441973f3d5b&cache=v2)
- 롬복 설치시 쓸수 있는 명령
@NoArgsConstructor // 빈 생성자 생성 @AllArgsConstructor // 모든 인수를 가진 생성자(full constructor) 생성 @Data // Get,Set을 둘다 생성 @Setter // Set 생성 @Getter // Get 생성
→ 이걸 사용하려면 lombok을 꼭 깔아야 사용이 가능하다 → 이유는 아래의 설명
어노테이션 → 실행 시에 힌트(@가 붙은 명령)를 보고 만들어내는 것
코드상에는 존재하지 않는다.
@는 JVM 주소
실행시에 @를 참조해서 실행 → 실행 시에 자동으로 만들어줌
플러그인을 하지 않으면 툴이 코드를 이해하지 못하고 오류를 발생시킨다.
플러그인이 나중에 만들어지니깐 있는줄 알아~ 라고 하는 것.
풀컨스트럭터(full Constructor) → 모든 인수를 다 받는 생성자
JSON의 핵심
JSON은 시스템 계의 공용어라고 보면 된다.
모든 언어의 오브젝트를 제일 작은(용량이 작은) 공용어로 변환 할 수 있다.
이로 인해 JSON이 전세계표준이다.
그래서 이젠 어떤 언어든 JSON으로 변환 할 수 있으면 어떤 통신이든 가능하다.
// 자바 class User { int id = 1; String username = "ssar"; } // xml <user> <id>1</id> <username>"ssar"</username> </user> // JSON { "id":1, "username":"ssar" }
Share article