Frontend (6) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ ๋ฐ๋ฒจ(Babel) ์ค์ ํ๊ธฐ ๋ฐ๋ฒจ(Babel)์ ์ ์ฌ์ฉํ ๊น? ๋ฐ๋ฒจ์ ํธ๋์คํ์ผ๋ฌ๋ก ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ(ํ์ ์คํฌ๋ฆฝํธ, JSX ํฌํจ)๊ฐ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ๋๋ก ๋ณํํด ์ค๋๋ค. ์คํ์ด ์๋๋ ๊ตฌ๋ฒ์ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ํ๊ธฐ ์ํด ๋ฐฐํฌํ ๋์ ์์ ๋ฐฉ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ณํํด์ ๋ฐฐํฌํ๋ ค๊ณ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ฒจ ๋น๋ ๊ณผ์ ํ์ฑ(Parsing): ์ฝ๋๋ฅผ ๋ถํดํ๋ ๊ณผ์ ๋ณํ(Transforming): ES6 -> ES5 ๋ณํํ๋ ๊ณผ์ ์ถ๋ ฅ(Printing): ๋ณ๊ฒฝ๋ ๊ฒฐ๊ณผ๋ฌผ์ ์ถ๋ ฅํ๋ ๊ณผ์ ํ๋ฌ๊ทธ์ธ ๋ฐ๋ฒจ ํ๋ฌ๊ทธ์ธ์ ๋ฐ๋ฒจ์ด ์ด๋ค ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋ณํํ ์ง์ ๋ํ ๊ท์น์ ๋ํ๋ ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ์ ์ง์ ๋ง๋ ์ปค์คํ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ฑฐ๋ ์ ๋ง๋ค์ด์ง ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ ธ๋ค ์ฌ์ฉํฉ๋๋ค. ex) .babelrc { "plugins": ["transform.. React-Query React-Query๋? React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ฐ์ดํฐ Fetching, ์บ์ฑ, ๋๊ธฐํ, ์๋ฒ ์ชฝ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋น๋๊ธฐ ๊ณผ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ํธํ๊ฒ ํ ์ ์์ต๋๋ค. ์ฌ์ฉํ๋ ์ด์ ์๋์ ๊ฐ์ด React๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ useEffect๋ฅผ ์ฌ์ฉํ๊ณ useState๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. import React, { useEffect, useState } from "react"; import axios from "axios"; const App = function () { const [sate, setState] = useState([]); const load = async () => { const { data } = await axios.g.. CRA(Create React App) ์นํฉ ์ค์ ํ๊ธฐ CRA๋ ํ๋ก์ ํธ ์ด๊ธฐ ์ธํ ๋ฐ ๋ณต์กํ ๊ณผ์ ์ ํด๊ฒฐํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก ํ์ ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. yarn create react-app my-app --template typescript ์ด๋ ๊ฒ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ๋ฐ๋ฒจ์ด๋ ์นํฉ ๊ฐ์ ์ข ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค์ ์ด ๋ณด์ด์ง ์์ต๋๋ค. ์จ๊ฒจ์ง ์ข ์์ฑ ๋ฐ ์ค์ ์ ํ์ธํ๊ณ ์์ ํ๊ธฐ ์ํด์๋ eject ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ ์ด ๋ฐฉ๋ฒ์ ๋จ๋ฐฉํฅ ํ๋ก์ธ์ค๋ก ํ๋ฒ ์คํํ๋ฉด ๋ค์ ์์ํ๋ก ๋ณต๊ตฌํ ์ ์๊ณ ์ดํ ์ง์ ์ ์ง๋ณด์๋ฅผ ํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ์ค์ ์ ์ ์งํ๋ฉด์ ์๋ก ์ถ๊ฐํ๊ณ ์ถ์ ์ค์ ๋ง ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ ์ด ๋ฐฉ๋ฒ์ ๊ธฐ์กด ์ค์ ๋ค์ ์ ๊ฒฝ ์ฐ์ง ์๊ณ ์ํ๋ ์ค์ ๋ง ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ด๋ฆฌ ๋ฐ ์ ์ง ๋ณด์ํ๊ธฐ ์ข์ต๋๋ค. .. React์์ setInterval ์ฌ์ฉํ๊ธฐ ์ ๋ฐ์ดํธ ํจ์ setState๋ฅผ ํ์ฉํ์ฌ ๊ตฌํ import { useEffect, useState } from "react"; import "./App.css"; function App() { const [count, setCount] = useState(0); useEffect(() => { const timer = setInterval(() => { setCount((prev) => prev + 1); }, 1000); return () => { clearInterval(timer); }; }, []); return ( {count} ); } export default App; ์ ์์ค๋ 1์ด๋ง๋ค ์นด์ดํธ๋ฅผ 1 ์ฉ ์ฌ๋ ค์ฃผ๋ ์ฝ๋์ ๋๋ค. useEffect ๋ ๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด componene.. React 18 ๋ฒ์ ์ ๋ฐ์ดํธ ์ ๋ฆฌ 1. Automatic Batching ์๋ ๋ฐฐ์น๋ ์ฌ๋ฌ ๊ฐ์ state ์ ๋ฐ์ดํธ๋ฅผ ํ๋๋ก ๋ฌถ์ด render ํจ์๋ฅผ ํธ์ถ(๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ ๊ฐ์ )ํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ๊ธฐ์กด 17 ๋ฒ์ ์์๋ ์ด๋ฌํ ๋ฐฐ์นญ ์ฒ๋ฆฌ๋ ๋์์ง๋ง ๋น๋๊ธฐ ๋ถ๋ถ์์๋ ์๋ ๋ฐฐ์น ์ฒ๋ฆฌ๊ฐ ๋์ง ์์์ต๋๋ค. ํ์ง๋ง 18 ๋ฒ์ ๋ถํฐ๋ ๋น๋๊ธฐ์์๋ ์๋ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์ง์ํฉ๋๋ค. import { useState } from "react"; import "./App.css"; function App() { const [number, setNumber] = useState(0); const [boolean, setBoolean] = useState(true); const onClick = () => { setNumber((prev) => prev + 1);.. TDD (ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ) TDD(Test Driven Development)๋? TDD๋ Test Driven Development๋ผ๋ ์ฝ์๋ก ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ์๋ฏธํ๋ค. ํ ์คํธ๋ ์๋น์ค์ ํ์ง ํ์ธ ๋ฐ ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค. ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์์ํ๋ ๋๋ก ๋์ํ๋์ง ๊ฒ์ฆํ๊ณ ํ์ธํ๋ ๊ฒ์ด๋ค. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ๋ฌด์์ผ๊น? ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ด๋ ํ ์คํธ๋ฅผ ํตํด์ ๊ฐ๋ฐ์ด ์ด๋์ด์ง๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ด๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์งํํ๋ค. 1. ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ค.(๊ฐ๋จํ๊ฒ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ์์ธก๋์ด์ผ ํ๋์ง ๊ธฐ์ ํ๋ ๋จ๊ณ) 2. ์์ฑํ ํ ์คํธ์ ๊ธฐ๋ฅ๋งํผ์ ๊ฐ๋ฐ์ ์งํํ๋ค. 3. ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํ๋ค. ์ฌ๊ธฐ์ ํ ์คํธ๋ฅผ ์์ฑํ์ง ์์ ๋ถ๋ถ์ ๊ตฌํํ์ง ์๋ ๊ฒ์ด๋ค. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ์ ์์ ๊ฐ์ ์ฌ์ดํด์ ๋ฐ๋ณตํ๋ค. 1. ๋จผ์ .. ์ด์ 1 ๋ค์