day40. 2024-12-02-월요일
동기(Synchronous)
동기는 사전적으로 '동시에 일어난다'는 의미를 갖고 있습니다.
프로그래밍에서 동기는 작업이 순차적으로 진행되는 것을 의미합니다.
즉, 한 작업이 시작되면 해당 작업이 완료될 때까지 다른 작업이 기다려야 합니다.
동기 방식은 호출한 함수 또는 작업이 반환될 때까지 대기하는 동안 실행 흐름이 차단되는 특징이 있습니다.
동기 방식은 일반적으로 간단하고 직관적인 코드를 작성하기 쉽습니다.
하지만 여러 작업이 동시에 실행되어야 하는 경우,
각 작업의 완료를 기다리는 동안 시간이 소요되어 전체 프로세스의 성능이 저하될 수 있습니다.
또한 한 작업이 지연되면 다른 작업들도 모두 지연되는 문제가 발생할 수 있습니다.
비동기(Asynchronous)
비동기는 사전적으로 '동시에 일어나지 않는다'는 의미를 갖고 있습니다.
프로그래밍에서 비동기는 작업이 독립적으로 실행되며,
작업의 완료 여부를 기다리지 않고 다른 작업을 실행할 수 있는 방식을 의미합니다.
즉, 비동기 방식은 작업이 시작되면 해당 작업이 완료될 때까지 기다리지 않고 다음 코드를 실행할 수 있습니다.
비동기 방식은 주로 I/O 작업이나 네트워크 요청과 같이 시간이 오래 걸리는 작업에 유용합니다.
이러한 작업을 비동기적으로 처리하면, 프로그램은 작업이 완료되기를 기다리는 동안
다른 작업을 처리할 수 있으므로 전체적인 성능이 향상됩니다.
비동기 방식은 콜백(callback), 프라미스(Promise), async/await 등의 메커니즘을 통해 구현될 수 있습니다.
(출처: https://won-percent.tistory.com/150)

프로미스를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있습니다.
다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '프로미스(promise)'를 반환합니다.
Promise는 다음 중 하나의 상태를 가집니다.
대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
이행(fulfilled): 연산이 성공적으로 완료됨.
거부(rejected): 연산이 실패함.
(출처: mdn Promise)
콜백 함수(Callback Function)는 특정 조건이 만족되거나, 작업이 완료된 후 실행되도록 전달되는 함수를 말합니다. 즉, 다른 함수에 매개변수로 넘겨져 특정 시점에 호출되는 함수입니다. (출처: chatGPT)
day41. 2024-12-03-화요일
개발하는 애플리케이션의 크기가 커지면 언젠간 파일을 여러 개로 분리해야 하는 시점이 옵니다.
이때 분리된 파일 각각을 '모듈(module)'이라고 부르는데, 모듈은 대개 클래스 하나 혹은 특정한 목적을 가진 복수의 함수로 구성된 라이브러리 하나로 구성됩니다.
모듈은 단지 파일 하나에 불과합니다. 스크립트 하나는 모듈 하나입니다.
모듈에 특수한 지시자 export와 import를 적용하면 다른 모듈을 불러와 불러온 모듈에 있는 함수를 호출하는 것과 같은 기능 공유가 가능합니다.
모듈은 특수한 키워드나 기능과 함께 사용되므로 <script type="module"> 같은 속성을 설정해 해당 스크립트가 모듈이란 걸 브라우저가 알 수 있게 해줘야 합니다. (포스팅 맨 마지막에 브라우저 코드를 작성했습니다.)
출처: https://inpa.tistory.com/entry/JS-📚-모듈-사용하기-import-export-정리 [Inpa Dev 👨💻:티스토리]
모듈은 로컬 파일에서 동작하지 않고, HTTP 또는 HTTPS 프로토콜을 통해서만 동작합니다.
로컬에서 file:// 프로토콜을 사용해 웹페이지를 열면 import, export 지시자가 동작하지 않습니다.
(출처: https://inpa.tistory.com/entry/JS-📚-모듈-사용하기-import-export-정리 [Inpa Dev 👨💻:티스토리])
<script type="module"> /* import - */
ES6이 지원하기 시작한 모듈 개념이다.
js를 가지고 모듈화시켜서 재사용이 가능한 코드를 전개할 수 있다. - 백엔드 쪽 코드
<script type="text/javascript">: 오리지널 - commonjs - 기존 프론트 쪽 코드
한계: 다른 서버와 연계가 어렵다.
module일때 import와 export를 사용할 수 있다
그래서 javascripts/firebase.js 작성한 뒤 맨끝에 export를 추가하였다.
사용자가 정의한 XXX.js를 외부에서 사용할 수 있게 된다.
JSON을 JS Object로 파싱하기 위해서 필요한 메소드: JSON.parse()
JS Object를 JSON으로 변환해주기 위해 필요한 메소드: JSON.stringify()
bookLis.ejs
//장바구니 담기
$("#list_book").on("click",".card .cart", async function(){
console.log("cart click");
if(uid){
const book = JSON.parse($(this).attr("book")) <<<<<여기!!!!!!!!!!!!!!!
console.log(book);
await set(ref(db,`cart/${uid}/${book.isbn}`),book)
alert("장바구니에 등록되었습니다.")
//console.log(book);
}else{
//uid가 undefined, null, 0, NaN
location.href='/login'
}
})

프로젝트 생성 명령어
npx create-react-app myblog-step1(프로젝트명)
cd myblog-step1(프로젝트명)
npm install //node-modules 설치(앞에서 되긴 함, 파일 확인후 실행)
npm start
npm run starat (브라우저 실행)
교과서
https://ko.legacy.reactjs.org/docs/introducing-jsx.html
day42. 2024-12.04-수요일
오전) router-template2024: 웹 페이지 탬플릿 구현

: 배너 만들기 - w3schools.com, react-bootstrap, getbootstrap 등에서 디자인 코드 따와서 사용하는 법
오후)
react/workout_step1
react/news_step1
react/workout_step2_241205과제
디자인 참조: w3schools.com, react-bootstrap, bootstrap 유용하게 사용하자
브라우저는 http://localhost:3000/+(index.html 생략되어있음)로 디폴트 3000을 사용한다.
<div id="root"></div> in index.html에서 root에 대한 정보는 index.js에서 참조한다 => document.querySelector("#root") -> index.js에서 App import

- root.render() : render: 페이지(화면)를 보냄. send: 메세지를 보냄
index.js>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import React from 'react';
import ReactDOM from 'react-dom/client';
import 'bootstrap/dist/css/bootstrap.min.css';
import App from './App';
import { BrowserRouter } from 'react-router';
const root = ReactDOM.createRoot(document.querySelector('#root'));
root.render( /* render: 페이지(화면)를 보냄. send: 메세지를 보냄 */
<>
<BrowserRouter>
<App /> {/* App 내용 화면에 뿌려줘~ */}
</BrowserRouter>
</>
);
App.jsx>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
import { Route, Routes } from "react-router"; /* import!!!! */
import HomePage from "./commponents/pages/HomePage";
import LoginPage from "./commponents/auth/LoginPage";
import NoticePage from "./commponents/pages/NoticePage";
const App = () => {
//선언부
//return내용이 화면에 출력 - index.html문서에 root div태그 내부에 추가됨
// <div id="root"></div>
return ( // return에 있는 태그가 화면에 출력
<>{/* <>안에 Fragment 생략가능 */}
<Routes>
<Route path="/" exact={true} element={<HomePage/>} /> {/* 열림/닫힘태그 동시에 작성 */}
<Route path="/login" exact={true} element={<LoginPage/>} />
<Route path="/notice/list" exact={true} element={<NoticePage/>} />
</Routes>
</>
);
}
<Header/>이때, <Nav.Link href="#home">Home</Nav.Link> 를 사용하면 페이지 이동시 href를 사용하면 URL이 변한다. 이렇게 되면 기존 요청 끊기고(기존 정보 잃어버림), 새로운 요청 발생한다.
React의 기본 방향은 하나의 화면으로 사용하는 것, 즉 SPA(Single Page Application)이기 때문에, URL이 안바뀌도록 react-router-dom 제공 컴포넌트 import하여 사용한다. => <Link to="/">Home</Link>
day4. 2024-12-09-월요일
REACT-BASIC/OO.DOM/00-1 : babel1~4, props
git merge하여서 로컬 웹 연결 방법 - 따로 글 작성
[].map((item, index)=> {
<li key={index}></li>
})
상태값이 변하면 누가 변경되었는지 찾아낸다.(알고리즘 필요-리액드제공)
여러개의 돔 중에서 변경된 DOM을 찾아내어 그 부분만 새로 그린다(Re-rendering).
컴포넌트는 사용자 정의 태그로 사용될 수 있다.
컴포넌트를 화살표 함수로 구현하면 된다(일급함수).
화살표 함수의 리턴값은 화면이거나 함수(고차함수)이다.
day45. 2024-12-10-화

day46. 2024-12-11-수
나의 역할: 큰 틀을 볼 줄 알아야 한다. 기능은 이미 AI가 구성해준다
프로젝트 : 완성이 목표가 아님! 트리를 그리면서 큰 틀을 보고 정리할 줄 아는 능력 키우면서 해나가는 방향
https://ko.legacy.reactjs.org/docs/rendering-elements.html
sort() 사용: 원본 배열이 변경되면 React에서 상태 변경을 감지하지 못할 수 있음
→ 새 배열 생성 후 상태로 설정 필요.
filter() 사용: 원본 배열은 변경되지 않고 새 배열을 반환
→ React에서 상태 변경 감지.
=> 그냥 항상 spread연산자 이용해서 복사본 만들어서 하자
sort()>>>>>>>>>>>>>>
const bookSort = () => {
//const sortedBooks = books.sort(); //이거슨 원본 정렬이다..
const sortedBooks = [...books].sort(); //복사본 정렬
setBooks(sortedBooks);
//useState를 사용하면 변경된 부분이 즉시 반영된다. - 동기화
filter()>>>>>>>>>>>>>
const handleDelete = (item) =>{
const index = items.indexOf(item)
console.log(`${item.name}, index ${index}`);
////////////filter((**여기파라미터**) =>{}) 이해!
const updatedItems = items.filter((currentItem) => currentItem.id !== item.id);
setItems(updatedItems) /* 삭제 반영 */
}
}
적절한 예는 아니지만 일단 이것도 있고... 또 찾아보겠움
const element = (
<>
{/* 여기는 JSX 영역 - key값 사용시 반드시 unique해야 함 */}
{/* js 복잡한 연산을 element 사용하는 곳에서 사용 가능 */}
{[1,2,3,4,5,7,8,9,10].map((x, index) =>
<Number2 key={index} number={x} selected={x%2===0}/>
)}
</>
)
workout-step2_241205과제/WorkoutApp.jsx >>>>>>>>>>>>>>>>
<Navbar totalCount={items.filter(item => item.count > 0).length}/>
npm i react-router : i-install, react-router-라이브러리 이름
===> npm사이트 참고
day47. 2024-12-12-목
day48. 2024-12-12-금

번들러 만들기 : parcel-Youtube

axios 사용
Axios는 브라우저, Node.js를 위한 Promise API를 활용하는 HTTP 비동기 통신 라이브러리이다.
axios와 fetch 차이점: https://velog.io/@sunkim/React-axios-와-fetch-차이점
useEffect(()=>{
axios.get('https://youtube.googleapis.com/youtube/v3/videos?',{params}) >>>>>>>>>>>>>여기
.then(result => {
setVideos(result.data.items)
}).catch(error => console.log(error))
},[])

