๐Ÿ“ƒ Front-End

๐Ÿ“ƒ Front-End/React.js

React + TS + Style-Components

ํฌ์ŠคํŒ… ์ฃผ ๋‚ด์šฉ์€ ์ „์—ญ ์Šคํƒ€์ผ(Global), ํ…Œ๋งˆ(theme), ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ์— ํฌ์ปค์Šค๋ฅผ ๋งž์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค. react ๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ์ ์ด ์žˆ๊ฑฐ๋‚˜, ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹  ์ ์ด ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ ์ฝ”๋“œ ์ˆœ์„œ๋งŒ ๋ณด๊ณ  ์ถฉ๋ถ„ํžˆ ๊ฐ์„ ์žก์œผ์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐ ํ•ฉ๋‹ˆ๋‹ค. โœ” ํ™˜๊ฒฝ ์„ธํŒ… // ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ ์„ค์น˜ yarn add styled-components // ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ ์šฉ yarn add --dev @types/styled-components โœ” styled.d.ts import 'styled-components'; declare module 'styled-components' { export interface DefaultTheme { TitleFont : { fontSize : any; fontF..

๐Ÿ“ƒ Front-End/React.js

React-Query ์บ์‹ฑ์— ๋Œ€ํ•˜์—ฌ

stale ๋Œ€ํ•˜์—ฌ ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ staleํ•œ ์ƒํƒœ๋กœ ์—ฌ๊น๋‹ˆ๋‹ค. stale์ด๋ž€ ์ตœ์‹ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ผ๋Š” ์˜๋ฏธ๋กœ staleํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— refetch ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด query ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งˆ์šดํŠธ๋  ๋•Œ( useQuery๊ฐ€ ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ) ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ์ดํƒˆํ–ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ํฌ์ปค์Šคํ•  ๋•Œ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋‹ค์‹œ ์—ฐ๊ฒฐ๋  ๋•Œ ํŠน๋ณ„ํžˆ ์„ค์ •ํ•œ refetch interval์— ์˜ํ•ด์„œ (refetchInterval) refetchOnWindowFocus ์˜ต์…˜ ๋“ฑ์œผ๋กœ ๊ธฐ๋ณธ refetch ์„ค์ •์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ณ  staleTime ์˜ต์…˜์œผ๋กœ ์„ค์ •ํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฐ์ดํ„ฐ๊ฐ€ stale ๋˜์ง€ ์•Š๋„๋ก ํ•ด refetch๋ฅผ ๋ง‰์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. query์— ๋ณ„๋‹ค๋ฅธ action์ด ์—†์œผ๋ฉด inactive ์ƒํƒœ๋กœ ..

๐Ÿ“ƒ Front-End/React.js

react-router-dom V6 ๊ณต๋ถ€

์„ค์น˜ yarn add react-router-dom โœ” createBrowserRouter() const router = createBrowserRouter([๊ฐ ๊ฒฝ๋กœ์˜ ๋ฐฐ์—ด]) App.js import React from 'react'; import { createBrowserRouter, RouterProvider } from 'react-router-dom'; const router = createBrowserRouter([]); export default function App() { return } ์œ„์™€ ๊ฐ™์ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— ์„ธํŒ…์„ ํ•ด์ค๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•˜๊ธฐ import React from 'react'; import { createBrowserRouter, RouterProvider ..

๐Ÿ“ƒ Front-End/Next.js

Dynamic Routes

[slug] ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ๊ฒƒ ์ธ๊ฐ€? - pages/category/[slug].js slug ๊ฐ’์— ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ณด์—ฌ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1. useRouter Next.js ์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import { useRouter } from 'next/router' // ์„ ์–ธ const router = useRouter(); const { slug } = router.query; 1.1 category.js import { useRouter } from "next/router"; const CategorySlug = () => { const router = useRouter() const { slug } = router.query return ( Category {slu..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Assets, Meta data, CSS

1. Assets 1.1 public ๋””๋ ‰ํ† ๋ฆฌ ์ •์  ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ public ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๋Š” public ํด๋”๊ฐ€ / ๋กœ ๋งค์นญ ๋ฉ๋‹ˆ๋‹ค. 1.2 ์ตœ์ ํ™” ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€ ๊ทธ๋Ÿฌ๋‚˜, ์ผ๋ฐ˜ HTML ์˜ img ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์˜ ์ƒํ™ฉ๋“ค์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์— ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ ์šฉ๋˜๋Š”์ง€ ๋‹ค๋ฅธ ํˆด ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋ทฐํฌํŠธ์— ๋“ค์–ด๊ฐˆ ๋•Œ๋งŒ ์ด๋ฏธ์ง€ ๋กœ๋“œ ๋“ฑ ... ํ•˜์ง€๋งŒ, Next.js ๋Š” Image ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค. 1.3 Image Component - ์ด๋ฏธ์ง€ ์ž๋™ ์ตœ์ ํ™” Next.js ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ์ตœ์ ํ™”๋„ ์ง€์› ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ํฌ๊ธฐ ์กฐ์ •, ์ตœ์ ํ™”์™€ ์ตœ์‹  ์ด๋ฏธ์ง€ ํฌ๋ฉง (..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Link

Next.js ์—์„œ๋Š” ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๊ฐ€์›Œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š”, ์•ฑ ๋‚ด์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค. React ์—์„œ React router link ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค. Link ํŽ˜์ด์ง€๊ฐ„์˜ ํƒ์ƒ‰์„ CSR์œผ๋กœ ์ง„ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Code Splitting์ด ํŽ˜์ด์ง€ ๋ณ„๋กœ ์ง„ํ–‰ ๋˜์–ด ๊ฐ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ํŽ˜์ด์ง€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋‚˜๋จธ์ง€ ์•ฑ์€ ์ •์ƒ ์ž‘๋™ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. next/link ๊ฐ€์žฅ ๋จผ์ € import ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์น˜๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. import Link ..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Routing

Next.js ์˜ Router ๋Š” file-system ๊ธฐ๋ฐ˜ file-system : ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ๊ทธ ์ฆ‰์‹œ ๋ผ์šฐํ„ฐ๋กœ ์ธ์ง€๋˜๊ณ  ์ฃผ์†Œ๊ฐ€ ๋งตํ•‘์ด ๋ฉ๋‹ˆ๋‹ค. pages/ src/pages/ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ณ„๋„์˜ Router ๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, Next.js ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต์„ ํ•ฉ๋‹ˆ๋‹ค. pages/ OR src/pages ๋‘˜ ์ค‘ ์šฐ์„ ์ˆœ์œ„๋Š”? ์šฐ์„ ์ˆœ์œ„๋Š” pages/ ๊ฐ€ ์šฐ์„  ์ž…๋‹ˆ๋‹ค. pages/index.js import Link from 'next/link' import { useEffect, useState } from 'react' export async function getStaticProps(){ console.log('server') return { props..

๐Ÿ“ƒ Front-End/Next.js

Next.js - Pre Rendering

1. React.js ์˜ ๋ฐฉ์‹ 1.1 ๊ธฐ์กด์˜ React ๋Š” CSR ๋ฐฉ์‹์œผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ™”๋ฉด์„ ์ง์ ‘ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์œ ์ €๊ฐ€ ๋ณด๋Š” UI ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. React ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ™”๋ฉด์˜ ๋ชจ๋“  ๊ฒƒ์€ HTML ์†Œ์Šค์ฝ”๋“œ ์•ˆ์— ๋“ค์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. React ๋กœ ๋งŒ๋“ค์–ด์ง„ ์•ฑ์„ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ํ™•์ธํ•˜๋ฉด, ํ•˜๋‚˜์˜ ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML ์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋น„์–ด์žˆ๋Š” div ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ ํ›„, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์š”์ฒญํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ React.js ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๊ณ  ๊ทธ ๋‹ค์Œ ํ™”๋ฉด์ด ์œ ์ €์—๊ฒŒ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 1.2 ๋งŒ์•ฝ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋ฉด? ์‚ฌ์šฉ์ž๋Š” ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ๊ฐ„์„ ์˜ค๋ž˜ ๋™์•ˆ ๊ธฐ๋‹ค๋ ค์•ผ ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋ฐ”..

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