๐Ÿ“ƒ Front-End

๐Ÿ“ƒ Front-End/Next.js

Next.js - Data Fetching

๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ํ™”๋ฉด์— ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๊ทธ๋ฆฌ๋ ค๋ฉด ์–ด๋””์„ ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1. SSR (Server Side Render) ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ๋งค๋ฒˆ ์—ฐ์‚ฐ์„ ํ•ด์•ผํ•˜๋ฉฐ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— SSG์— ๋น„ํ•ด ๋Š๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ์ตœ์‹ ์˜ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ, SSR๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (ํ”„๋ก ํŠธ)์„œ๋ฒ„์—์„œ HTML ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— CSR์— ๋น„ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ํ™”๋ฉด์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ ๋“ฑ ํŽ˜์ด์ง€์˜ ๋™์ž‘์„ ์œ„ํ•ด์„œ๋Š” hydrate๋ผ๋Š” ๊ณผ์ •์„ ํ†ตํ•ด์„œ JS ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ฐ€ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฐ๋‹ค : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ทธ๋ฆฐ๋‹ค...

๐Ÿ“ƒ Front-End/Next.js

React์˜ ๋ฌธ์ œ์ ๊ณผ NextJS์˜ ๋„์ž…

React์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ถ€๋ถ„ ๋ฆฌ์•กํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋นŒ๋“œํ•˜๋ ค๋ฉด ์‹ ๊ฒฝ ์จ์•ผํ•˜๋Š” ์„ธ๋ถ€์‚ฌํ•ญ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. Webpack์œผ๋กœ ๋ฒˆ๋“ค๋ง & Babel ์ปดํŒŒ์ผ๋Ÿฌ๋กœ JSX → JS ๋กœ ๋ณ€ํ™˜ ์ตœ์ ํ™” (Code Splitting ๋“ฑ)๋ฅผ ํ•ด์•ผํ•จ Static Pre-Rendering (์„ฑ๋Šฅ๊ณผ SEO๋ฅผ ์œ„ํ•ด) / SSR ๋˜๋Š” CSR ๋ฅผ ํ•ด์•ผํ•จ ๋ฆฌ์•กํŠธ ์•ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋ฒ„ ์ธก ์ฝ”๋“œ ์ž‘์„ฑ NextJS: React ํ”„๋ ˆ์ž„์›Œํฌ NextJS๋Š” React ์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ์ ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ง๊ด€์ ์ธ ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ… (Dynamic routes ๋„ ์ง€์›ํ•จ) Pre-rendering, static generation (SSG), server-side rendering (SSR) ์ด ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ œ๊ณต๋จ ์ž..

๐Ÿ“ƒ Front-End/Next.js

Next.js ์ •์˜

Next.js ๋Š” ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š๊ณ ๋„ SSR, SEO๋ถ€ํ„ฐ TypeScript๊นŒ์ง€ ์ƒ์‚ฐ์— ํ•„์š”ํ•œ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ์•„์ฃผ ๊ฐ•๋ ฅํ•œ React ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค. 2. ์–ด๋””์„œ ๋งŒ๋“ค์—ˆ๋‚˜ Next.js๋Š” Vercel์ด๋ผ๋Š” Frontend Team์—์„œ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. 3. ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ  3.1 SSR Next.js ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ  ์ž…๋‹ˆ๋‹ค. ์ดํ•ดํ•˜๊ธฐ ์ข‹๊ฒŒ ๋จผ์ € ๋ฐ˜๋Œ€ ๊ฐœ๋…์ธ SPA ์™€ CSR ์— ๋Œ€ํ•ด ๋จผ์ € ์ •๋ฆฌ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 3.1.1 SPA (Single Page Application) ์ „ํ†ต์ ์ธ ์›น ํŽ˜์ด์ง€ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์€ client ์—์„œ server ๋กœ ์ตœ์ดˆ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  server ๋Š” ์š”์ฒญ์„ ๋ฐ›์•„ client ์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ธ ํ›„, client์—์„œ ํ™”๋ฉด์ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ดํ›„ client ์—์„œ..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(state)

๊ธฐ์กด์˜ useState ์‚ฌ์šฉ ๋ฐฉ์‹ const [count, setCount] = useState(์ดˆ๊ธฐ ๊ฐ’); useState ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด value ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฐ’์€ state ์˜ value ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐ’์€ value ์˜ ์ƒํƒœ ๋ณ€ํ™” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. useState ์— ์ดˆ๊ธฐ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด โ“ const [count, setCount] = useState(1); count ์— ์ˆซ์ž ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  TypeScript ๊ฐ€ ์ดˆ๊ธฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ถ”๋ก ์„ ํ•œ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ const [count, setCount] = useState(1); setCount(2); ์•„๋ฌด ์ผ๋„ ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋Œ€๋กœ ์ž‘์„ฑ์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์ง€๋งŒ ๋งŒ์•ฝ string ํƒ€์ž…์„ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด, ์—๋Ÿฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•ด์ค..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(Optional Props)

default props App.tsx import Circle from "./Circle"; function App() { return ( ); } export default App; Circle.tsx import React from "react"; import styled from "styled-components" interface ContainerProps { bgColor : string; } const Container = styled.div` width : 200px; height : 200px; background-color : ${(props) => props.bgColor}; `; interface CircleProps { // TypeScript ์—๊ฒŒ bgColor ๋Š” ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ..

๐Ÿ“ƒ Front-End/React.js

React + TypeScript(interface)

๊ธฐ๋ณธ์ ์ธ ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋ณ„๋„์˜ ํฌ์ŠคํŒ…์„ ํ†ตํ•ด ์ •๋ฆฌ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค! + ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์ ์šฉ ์„ค์น˜ โ“ 1. ์ฒ˜์Œ๋ถ€ํ„ฐ CRA + ํƒ€์ž… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•  ๋•Œ npx create-react-app my-app --template typescript or yarn create react-app my-app --template typescript 2. ํ”„๋กœ์ ํŠธ ์ค‘๊ฐ„์— ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• npm install --save typescript @types/node @types/react @types/react-dom @types/jest or yarn add typescript @types/node @types/react @type..

๐Ÿ“ƒ Front-End/React.js

useInfiniteQuery ํ˜ธ์ถœ

โœ” useInfiniteQuery ๊ฐ€์ ธ์˜ค๊ธฐ import InfiniteScroll from "react-infinite-scroller"; import { Person } from "./Person"; // ์ด ๋ถ€๋ถ„ import { useInfiniteQuery } from "react-query"; const initialUrl = "https://swapi.dev/api/people/"; const fetchUrl = async (url) => { const response = await fetch(url); return response.json(); }; export function InfinitePeople() { // ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœ const {data, fetchNextPage, hasNe..

๐Ÿ“ƒ Front-End/React.js

React Query - ๋ฌดํ•œ ์Šคํฌ๋กค(Infinite Scroll)

์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€์˜ ํŠน์ • ์ง€์ ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ๋”ฉ๋ฉ๋‹ˆ๋‹ค. React Query ๋Š” ๋ฐ์ดํ„ฐ์™€ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ์ถ”์ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌดํ•œ ์Šคํฌ๋กค ์ด๋ž€ โ“ ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํฌ๋กค ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์  ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋Š” ์ง€์  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€์˜ ํŠน์ • ์ง€์ ์„ ์Šคํฌ๋กค ํ–ˆ์„ ๋•Œ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ( ํŽ˜์ด์ง€์˜ ํ•˜๋‹จ ๋“ฑ ) โœ” useInfiniteQuery ์˜ ํŠน์ง• ๋ฐ˜ํ™˜ ๊ฐ์ฒด์—์„œ ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ”„๋กœํผํ‹ฐ์˜ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. useQuery : ๋‹จ์ˆœํžˆ ์ฟผ๋ฆฌ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ useInfiniteQuery : ๋‘ ๊ฐœ์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€ ๊ฐ์ฒด ..

HoHo.dev
'๐Ÿ“ƒ Front-End' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (5 Page)