๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

(18)
Express ์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ Next.js API Routes๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ธฐ ๋“ค์–ด๊ฐ€๋ฉฐ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ ์€ "์™œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์„๊นŒ?"๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋Š” WMS(Warehouse Management System) ํ”„๋กœ์ ํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. Next.js ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ณ„๋„์˜ Express ์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ดˆ๊ธฐ์—๋Š” API ํ”„๋ก์‹œ ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์„ ํƒ์ด์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉฐ ์ด ์„ ํƒ์€ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋กœ ์Œ“์—ฌ๊ฐ”๊ณ , ๊ฒฐ๊ตญ 1,056์ค„์˜ ๊ฑฐ๋Œ€ํ•œ ๋‹จ์ผ ํŒŒ์ผ์ด ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์˜ ๋ฐœ๋ชฉ์„ ์žก์•˜์Šต๋‹ˆ๋‹ค.๋ฌธ์ œ ์ƒํ™ฉ1,056์ค„์งœ๋ฆฌ Express ์„œ๋ฒ„์˜ ํ•œ๊ณ„WMS ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ๋Š” Next.js ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, API ํ”„๋ก์‹œ๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ Express ์ปค์Šคํ…€ ์„œ๋ฒ„(server/index.js)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ..
Next.js ๋นŒ๋“œ ์ตœ์ ํ™” : Babel → SWC ์ „ํ™˜ ๋ฌธ์ œ ์ƒํ™ฉํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ๊ฐ„์ด 1๋ถ„ 30์ดˆ๋ฅผ ์ดˆ๊ณผCI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๋ณ‘๋ชฉ ๋ฐœ์ƒ์›์ธ ๋ถ„์„๋นŒ๋“œ ๋กœ๊ทธ ํ™•์ธ ๊ฒฐ๊ณผinfo - Disabled SWC as replacement for Babel because of custom Babel configuration ".babelrc"์ฃผ์š” ๋ฌธ์ œ์ :.babelrc ํŒŒ์ผ๋กœ ์ธํ•œ SWC ๋น„ํ™œ์„ฑํ™”738MB ํฌ๊ธฐ์˜ node_modules1MB ์ด์ƒ์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฒˆ๋“ค200๊ฐœ ์ด์ƒ ํŽ˜์ด์ง€์˜ SSR ์„ค์ •ํ•ด๊ฒฐ ๊ณผ์ •1. SWC ์ปดํŒŒ์ผ๋Ÿฌ ํ™œ์„ฑํ™”rm -f .babelrc// next.config.jsconst nextConfig = { // SWC ๊ฐ•์ œ ํ™œ์„ฑํ™” swcMinify: true, // ๋นŒ๋“œ ์ตœ์ ํ™” experimental: { forceSwcTransforms: t..
Monorepo ๋„์ž…๊ธฐ: ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ค๊ณ„ ์ •๋ฆฌ 1. ๊ฐœ์š”๋ณธ ๋ฌธ์„œ์—์„œ๋Š” Legacy Web๊ณผ Mobile์„ ๋ชจ๋…ธ๋ ˆํฌ ํ”„๋กœ์ ํŠธ๋กœ ํ†ตํ•ฉํ•˜๋Š” ์„ค๊ณ„์™€ ์ „ํ™˜ ์ „๋žต์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.2. ํ˜„์žฌ ์ƒํ™ฉ & ๋ฌธ์ œ์ ๊ธฐ์ˆ  ์ŠคํƒNext.js 12.3.6 + JavaScript(ES6)MobX 6.5.0, Material-UI v4React Query v3, Axios, npm์ฃผ์š” ๋ฌธ์ œ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ณต์žกExpress ๊ธฐ๋ฐ˜ ์ปค์Šคํ…€ ์„œ๋ฒ„(500+์ค„), API ํ”„๋ก์‹œ ์ค‘๋ณตํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ๋‚œ์ด๋„ ๋†’์Œํด๋” ๊ตฌ์กฐ ๋น„ํ‘œ์ค€ํ™”v1/v2 ํ˜ผ์žฌ, Atomic Design ์ผ๋ถ€ ์ ์šฉ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ ๋‚ฎ์Œ์ฝ”๋“œ ๋ฐ ์˜์กด์„ฑ ์ค‘๋ณต๋™์ผ ๋กœ์ง·UI๋ฅผ ๋‘ ํ”„๋กœ์ ํŠธ์— ์ค‘๋ณต ๊ตฌํ˜„์˜์กด์„ฑ 100% ์ค‘๋ณต ์„ค์น˜๊ธฐ์ˆ  ๋ถ€์ฑ„Next.js 12, React 17, MUI v4 ๋“ฑ ๊ตฌ๋ฒ„์ „JavaScript → TypeScript ํ•„์š”๋”..
Next.js ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ ๋‹ค๊ตญ์–ด ๋ฌธ๊ตฌ๊ฐ€ ๋น„์–ด ๋ณด์ด๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๊ตญ์–ด๋ฅผ localStorage ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ดˆ๊ธฐ ํ™”๋ฉด ๋กœ๋”ฉ ์‹œ ๋ฒ„ํŠผ ํ…์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์Œ์ƒˆ๋กœ๊ณ ์นจ ํ›„์—๋Š” ์ •์ƒ์ ์œผ๋กœ ๋‹ค๊ตญ์–ด ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋จ์œ„ ๋ฌธ์ œ์˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ํ™˜๊ฒฝ์—์„œ ๋‹ค๊ตญ์–ด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ์ˆ˜์ •ํ•˜๊ณ , ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ž‘์—…์„ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.๋ฌธ์ œ ์›์ธconst DUMMY_DATA = [ { id: 0, name: getLang("WD000266"), ... }, ...];getLang(code)๋Š” localStorage์—์„œ ๋‹ค๊ตญ์–ด ๋ฌธ์ž์—ด์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.export const getLang = (code) => { if (typeof window !== "undefined") { const langL..
useState์˜ ๋น„๋™๊ธฐ์„ฑ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” useState๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ์™€ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ ํŒจํ„ด์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋น„๋™๊ธฐ์ ์ด๋ผ๋Š” ๊ฒƒ์€ setState๋ฅผ ํ˜ธ์ถœํ•œ ์งํ›„์— ์ƒํƒœ๊ฐ€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.const [count, setCount] = useState(0);const handleClick = () => { setCount(count + 1); console.log(count); // ์—ฌ์ „ํžˆ setCount ์ด์ „ ๊ฐ’์ธ 0์ด ์ถœ๋ ฅ๋จ}; ์œ„ ์ฝ”๋“œ์—์„œ handleClick์„ ํ˜ธ์ถœํ•˜๋ฉด setCount(count + 1)์ด ์‹คํ–‰๋˜์ง€๋งŒ, console.log(count)๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ๊ฐ’์ธ 0์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. useState๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์›๋ฆฌ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ์„ฑ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ..
React key prop๊ณผ ์ƒํƒœ ์ดˆ๊ธฐํ™” React์—์„œ key prop์€ ๋ฆฌ์ŠคํŠธ๋‚˜ iterable ๊ฐ์ฒด ๋ Œ๋”๋ง ์‹œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ์ƒํƒœ(state) ๊ด€๋ฆฌ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.key์˜ ์—ญํ• React์—์„œ key๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ key๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ ์ง€๋˜๋ฉฐ, ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.key๊ฐ€ state์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅkey๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.์ฆ‰, key ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.์ด๋Š” ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.import { useStat..
Timer Interval ์ง€์—ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ์ค‘, ๊ธฐ์กด ๊ตฌํ˜„๋œ ํƒ€์ด๋จธ์—์„œ ์ธํ„ฐ๋ฒŒ ์‹œ์ ์ด ์ง€์—ฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.AS-IS. ์‹œ๊ฐ„์„ ์ง์ ‘ ๊ณ„์‚ฐ, setInterval๋กœ 1์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ 'use client';import { useEffect, useState } from 'react';import { atomWithStorage } from 'jotai/utils';import { useAtom } from 'jotai';const startTimeAtom = atomWithStorage('inboundProcessStartTime', Date.now());export default function Timer() {..
CDN (Content Delivery Network) CDN์ด๋ž€?CDN(์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ)์€ ์ง€๋ฆฌ์ ์œผ๋กœ ๋ถ„์‚ฐ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„→ ์›น ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ์ „์†กํ•จ์œผ๋กœ์จ ์ „์†ก ์†๋„๋ฅผ ๋†’์ž„์›น ํŽ˜์ด์ง€, ์ด๋ฏธ์ง€, ๋™์˜์ƒ ๋“ฑ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์˜ ์‹ค์ œ ์œ„์น˜์™€ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„์— ์บ์‹ฑ์‚ฌ์šฉ์ž์™€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์„œ๋ฒ„์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ์ „์†ก → ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„ ๋‹จ์ถ•, ๋” ๋น ๋ฅธ ๊ณ ์„ฑ๋Šฅ ์›น ํ™˜๊ฒฝ ๊ฒฝํ—˜ CDN์˜ ๋™์ž‘ ์›๋ฆฌCDN์€ ์„ธ ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์„œ๋ฒ„์— ์˜์กด์˜ค๋ฆฌ์ง„ ์„œ๋ฒ„์ฝ˜ํ…์ธ ์˜ ์›๋ณธ ๋ฒ„์ „์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ ์›๋ณธ ์†Œ์Šค ์—ญํ• ์„ ํ•จ์ฝ˜ํ…์ธ ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ์˜ค๋ฆฌ์ง„ ์„œ๋ฒ„์—์„œ ๋ณ€๊ฒฝ์˜ค๋ฆฌ์ง„ ์„œ๋ฒ„๋Š” ์ฝ˜ํ…์ธ  ๊ณต๊ธ‰์—…์ฒด๊ฐ€ ์†Œ์œ ํ•˜๊ณ  ๊ด€๋ฆฌ or ์จ๋“œํŒŒํ‹ฐ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์—…์ฒด์˜ ์ธํ”„๋ผ(Amazon์˜ AWS S3 ๋˜๋Š” Google Cloud Storage)์—์„œ ํ˜ธ์ŠคํŒ…์—ฃ์ง€ ์„œ๋ฒ„์ „ ์„ธ๊ณ„ ์—ฌ๋Ÿฌ ์ง€๋ฆฌ์  ์œ„์น˜์— ์œ„์น˜..