Node.js는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임이다.
Non-blocking I/O(입출력)와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.
Non-blocking I/O: 프로그램이 I/O 작업이 완료되기를 기다리는 동안 다른 작업을 계속 실행할 수 있도록 한다. 기다리는 대신 Node.js는 I/O 작업을 기본 시스템에 위임하고 완료 시 실행할 콜백을 등록한다. 이 비동기식 접근 방식을 통해 애플리케이션은 여러 작업을 동시에 처리할 수 있으므로 효율성과 응답성이 향상된다.
JavaScript 런타임 환경 Node.js의 기본 패키지 관리자이다.
npx은 모듈을 로컬에 저장하지 않고, 매번 최신 버전의 파일만을 임시로 불러와 실행 시킨 후에, 다시 그 파일은 없어지는 방식으로 모듈이 돌아간다. 즉, 모듈의 버전을 신경쓰지 않고 사용할 수 있다.
% node -v
% npm -v
% npx create-react-app 원하는 파일 이름
% cd 파일 이름
% npm start
*폴더명에 느낌표(!)가 포함되어 있으면 Failed to compile 가 발생한다.
느낌표(!)는 로더 구문용으로 예약되어 있어 허용되지 않는다.
Compoents는 재사용 가능한 UI를 구축하는 기반이다.
React Compoents는 마크업을 뿌릴 수 있는 JavaScript 함수이다.
import React from 'react'; //리액트를 불러와 컴포넌트 생성
function Hello() {
return <div>안녕하세요</div>
}
export default Hello; // 컴포넌트 내보내기
export default
function Hello() { }
JavaScript 함수를 정의return
한 쌍의 ()괄호로 묶어야 함props는 properties 의 줄임말이다. 어떠한 값을 컴포넌트에게 전달해줘야 할 때, props를 사용한다.
단방향 데이터 흐름을 가지며, parent component는 수정 가능하지만, child components는 읽기만 가능하다.
사용법
import React from "react";
function Greeting(props) {
return <p>hello, {props.name}</p>;
}
function Props() {
return <Greeting name="Mingyenog" />;
}
export default Props;
props.name
을 조회하면 됨<Avatar {...props} />
jsx 스프레드 구문으로 모든 props를 전달할 수 있지만 과도하게 사용하는건 추전하지 않음비구조화할당
import React from "react";
function Greeting({ name }) {
return <p>hello, {name}</p>;
}
function Props() {
return <Greeting name="Mingyenog" />;
}
export default Props;
function Avatar({ person, size })
Child Components에 props 전달
export default function Profile() {
return (
<Avatar
person={{ name: 'Lin Lanying', imageId: '1bX5QH6' }}
size={100}
/>
);
}
State란 컴포넌트가 가질 수 있는 상태를 말한다.
useState()
는 컴포넌트 state(상태)를 생성하고 업데이트 할 수 있는 React Hook 메서드이다. 동적으로 바뀌는 값을 관리할 때 사용한다.
[state, setState]
를 배열 형태로 반환 import { useState } from 'react';
const [state, setState] = useState(initialState);
// = const [state, setState] = React.useState(initialState);
//example
import React, { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
//[값, 함수] = 초기값 - 실시간
const countUp = () =>{
setCount(count + 1)
};
return (
<div>
<p>{count}</p>
<button onClick={() => setCount(count - 1)}>-1</button>
<button onClick={countUp}>+1</button>
</div>
);
}
state
변수 : 현재 상태 값setState()
메서드 : state의 값을 변경하고 값이 변경될 때마다 화면은 다시 랜더링 됌You can put objects and arrays into state. React에서 state는 읽기 전용으로 간주되므로 기존 객체를 변경하는 대신 교체를 해야 한다. 새 객체를 만들어 전체 객체를 바꾼다.
// ✅ Replace state with a new object
setForm({
...form,
firstName: 'Taylor'
});
useReducer()
는 useState()
처럼 컴포넌트 state(상태)를 생성하고 업데이트 할 수 있는 React Hook 메서드이다.
여러 개의 하위 값을 포함하는 복잡한 state(상태)를 다루어야 할 때 사용한다.
[state, dispatch]
를 배열 형태로 반환 import { useReducer } from 'react';
const [state, dispatch] = useReducer(reducer, initialArg, init?);
// useReducer(reducer(), 초기 값, 초기 함수?);
//example
import { useReducer } from 'react';
function reducer(state, action) {
if (action.type === 'incremented_age') {
return {
age: state.age + 1
};
}
throw Error('Unknown action.');
}
export default function Counter() {
const [state, dispatch] = useReducer(reducer, { age: 42 });
return (
<>
<button onClick={() => {
dispatch({ type: 'incremented_age' })
//action는 object형태로 전달
}}>
Increment age
</button>
<p>Hello! You are {state.age}.</p>
</>
);
}
state
변수 : 컴포넌트에서 사용할 상태, 현재 상태 값. e.g.거래내역dispatch(action)
메서드: e.g.은행에게 거래내역 변경을 요구하는 행위action
: 요구사항. e.g.만원을 출금해주세요reducer(state, action)
메서드 : e.g.은행컴포넌트를 외부 시스템과 동기화할 수 있는 React Hook 메서드이다.
어떠한 컴포넌트가 Mount(화면에 첫 랜더링), Update(다시 랜더링), Unmount(화면에서 사라질 때), 특정 작업을 차리할 코드를 실행시켜 줄 때 사용한다.
useEffect(()=>{ });
: 랜더링이 될 때 마다 콜백이 실행 됌useEffect(()=>{ },[value]);
: 화면에 첫 랜더링이 될 때 + value값이 바뀔 때 실행 됌import { useEffect } from 'react';
useEffect(()=>{
//작업
return () => {
//작업 해지 : Clean UP 정리
}
},[])
//example
import React, { useState, useEffect } from "react";
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
setCount((count) => count + 1);
}, 1000);
return () => {
clearInterval(timer);
console.log("clean up function works!");
};
}, []);
return <p>{count}</p>;
}
[]
, 배열(= dependencies)참고문서,
node.js, https://www.cronj.com/blog/node-js-non-blocking-asynchronous-blocking-synchronous/#What_is_IO
react, https://react.vlpt.us/basic/ , https://react.dev/
react hook, https://youtube.com/playlist?list=PLZ5oZ2KmQEYjwhSxjB_74PoU6pmFzgVMO
https://goddaehee.tistory.com/311
본 후기는 유데미-스나이퍼팩토리 10주 완성 프로젝트캠프 학습 일지 후기로 작성 되었습니다.