day26. 24-11-12-화
(day25 프론트엔드 수업 내용)
- 백엔드 : java
- 프로트엔드 :
- html + css3 + javascript(이벤트처리),
- nodejs(웹서비스 이해와 개요[Restful API, 쿠키]
- express 플랫폼), reactjs
- 개발도구 : VSCode
- 파이썬 & 크롤링 수업
- 시각화
- 빅데이터 분석
- 머신러닝
- 딥러닝
- 강화학습
- 자연어 처리
--------------
- 트랜스포머
- 컴퓨터 비전
(참고: https://velog.io/@hailey199535/HTML-CSS-JavaScript)
www.naver.com과 같은 URL을 브라우저에 입력하고 엔터를 눌렀을 때 일어나는 일은 매우 복잡한 과정으로, 여러 단계로 나눌 수 있습니다. 이 과정은 DNS 조회, TCP 연결, HTTP 요청 및 응답 등 여러 네트워크 레벨의 작업과 브라우저 내부에서 발생하는 렌더링 작업까지 포함됩니다.
브라우저는 DNS 캐시를 먼저 확인하여, 최근에 해당 도메인의 IP 주소가 캐시되어 있는지 확인합니다. 만약 캐시에 없으면, 운영체제나 네트워크에 연결된 DNS 서버에 www.naver.com에 대한 IP 주소를 요청합니다.
DNS 서버는 도메인 이름을 IP 주소(예: 125.209.222.142)로 변환해 브라우저에 응답합니다.
TCP 3-way 핸드셰이크: 브라우저와 서버는 데이터를 전송하기 전에 안전하고 신뢰할 수 있는 연결을 설정하기 위해 3단계 과정을 거칩니다.
SYN: 브라우저가 서버에 연결을 요청합니다.
SYN-ACK: 서버가 요청을 승인하고 응답합니다.
ACK: 브라우저가 이를 확인하고 데이터 전송을 시작합니다.
만약 HTTPS 프로토콜을 사용하는 경우, TCP 연결 후 TLS/SSL 핸드셰이크가 추가로 진행됩니다. 이 과정에서 클라이언트(브라우저)와 서버가 암호화된 통신을 위한 키를 교환하여 보안을 강화합니다.
GET 요청: www.naver.com에 대한 요청은 보통 GET 요청으로 이루어집니다. 이는 서버에게 특정 리소스를 달라는 요청입니다.
HTTP 헤더: 요청에는 여러 정보를 포함한 HTTP 헤더가 전송됩니다. 예를 들어, 브라우저 정보(User-Agent), 쿠키, 캐시 상태 등이 포함됩니다.
HTTP 상태 코드: 응답에는 상태 코드가 포함됩니다. 200은 정상적인 응답, 404는 요청한 페이지를 찾을 수 없다는 의미입니다.
HTML 문서 전송: 서버는 요청한 리소스를 응답으로 보내는데, 이때 브라우저는 HTML 문서를 우선적으로 받습니다. 이 문서가 웹 페이지의 뼈대입니다.
브라우저는 HTML을 한 줄씩 읽어가며 DOM 트리를 구성합니다. 이때 img, script, link 등의 외부 리소스를 요청하는 태그를 만나면 추가적으로 요청을 수행합니다.
이러한 리소스는 페이지의 렌더링 과정에 추가적으로 영향을 줍니다. 특히, 큰 이미지나 비디오 파일은 페이지 로드 속도에 영향을 미칠 수 있습니다.
레이아웃 계산: 브라우저는 각 요소의 위치와 크기를 계산합니다. CSS 규칙과 화면 크기(뷰포트)에 따라 페이지 레이아웃이 설정됩니다.
이 과정에서 브라우저는 각 요소를 픽셀 단위로 렌더링하고, 화면에 그려지게 됩니다.
API란?
API는 Application Programming Interface(애플리케이션 프로그램 인터페이스)의 줄임말입니다.
API의 맥락에서 애플리케이션이라는 단어는 고유한 기능을 가진 모든 소프트웨어를 나타냅니다.
인터페이스는 두 애플리케이션 간의 서비스 계약이라고 할 수 있습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coordinate</title>
<!-- 주석이다: 주석색 변경:settings.json 36번줄 -->
<!-- html문서는 위에서 아래로 순차적으로 읽어 처리(자바와 다름):절차지향적
javascript는 html태그의 요소에 접근해야 함
-> html화면이 모두 랜더링이 된 다음에야 그 요소를 참조할 수 있다.
-->
<script src="./main.js"defer></script>
<link rel="stylesheet" href="./main.css"/>
</head>
<body>
<div class="line horizontal"></div>
<div class="line vertical"></div>
<img src="../images/target.png" alt="target" class="target">
<span class="tag">Hello</span>
</body>
</html>
day27. 2024-11-13-수
(출처: https://url.kr/uzhxqg)<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body{
background-color: black;
}
div{
width: 250px;
height: 250px;
background-color: blanchedalmond;
margin-bottom: 4px;
border-radius: 6px;
}
.special{
background-color: lightsalmon;
}
</style>
</head>
<body>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div class="special"></div>
<div></div>
<div></div>
</body>
</html>
선택자를 접근할 수 있는 API가 있다
document, 함수이름: querySelector(클래스선택자|아이디선택자|태그선택자)
-> 브라우저가 지원하는 내장객체 - document, window - Javascript영역
무엇을 보았나?
div는 블록요소이다.(span은 인라인 요소)
블록요소는 크기가 있어서 노드가 차지하는 공간을 제외한 나머지는 여백으로 채운다
span.html>>>>>>>>>>>>>>>>>>>>>>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body{
background-color: black;
}
span{
/* display: inline-block; */
width: 250px;
height: 250px;
background-color: blanchedalmond;
margin-right: 4px;
border-radius: 30%;
}
</style>
</head>
<body>
<span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span>
</body>
</html>
- a.html -
<body>
<script src="./main.js"defer></script>
<div class="root"></div>
</body>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
const div_root = document.querySelector(".root");
alert(div_root)
</script>
<div class="root"></div>
</body>
</html>

//자바 주석과 같음
const vertical = document.querySelector(".vertical"); //상수 선언
const horizontal = document.querySelector(".horizontal");
const target = document.querySelector(".target");
const tag = document.querySelector(".tag");
document.addEventListener('mousemove',(event)=>{
const x = event.clientX; //상수 선언
const y = event.clientY;
console.log(`${x}, ${y}`)
vertical.style.left = `${x}px`;
horizontal.style.top = `${y}px`;
target.style.left = `${x}px`;
target.style.top = `${y}px`;
tag.style.left = `${x}px`;
tag.style.top = `${y}px`;
tag.innerHTML = `${x}px, ${y}px`;
})
웹애플리케이션을 먼저 만들어보면서 그 과정에서 프로그래밍이라는 것이 무엇인지 알아본다.
<<<news.html>>>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>해커뉴스-step1</title>
<script src="./news.js"defer></script> <!-- defer 반드시 붙여야함 -->
</head>
<body>
<div id="root"></div>
</body>
</html>
<<news.js>>>
const NEWS_URL = "https://api.hnpwa.com/v0/news/1.json"; //상수 선언
//비동기와 동기를 지원하는 객체 - XMLHttpRequest
const ajax = new XMLHttpRequest();
ajax.open("GET", NEWS_URL, false);
ajax.send(); //실제 요청 진행
console.log(ajax.response);
const newList = JSON.parse(ajax.response);
const ul = document.createElement("ul");
for(let i = 0;i<20;i++){
const li = document.createElement("li");
li.innerHTML = newList[i].title;
ul.appendChild(li);
}
document.querySelector("#root").appendChild(ul); //id선택자 root


--사원의 부서이름을 알아보자!
select empno, ename, dname
from emp, dept;
-- 조회결과는 14명의 사원에 대한 부서이름을 출력한다
--14 ,4 -> 14*4= 56이 출력 - 카타시안 곱
-- 조인 : 문제 해결 방법
--ERD(Entity Relation Diagram) -> ER win
-- 하나의 부서에 근무하는 사원이 몇명인가요?
select count(empno) from emp where deptno=40;
select count(empno) from emp where deptno=30;
select count(empno) from emp where deptno=20;
select count(empno) from emp where deptno=10;
select deptno, count(empno) from emp group by deptno;
--원래 문제로 돌아가서 사원의 부서이름을 알아보자!
--Natural 조인, euql 조인
--emp에 부서이름은 없지만 부서번호가 있다!
-- emp, dept는 부서번호(dept의 pk)로 연결되어있음
- UID바 (unique identifier bar)
- 테이블 각 엔티티에 대한 고유 식별자를 표시
- 그 대상은 주로 pk를 시각적으로 나타냄
- 각 엔티티가 특정 속성을 통해서 고유하게 식별될 수 있도록 함
- empno, deptno : 고유식별자(UID)
- PK는 인텍스 제공됨, UNIQUE, NOT NULL
- FK는 중복 허락, 인덱스 없다
-- emp에서 empno는 pk, deptno는 fk




오라클 쿼리문
talk_member DB

talk_friend DB

문제: 멤버아이디 : 나, 'kiwi' + 내친구의 이름을 출력

결과

System.out.println(tvo);
System.out.println(tvo.toString());
//tvo는 변수담는곳, 두 결과 똑같이 내부 값 보여줌
System.out.println(tList);
System.out.println(tList.toString());
//tList와 tList.toString()은 동일하게 내부 리스트 내용 출력
TalkVO(mem_id=12, mem_pw=null, mem_nick=123, mem_name=123, gender=null, zipcode=0, mel_addr=null, gubun=mem_id, keyword=1)
TalkVO(mem_id=12, mem_pw=null, mem_nick=123, mem_name=123, gender=null, zipcode=0, mel_addr=null, gubun=mem_id, keyword=1)
[TalkVO(mem_id=12, mem_pw=null, mem_nick=123, mem_name=123, gender=null, zipcode=0, mel_addr=null, gubun=mem_id, keyword=1)]
[TalkVO(mem_id=12, mem_pw=null, mem_nick=123, mem_name=123, gender=null, zipcode=0, mel_addr=null, gubun=mem_id, keyword=1), TalkVO(mem_id=12, mem_pw=null, mem_nick=123, mem_name=123, gender=null, zipcode=0, mel_addr=null, gubun=mem_id, keyword=1)]
day28. 2024-11-14-목요일
https://jsbin.com/?html,css,js,output
DOM API를 활용해보기(브라우저가 DOM TREE를 그린다)
hashchange : event 처리해주는 > step2에서 기사제목 클릭했을 때 이벤트 처리 하겠다 - 화면 전환hashchange event is fired when the fragment identifier of the URL has changed (from mdn)ajax = new XMLHttpRequerst();
ajax.open("GET","URL", false) // 설정
// false : 비동기로 하겠다. (true-동기)
// GET 방식으로 요청한다
ajax.send(null) // 서버로 요청 전송

day29. 2024-11-15-금
변수 선언 및 컴파일 설명

undefined

벡틱이란 무엇일까?




가독성 비교


https://velog.io/@surim014/JSON이란-무엇인가
href 꼭 사용
function getData(url){
//반복되는 ajax코드는 호출주소url은 매번 다름 -> 함수 파라미터로 넣어줌
ajax.open("GET", url, false);
ajax.send(); //실제 요청 진행
return JSON.parse(ajax.response); //처리 결과를 반환하자
}
//ajax.open("GET", NEWS_URL, false);
//ajax.send();
const newsList = getData(NEWS_URL);
//ajax.open("GET", CONTENT_URL.replace("@id",id), false);
//ajax.send();
const newsContent = getData(CONTENT_URL.replace("@id",id))

-> DOM API 자체를 최대한 사용하지 않는 것 --아이러니ㅎㅎ
===>> 바로 문자열을 가지고 UI를 만드는 방법! - 템플릿 리터럴 소개(`` : 벡틱)
