From b0dbd211fbb75f14df6ff7c858156fc06ecf579c Mon Sep 17 00:00:00 2001 From: prayinforrain Date: Mon, 23 Sep 2024 15:43:22 +0000 Subject: [PATCH] deploy: facd90b205185dab93eeb8dfbe3014c726744f04 --- 404.html | 10 +- about/index.html | 10 +- ...webp => avatar_hu16273194194817824927.webp | Bin categories/algorithm/index.html | 10 +- categories/algorithm/index.xml | 8 +- categories/css/index.html | 10 +- categories/css/index.xml | 24 +- categories/ide/index.html | 10 +- categories/ide/index.xml | 11 +- categories/index.html | 10 +- categories/index.xml | 2 +- categories/javascript/index.html | 10 +- categories/javascript/index.xml | 15 +- categories/life/index.html | 10 +- categories/life/index.xml | 12 +- categories/moheyum/index.html | 10 +- categories/moheyum/index.xml | 76 ++++-- categories/node.js/index.html | 10 +- categories/node.js/index.xml | 15 +- categories/react/index.html | 10 +- categories/react/index.xml | 19 +- categories/typescript/index.html | 10 +- categories/typescript/index.xml | 39 +++- categories/web/index.html | 10 +- categories/web/index.xml | 79 ++++++- images/posts/2024/07/site-optimization/01.PNG | Bin 0 -> 40353 bytes images/posts/2024/07/site-optimization/02.png | Bin 0 -> 234364 bytes index.html | 10 +- index.xml | 221 ++++++++++++++---- posts/2022/11/emotion/index.html | 16 +- .../making-editor-contenteditable/index.html | 18 +- .../11/making-editor-getselection/index.html | 20 +- posts/2022/11/npm-vs-yarn-vs-pnpm/index.html | 12 +- posts/2022/11/redux-vs-recoil/index.html | 16 +- posts/2022/12/finishing-moheyum/index.html | 12 +- .../2022/12/making-editor-markdown/index.html | 16 +- .../12/prevent-sidebar-blinking/index.html | 14 +- .../browser-rendering-performance/index.html | 14 +- posts/2023/01/css-display/index.html | 10 +- posts/2023/01/ecmascript/index.html | 12 +- posts/2023/01/migrating-to-hugo/index.html | 14 +- posts/2023/01/size-units-in-css/index.html | 12 +- posts/2023/01/tree-shaking/index.html | 14 +- .../02/firebase-with-typescript/index.html | 12 +- posts/2023/02/typescript-generic/index.html | 20 +- posts/2023/03/nodejs-for-baekjoon/index.html | 12 +- .../03/npm-scripts-doesnt-work/index.html | 20 +- .../04/nextjs-storybook-with-pnp/index.html | 34 +-- posts/2023/04/numble-talk/index.html | 12 +- posts/2023/05/exploring-yarn-berry/index.html | 22 +- posts/2023/06/cds-retrospect/index.html | 12 +- posts/2023/11/cell-refactoring/index.html | 14 +- posts/2024/07/site-optimization/index.html | 32 +++ posts/index.html | 10 +- posts/index.xml | 197 ++++++++++++---- sitemap.xml | 2 +- tags/algorithm/index.html | 10 +- tags/algorithm/index.xml | 8 +- tags/baekjoon/index.html | 10 +- tags/baekjoon/index.xml | 8 +- tags/blog/index.html | 10 +- tags/blog/index.xml | 8 +- tags/browser/index.html | 10 +- tags/browser/index.xml | 19 +- tags/cds/index.html | 10 +- tags/cds/index.xml | 2 +- tags/css-in-js/index.html | 10 +- tags/css-in-js/index.xml | 12 +- tags/css/index.html | 10 +- tags/css/index.xml | 24 +- tags/ecmascript/index.html | 10 +- tags/ecmascript/index.xml | 11 +- tags/emotion/index.html | 10 +- tags/emotion/index.xml | 12 +- tags/firebase/index.html | 10 +- tags/firebase/index.xml | 14 +- tags/generic/index.html | 10 +- tags/generic/index.xml | 27 ++- tags/hugo/index.html | 10 +- tags/hugo/index.xml | 8 +- tags/index.html | 10 +- tags/index.xml | 2 +- tags/javascript/index.html | 10 +- tags/javascript/index.xml | 21 +- tags/macos/index.html | 10 +- tags/macos/index.xml | 11 +- tags/moheyum/index.html | 10 +- tags/moheyum/index.xml | 76 ++++-- tags/nextjs/index.html | 10 +- tags/nextjs/index.xml | 5 +- tags/nodejs/index.html | 10 +- tags/nodejs/index.xml | 8 +- tags/npm/index.html | 10 +- tags/npm/index.xml | 20 +- tags/numble/index.html | 10 +- tags/numble/index.xml | 6 +- tags/nvm/index.html | 10 +- tags/nvm/index.xml | 11 +- tags/pnp/index.html | 10 +- tags/pnp/index.xml | 5 +- tags/pnpm/index.html | 10 +- tags/pnpm/index.xml | 11 +- tags/project/index.html | 10 +- tags/project/index.xml | 6 +- tags/ps/index.html | 10 +- tags/ps/index.xml | 8 +- tags/react/index.html | 10 +- tags/react/index.xml | 2 +- tags/recoil/index.html | 10 +- tags/recoil/index.xml | 9 +- tags/redux/index.html | 10 +- tags/redux/index.xml | 9 +- tags/storybook/index.html | 10 +- tags/storybook/index.xml | 5 +- tags/tree-shaking/index.html | 10 +- tags/tree-shaking/index.xml | 6 +- tags/typescript/index.html | 10 +- tags/typescript/index.xml | 39 +++- tags/vscode/index.html | 10 +- tags/vscode/index.xml | 11 +- tags/web/index.html | 10 +- tags/web/index.xml | 91 ++++++-- tags/yarn/index.html | 10 +- tags/yarn/index.xml | 18 +- 124 files changed, 1447 insertions(+), 686 deletions(-) rename avatar_hu8a16f9f51dd7b9a0a5f04c391447c48e_10088_100x100_fill_q75_h2_box_smart1_3.webp => avatar_hu16273194194817824927.webp (100%) create mode 100644 images/posts/2024/07/site-optimization/01.PNG create mode 100644 images/posts/2024/07/site-optimization/02.png create mode 100644 posts/2024/07/site-optimization/index.html diff --git a/404.html b/404.html index ee81c2d..0bfcfc4 100644 --- a/404.html +++ b/404.html @@ -1,10 +1,10 @@ 404 Page not found | PrayinForRain.dev -

/* 404 page not found. */

+Hugo. \ No newline at end of file diff --git a/about/index.html b/about/index.html index 09282d9..de9ecd5 100644 --- a/about/index.html +++ b/about/index.html @@ -1,10 +1,10 @@ ์ด์šฐ์žฌ | Front-end Developer | PrayinForRain.dev -

์ด์šฐ์žฌ | Front-end Developer

Table of Contents
  • Next.js์™€ Typescript๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.
  • ๋ง์„ ํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.
  • ์ €์˜ ์ด๋ ฅ์„œ๋Š” [๋ž ๋ฆฟ]์—์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

Techstacks

Git Figma Storybook
HTML5 CSS3 NodeJS TypeScript NPM Yarn
React Next JS
Express.js NestJS

Projects

  • ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ, CDS [Repo | npm]
  • ๋งˆํฌ๋‹ค์šด์„ ์ง€์›ํ•˜๋Š” SNS, ๋ชจํ—ค์œฐ [Repo | Notion | Link(expired) ]

Education

  • ๋„ค์ด๋ฒ„ ์ปค๋„ฅํŠธ์žฌ๋‹จ ๋ถ€์ŠคํŠธ์บ ํ”„ ์›นยท๋ชจ๋ฐ”์ผ 7๊ธฐ (2022.07 ~ 2022.12)
  • ์„œ์šธ๊ณผํ•™๊ธฐ์ˆ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ Seoultech Computer Science and Engineering (2015.03 ~ 2022.02)

Contacts

PrayinForRain’s github stats

+Hugo. \ No newline at end of file diff --git a/avatar_hu8a16f9f51dd7b9a0a5f04c391447c48e_10088_100x100_fill_q75_h2_box_smart1_3.webp b/avatar_hu16273194194817824927.webp similarity index 100% rename from avatar_hu8a16f9f51dd7b9a0a5f04c391447c48e_10088_100x100_fill_q75_h2_box_smart1_3.webp rename to avatar_hu16273194194817824927.webp diff --git a/categories/algorithm/index.html b/categories/algorithm/index.html index 13ddbca..15e5bc0 100644 --- a/categories/algorithm/index.html +++ b/categories/algorithm/index.html @@ -1,10 +1,10 @@ Algorithm | PrayinForRain.dev -

Algorithm

2023

+Hugo. \ No newline at end of file diff --git a/categories/algorithm/index.xml b/categories/algorithm/index.xml index 27b3971..9080ace 100644 --- a/categories/algorithm/index.xml +++ b/categories/algorithm/index.xml @@ -1,3 +1,5 @@ -Algorithm on PrayinForRain.devhttps://prayinforrain.github.io/categories/algorithm/Recent content in Algorithm on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. \ No newline at end of file +Algorithm on PrayinForRain.devhttps://prayinforrain.github.io/categories/algorithm/Recent content in Algorithm on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/categories/css/index.html b/categories/css/index.html index 0fedf5c..d33074f 100644 --- a/categories/css/index.html +++ b/categories/css/index.html @@ -1,10 +1,10 @@ CSS | PrayinForRain.dev -

CSS

2023

+Hugo. \ No newline at end of file diff --git a/categories/css/index.xml b/categories/css/index.xml index dae71cc..b34cfc4 100644 --- a/categories/css/index.xml +++ b/categories/css/index.xml @@ -1,3 +1,21 @@ -CSS on PrayinForRain.devhttps://prayinforrain.github.io/categories/css/Recent content in CSS on PrayinForRain.devHugo -- gohugo.iokoMon, 16 Jan 2023 16:38:15 +0900CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . \ No newline at end of file +CSS on PrayinForRain.devhttps://prayinforrain.github.io/categories/css/Recent content in CSS on PrayinForRain.devHugokoMon, 16 Jan 2023 16:38:15 +0900CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/categories/ide/index.html b/categories/ide/index.html index e0bcce7..ad732b6 100644 --- a/categories/ide/index.html +++ b/categories/ide/index.html @@ -1,10 +1,10 @@ Ide | PrayinForRain.dev -

Ide

2023

+Hugo. \ No newline at end of file diff --git a/categories/ide/index.xml b/categories/ide/index.xml index f019b22..2126da3 100644 --- a/categories/ide/index.xml +++ b/categories/ide/index.xml @@ -1,3 +1,8 @@ -Ide on PrayinForRain.devhttps://prayinforrain.github.io/categories/ide/Recent content in Ide on PrayinForRain.devHugo -- gohugo.iokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. \ No newline at end of file +Ide on PrayinForRain.devhttps://prayinforrain.github.io/categories/ide/Recent content in Ide on PrayinForRain.devHugokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p> \ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 1d85646..c54de21 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1,10 +1,10 @@ Categories | PrayinForRain.dev -

Categories

+Hugo. \ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml index d6bcf39..f3037d7 100644 --- a/categories/index.xml +++ b/categories/index.xml @@ -1 +1 @@ -Categories on PrayinForRain.devhttps://prayinforrain.github.io/categories/Recent content in Categories on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900Webhttps://prayinforrain.github.io/categories/web/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/categories/web/Node.jshttps://prayinforrain.github.io/categories/node.js/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/categories/node.js/Lifehttps://prayinforrain.github.io/categories/life/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/categories/life/Algorithmhttps://prayinforrain.github.io/categories/algorithm/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/categories/algorithm/Idehttps://prayinforrain.github.io/categories/ide/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/categories/ide/TypeScripthttps://prayinforrain.github.io/categories/typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/categories/typescript/Javascripthttps://prayinforrain.github.io/categories/javascript/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/categories/javascript/CSShttps://prayinforrain.github.io/categories/css/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/categories/css/Moheyumhttps://prayinforrain.github.io/categories/moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/categories/moheyum/Reacthttps://prayinforrain.github.io/categories/react/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/categories/react/ \ No newline at end of file +Categories on PrayinForRain.devhttps://prayinforrain.github.io/categories/Recent content in Categories on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Webhttps://prayinforrain.github.io/categories/web/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/categories/web/Node.jshttps://prayinforrain.github.io/categories/node.js/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/categories/node.js/Lifehttps://prayinforrain.github.io/categories/life/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/categories/life/Algorithmhttps://prayinforrain.github.io/categories/algorithm/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/categories/algorithm/Idehttps://prayinforrain.github.io/categories/ide/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/categories/ide/TypeScripthttps://prayinforrain.github.io/categories/typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/categories/typescript/Javascripthttps://prayinforrain.github.io/categories/javascript/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/categories/javascript/CSShttps://prayinforrain.github.io/categories/css/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/categories/css/Moheyumhttps://prayinforrain.github.io/categories/moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/categories/moheyum/Reacthttps://prayinforrain.github.io/categories/react/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/categories/react/ \ No newline at end of file diff --git a/categories/javascript/index.html b/categories/javascript/index.html index 4432873..ee9ab92 100644 --- a/categories/javascript/index.html +++ b/categories/javascript/index.html @@ -1,10 +1,10 @@ Javascript | PrayinForRain.dev -

Javascript

2023

+Hugo. \ No newline at end of file diff --git a/categories/javascript/index.xml b/categories/javascript/index.xml index ede5706..6538391 100644 --- a/categories/javascript/index.xml +++ b/categories/javascript/index.xml @@ -1,4 +1,11 @@ -Javascript on PrayinForRain.devhttps://prayinforrain.github.io/categories/javascript/Recent content in Javascript on PrayinForRain.devHugo -- gohugo.iokoWed, 25 Jan 2023 17:17:15 +0900Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Javascript on PrayinForRain.devhttps://prayinforrain.github.io/categories/javascript/Recent content in Javascript on PrayinForRain.devHugokoWed, 25 Jan 2023 17:17:15 +0900Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/categories/life/index.html b/categories/life/index.html index 97f1c30..865b3e8 100644 --- a/categories/life/index.html +++ b/categories/life/index.html @@ -1,10 +1,10 @@ Life | PrayinForRain.dev -

Life

2023

+Hugo. \ No newline at end of file diff --git a/categories/life/index.xml b/categories/life/index.xml index b5093c5..f788a42 100644 --- a/categories/life/index.xml +++ b/categories/life/index.xml @@ -1,3 +1,9 @@ -Life on PrayinForRain.devhttps://prayinforrain.github.io/categories/life/Recent content in Life on PrayinForRain.devHugo -- gohugo.iokoSun, 23 Apr 2023 04:05:58 +0900๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค. -๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค.Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. -๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Life on PrayinForRain.devhttps://prayinforrain.github.io/categories/life/Recent content in Life on PrayinForRain.devHugokoSun, 23 Apr 2023 04:05:58 +0900๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/<h2 id="์‹œ์ž‘ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/04/numble-talk/01.png" alt="ui design"></p> +<p>3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.</p> +<p>๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..</p>Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/<p>์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</p> +<h2 id="๋ธ”๋กœ๊ทธ๋ฅผ-์ด์ „ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><figure><img src="https://prayinforrain.github.io/images/posts/2023/01/migrating-to-hugo/01.png" + alt="image"><figcaption> + <p>์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..</p> \ No newline at end of file diff --git a/categories/moheyum/index.html b/categories/moheyum/index.html index 044104b..eda88ca 100644 --- a/categories/moheyum/index.html +++ b/categories/moheyum/index.html @@ -1,10 +1,10 @@ Moheyum | PrayinForRain.dev -

Moheyum

2022

+Hugo. \ No newline at end of file diff --git a/categories/moheyum/index.xml b/categories/moheyum/index.xml index 5049ffd..9fec6b5 100644 --- a/categories/moheyum/index.xml +++ b/categories/moheyum/index.xml @@ -1,21 +1,55 @@ -Moheyum on PrayinForRain.devhttps://prayinforrain.github.io/categories/moheyum/Recent content in Moheyum on PrayinForRain.devHugo -- gohugo.iokoWed, 21 Dec 2022 03:30:25 +0900๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. [์›๋ณธ ๋งํฌ] -๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค.. -๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” ๋ชจํ—ค์œฐ์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. [์—ฌ๊ธฐ]์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/๋ชจํ—ค์œฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ Next.js๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” NestJS๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, SSR์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”. -๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ memoization์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ Next.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. GFM(GitHub Flavored Markdown)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ? -๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค. -๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค.Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Moheyum on PrayinForRain.devhttps://prayinforrain.github.io/categories/moheyum/Recent content in Moheyum on PrayinForRain.devHugokoWed, 21 Dec 2022 03:30:25 +0900๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/<blockquote> +<p>ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. <a href="https://prayinforrain.tistory.com/80">[์›๋ณธ ๋งํฌ]</a></p> +</blockquote> +<figure><img src="https://prayinforrain.github.io/images/posts/2022/12/finishing-moheyum/moheyum_01.png" + alt="image"><figcaption> + <p>๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค..</p> + </figcaption> +</figure> + +<p>๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” <strong>๋ชจํ—ค์œฐ</strong>์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. <a href="https://youtu.be/9mVinynuUTw">[์—ฌ๊ธฐ]</a>์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.</p>์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ <code>Next.js</code>๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” <code>NestJS</code>๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, <code>SSR</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”.</p> +<p>๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ <code>memoization</code>์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ <a href="https://www.notion.so/next-js-13-app-dir-11191a66a5564a25ba882c8a835afd13">Next.js 13์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ–ˆ๋˜</a> ์•„ํ”ˆ ์ƒ์ฒ˜๋ฅผ ์ž๊ทนํ•˜๊ณ  ์žˆ์–ด์„œ ๋ชจํ—ค์œฐ์—๋„ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-์–ด๋–ป๊ฒŒ-ํ• ๊นŒ์š”">๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?</h2> +<p>์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. <a href="https://github.github.com/gfm/">GFM(GitHub Flavored Markdown)</a>์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•„๋ฌด ์ด์Šˆ๋‚˜ ๋“ค์–ด๊ฐ€์„œ ๋Œ“๊ธ€ ์ฐฝ์— ์‹คํ—˜์„ ํ•˜๋ฉด์„œ์š”.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ?</p> +<blockquote> +<p>๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” <code>๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›</code>์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.</p> +<p>๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.</p>Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p>Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/categories/node.js/index.html b/categories/node.js/index.html index 7180f53..435b77a 100644 --- a/categories/node.js/index.html +++ b/categories/node.js/index.html @@ -1,10 +1,10 @@ Node.js | PrayinForRain.dev -

Node.js

2023

2022

+Hugo. \ No newline at end of file diff --git a/categories/node.js/index.xml b/categories/node.js/index.xml index 27998ef..54af9f9 100644 --- a/categories/node.js/index.xml +++ b/categories/node.js/index.xml @@ -1,3 +1,12 @@ -Node.js on PrayinForRain.devhttps://prayinforrain.github.io/categories/node.js/Recent content in Node.js on PrayinForRain.devHugo -- gohugo.iokoTue, 30 May 2023 02:27:49 +0900์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„ ์ตœ๊ทผ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ Yarn berry๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  node_modules ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค. -ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. \ No newline at end of file +Node.js on PrayinForRain.devhttps://prayinforrain.github.io/categories/node.js/Recent content in Node.js on PrayinForRain.devHugokoTue, 30 May 2023 02:27:49 +0900์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/<h2 id="๋‚ด-๋ ˆํฌ์˜-์œ„ํ—˜ํ•œ-๋…€์„">๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/05/exploring-yarn-berry/01.png" alt="cds issue"></p> +<p>์ตœ๊ทผ <a href="https://github.com/c-h-w-h/cds">์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)</a>์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ <strong>Yarn berry</strong>๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  <code>node_modules</code> ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— <code>node_modules</code>์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค.</p> +<p>ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p> \ No newline at end of file diff --git a/categories/react/index.html b/categories/react/index.html index a8fd9b7..6fe5897 100644 --- a/categories/react/index.html +++ b/categories/react/index.html @@ -1,10 +1,10 @@ React | PrayinForRain.dev -

React

2022

+Hugo. \ No newline at end of file diff --git a/categories/react/index.xml b/categories/react/index.xml index 39f11ae..af75862 100644 --- a/categories/react/index.xml +++ b/categories/react/index.xml @@ -1,2 +1,17 @@ -React on PrayinForRain.devhttps://prayinforrain.github.io/categories/react/Recent content in React on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +React on PrayinForRain.devhttps://prayinforrain.github.io/categories/react/Recent content in React on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p>Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/categories/typescript/index.html b/categories/typescript/index.html index f26aa78..d38aa06 100644 --- a/categories/typescript/index.html +++ b/categories/typescript/index.html @@ -1,10 +1,10 @@ TypeScript | PrayinForRain.dev -

TypeScript

2023

+Hugo. \ No newline at end of file diff --git a/categories/typescript/index.xml b/categories/typescript/index.xml index 2634680..40ea948 100644 --- a/categories/typescript/index.xml +++ b/categories/typescript/index.xml @@ -1,7 +1,32 @@ -TypeScript on PrayinForRain.devhttps://prayinforrain.github.io/categories/typescript/Recent content in TypeScript on PrayinForRain.devHugo -- gohugo.iokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this. \ No newline at end of file +TypeScript on PrayinForRain.devhttps://prayinforrain.github.io/categories/typescript/Recent content in TypeScript on PrayinForRain.devHugokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p>Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p> \ No newline at end of file diff --git a/categories/web/index.html b/categories/web/index.html index 91f31eb..ca1e8a7 100644 --- a/categories/web/index.html +++ b/categories/web/index.html @@ -1,10 +1,10 @@ Web | PrayinForRain.dev -

Web

2024

2023

+Hugo. \ No newline at end of file diff --git a/categories/web/index.xml b/categories/web/index.xml index 8f3ab48..6120b62 100644 --- a/categories/web/index.xml +++ b/categories/web/index.xml @@ -1,10 +1,69 @@ -Web on PrayinForRain.devhttps://prayinforrain.github.io/categories/web/Recent content in Web on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹คTypescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this.Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. -์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout) ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint) ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . \ No newline at end of file +Web on PrayinForRain.devhttps://prayinforrain.github.io/categories/web/Recent content in Web on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐhttps://prayinforrain.github.io/posts/2024/07/site-optimization/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/posts/2024/07/site-optimization/์ตœ๋Œ€ํ•œ ๊ฐ€๋ฒผ์šด ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹คTypescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p>Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p>CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/<h2 id="๋ธŒ๋ผ์šฐ์ €-๋ Œ๋”๋ง">๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง</h2> +<p>์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/browser-rendering-performance/01.png" alt="Untitled"></p> +<ul> +<li>์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</li> +<li>Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)</li> +<li>๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)</li> +<li>์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด <code>Reflow</code>๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +<ul> +<li>Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ <strong>๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +<li>๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)</li> +<li>๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ <strong>Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<iframe width="560" height="315" src="https://www.youtube.com/embed/TZz9VHjJzMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> +<p>์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ <code>will-change</code>๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/images/posts/2024/07/site-optimization/01.PNG b/images/posts/2024/07/site-optimization/01.PNG new file mode 100644 index 0000000000000000000000000000000000000000..98f54eb8c592a5baa87044b28e9d90f258614c4f GIT binary patch literal 40353 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

N*T( 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�O?BupEWwoS2ySm?vEf^>W)&0=4eSZNM+p3q0%N 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 DH`eRU literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 29042d5..b83d474 100644 --- a/index.html +++ b/index.html @@ -1,10 +1,10 @@ PrayinForRain.dev | PrayinForRain.dev -

+Hugo. \ No newline at end of file diff --git a/index.xml b/index.xml index f06c9ff..a42b35d 100644 --- a/index.xml +++ b/index.xml @@ -1,41 +1,180 @@ -PrayinForRain.devhttps://prayinforrain.github.io/Recent content on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„ ์ตœ๊ทผ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ Yarn berry๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  node_modules ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค. -ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค.๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค. -๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค.๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค.VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this.Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. -๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. -์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout) ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint) ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ .์ด์šฐ์žฌ | Front-end Developerhttps://prayinforrain.github.io/about/Mon, 02 Jan 2023 21:38:52 +0900https://prayinforrain.github.io/about/ Next.js์™€ Typescript๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ๋ง์„ ํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ €์˜ ์ด๋ ฅ์„œ๋Š” [๋ž ๋ฆฟ]์—์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”. Techstacks Projects ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ, CDS [Repo | npm] ๋งˆํฌ๋‹ค์šด์„ ์ง€์›ํ•˜๋Š” SNS, ๋ชจํ—ค์œฐ [Repo | Notion | Link(expired) ] Education ๋„ค์ด๋ฒ„ ์ปค๋„ฅํŠธ์žฌ๋‹จ ๋ถ€์ŠคํŠธ์บ ํ”„ ์›นยท๋ชจ๋ฐ”์ผ 7๊ธฐ (2022.07 ~ 2022.12) ์„œ์šธ๊ณผํ•™๊ธฐ์ˆ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ Seoultech Computer Science and Engineering (2015.03 ~ 2022.02) Contacts Email : prayinforrain@naver.com๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. [์›๋ณธ ๋งํฌ] -๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค.. -๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” ๋ชจํ—ค์œฐ์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. [์—ฌ๊ธฐ]์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/๋ชจํ—ค์œฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ Next.js๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” NestJS๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, SSR์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”. -๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ memoization์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ Next.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. GFM(GitHub Flavored Markdown)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ? -๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค. -๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค.Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +PrayinForRain.devhttps://prayinforrain.github.io/Recent content on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐhttps://prayinforrain.github.io/posts/2024/07/site-optimization/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/posts/2024/07/site-optimization/์ตœ๋Œ€ํ•œ ๊ฐ€๋ฒผ์šด ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/<h2 id="๋‚ด-๋ ˆํฌ์˜-์œ„ํ—˜ํ•œ-๋…€์„">๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/05/exploring-yarn-berry/01.png" alt="cds issue"></p> +<p>์ตœ๊ทผ <a href="https://github.com/c-h-w-h/cds">์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)</a>์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ <strong>Yarn berry</strong>๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  <code>node_modules</code> ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— <code>node_modules</code>์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค.</p> +<p>ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/<h2 id="์‹œ์ž‘ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/04/numble-talk/01.png" alt="ui design"></p> +<p>3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.</p> +<p>๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..</p>๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p>VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p>Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p>Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p>Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/<p>์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</p> +<h2 id="๋ธ”๋กœ๊ทธ๋ฅผ-์ด์ „ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><figure><img src="https://prayinforrain.github.io/images/posts/2023/01/migrating-to-hugo/01.png" + alt="image"><figcaption> + <p>์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..</p>Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p>CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/<h2 id="๋ธŒ๋ผ์šฐ์ €-๋ Œ๋”๋ง">๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง</h2> +<p>์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/browser-rendering-performance/01.png" alt="Untitled"></p> +<ul> +<li>์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</li> +<li>Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)</li> +<li>๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)</li> +<li>์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด <code>Reflow</code>๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +<ul> +<li>Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ <strong>๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +<li>๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)</li> +<li>๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ <strong>Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<iframe width="560" height="315" src="https://www.youtube.com/embed/TZz9VHjJzMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> +<p>์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ <code>will-change</code>๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p>์ด์šฐ์žฌ | Front-end Developerhttps://prayinforrain.github.io/about/Mon, 02 Jan 2023 21:38:52 +0900https://prayinforrain.github.io/about/<ul> +<li><code>Next.js</code>์™€ <code>Typescript</code>๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.</li> +<li><strong>๋ง์„ ํ•  ์ค„ ์•„๋Š” ๊ฐœ๋ฐœ์ž</strong>๊ฐ€ ๋˜์–ด ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.</li> +<li>์ €์˜ ์ด๋ ฅ์„œ๋Š” <a href="https://www.rallit.com/resumes/229210@prayinforrain/%EC%9D%B4%EC%9A%B0%EC%9E%AC">[๋ž ๋ฆฟ]</a>์—์„œ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.</li> +</ul> +<h2 id="techstacks">Techstacks</h2> +<p><img src="https://img.shields.io/badge/git-%23F05033.svg?style=flat&amp;logo=git&amp;logoColor=white" alt="Git"> <img src="https://img.shields.io/badge/figma-%23F24E1E.svg?style=flat&amp;logo=figma&amp;logoColor=white" alt="Figma"> <img src="https://img.shields.io/badge/-Storybook-FF4785?style=flat&amp;logo=storybook&amp;logoColor=white" alt="Storybook"><br> +<img src="https://img.shields.io/badge/html5-%23E34F26.svg?style=flat&amp;logo=html5&amp;logoColor=white" alt="HTML5"> <img src="https://img.shields.io/badge/css3-%231572B6.svg?style=flat&amp;logo=css3&amp;logoColor=white" alt="CSS3"> <img src="https://img.shields.io/badge/node.js-6DA55F?style=flat&amp;logo=node.js&amp;logoColor=white" alt="NodeJS"> <img src="https://img.shields.io/badge/typescript-%23007ACC.svg?style=flat&amp;logo=typescript&amp;logoColor=white" alt="TypeScript"> <img src="https://img.shields.io/badge/NPM-%23000000.svg?style=flat&amp;logo=npm&amp;logoColor=white" alt="NPM"> <img src="https://img.shields.io/badge/yarn-%232C8EBB.svg?style=flat&amp;logo=yarn&amp;logoColor=white" alt="Yarn"><br> +<img src="https://img.shields.io/badge/react-%2320232a.svg?style=flat&amp;logo=react&amp;logoColor=%2361DAFB" alt="React"> <img src="https://img.shields.io/badge/Next-black?style=flat&amp;logo=next.js&amp;logoColor=white" alt="Next JS"><br> +<img src="https://img.shields.io/badge/express.js-%23404d59.svg?style=flat&amp;logo=express&amp;logoColor=%2361DAFB" alt="Express.js"> <img src="https://img.shields.io/badge/nestjs-%23E0234E.svg?style=flat&amp;logo=nestjs&amp;logoColor=white" alt="NestJS"></p> +<h2 id="projects">Projects</h2> +<ul> +<li>์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ, <strong>CDS</strong> [<a href="https://github.com/c-h-w-h/cds">Repo</a> | <a href="https://www.npmjs.com/package/@chwh/cds">npm</a>]</li> +<li>๋งˆํฌ๋‹ค์šด์„ ์ง€์›ํ•˜๋Š” SNS, <strong>๋ชจํ—ค์œฐ</strong> [<a href="https://github.com/boostcampwm-2022/web34-moheyum">Repo</a> | <a href="https://polarlsm.notion.site/Moheyum-4c54f7ce6bc348bd84121578d4079b50">Notion</a> | <del><a href="https://moheyum.ga/">Link</a></del><em>(expired)</em> ]</li> +</ul> +<h2 id="education">Education</h2> +<ul> +<li>๋„ค์ด๋ฒ„ ์ปค๋„ฅํŠธ์žฌ๋‹จ ๋ถ€์ŠคํŠธ์บ ํ”„ ์›นยท๋ชจ๋ฐ”์ผ 7๊ธฐ (2022.07 ~ 2022.12)</li> +<li>์„œ์šธ๊ณผํ•™๊ธฐ์ˆ ๋Œ€ํ•™๊ต ์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ <em>Seoultech Computer Science and Engineering</em> (2015.03 ~ 2022.02)</li> +</ul> +<h2 id="contacts">Contacts</h2> +<ul> +<li>Email : <a href="mailto:prayinforrain@naver.com">prayinforrain@naver.com</a></li> +</ul> +<p><img src="https://github-readme-stats.vercel.app/api?username=prayinforrain&amp;show_icons=true" alt="PrayinForRain&rsquo;s github stats"></p>๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/<blockquote> +<p>ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. <a href="https://prayinforrain.tistory.com/80">[์›๋ณธ ๋งํฌ]</a></p> +</blockquote> +<figure><img src="https://prayinforrain.github.io/images/posts/2022/12/finishing-moheyum/moheyum_01.png" + alt="image"><figcaption> + <p>๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค..</p> + </figcaption> +</figure> + +<p>๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” <strong>๋ชจํ—ค์œฐ</strong>์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. <a href="https://youtu.be/9mVinynuUTw">[์—ฌ๊ธฐ]</a>์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.</p>์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ <code>Next.js</code>๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” <code>NestJS</code>๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, <code>SSR</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”.</p> +<p>๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ <code>memoization</code>์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ <a href="https://www.notion.so/next-js-13-app-dir-11191a66a5564a25ba882c8a835afd13">Next.js 13์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ–ˆ๋˜</a> ์•„ํ”ˆ ์ƒ์ฒ˜๋ฅผ ์ž๊ทนํ•˜๊ณ  ์žˆ์–ด์„œ ๋ชจํ—ค์œฐ์—๋„ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-์–ด๋–ป๊ฒŒ-ํ• ๊นŒ์š”">๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?</h2> +<p>์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. <a href="https://github.github.com/gfm/">GFM(GitHub Flavored Markdown)</a>์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•„๋ฌด ์ด์Šˆ๋‚˜ ๋“ค์–ด๊ฐ€์„œ ๋Œ“๊ธ€ ์ฐฝ์— ์‹คํ—˜์„ ํ•˜๋ฉด์„œ์š”.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ?</p> +<blockquote> +<p>๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” <code>๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›</code>์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.</p> +<p>๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.</p>Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p>Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/posts/2022/11/emotion/index.html b/posts/2022/11/emotion/index.html index 76d271a..d8b582f 100644 --- a/posts/2022/11/emotion/index.html +++ b/posts/2022/11/emotion/index.html @@ -1,9 +1,9 @@ Emotion | PrayinForRain.dev -

Emotion

Table of Contents

๐ŸคทTL;DR

  • CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.
  • emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.
  • ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.
  • CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.

๐ŸŽจCSS-in-JS

CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Untitled

Untitled

์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ location-bar๋ผ๋Š” ํด๋ž˜์Šค๋ช…์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์žˆ์ฃ . ๋‹จ์ˆœํžˆ ์ด ๋ถ€๋ถ„๋งŒ ๋ด์„œ๋Š” ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ด์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • location-bar ๋ผ๋Š” ํด๋ž˜์Šค๋ช…์€ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ location-bar๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํŽ˜์ด์ง€์—์„œ, ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSS๋Š” ๊ทธ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๋ช…์„ ๋” ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ์ •ํ•  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
  • css ํŒŒ์ผ์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. -๋‹น์žฅ ์ € ํŒŒ์ผ์€ ์–ด๋–ค ์ƒํ’ˆ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ๋งŒ์ด ๋ชจ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ’ˆ ์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์œ„์น˜๋Š” ํฌ๊ฒŒ ์—ฐ๊ด€์ด ์—†์–ด๋ณด์ž„์—๋„ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ๋‹ค๋Š” ์ด์œ ๋กœ ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด 400์ค„ ๊ฐ€๋Ÿ‰ ๋˜๋Š” ํŒŒ์ผ์—์„œ ์ € ๋ถ€๋ถ„์„ ์ฐพ์•„์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…ํ•  ๋‹น์‹œ์—๋Š” ๋‹น์—ฐํ•œ ๋ถˆํŽธํ•จ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ๊ฐ๋‚ดํ•ด ์™”์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ๋ฅผ ์ƒ์ƒํ•ด ๋ณด๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์‹œํฐํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด CSS-in-JS์ž…๋‹ˆ๋‹ค.

๐Ÿ˜†emotion/styled

React์—์„œ ์‚ฌ์šฉํ•˜๋Š” CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” styled-components์™€ emotion ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์‹ค ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณด๋ฉด emotion๋งŒ์ด css props๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์„ ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์‹œ์ ์—์„œ๋Š” ์–‘์ชฝ ๋‹ค ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์—ญ์‹œ emotion์ด ์•ž์„ ๋‹ค๋Š” ๋ถ„์„์ด ์žˆ์ง€๋งŒ styled-components ์—ญ์‹œ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ณ , ์• ์ดˆ์— ๊ทธ๋ ‡๊ฒŒ ํฐ ํญ์œผ๋กœ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์†์— ์žกํžˆ๋Š” ๊ฒƒ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” emotion์ด ๋” ์†์— ์ต๋‹ค๋Š” ์ด์œ ๋กœ emotion์„ ๊ณจ๋ž์Šต๋‹ˆ๋‹ค. styled๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ ์ž˜ ์•ˆ ์ณ ์ง€๋”๋ผ๊ตฌ์š”.

npm i @emotion/styled @emotion/babel-plugin
+๋‹น์žฅ ์ € ํŒŒ์ผ์€ ์–ด๋–ค ์ƒํ’ˆ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ๋งŒ์ด ๋ชจ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ’ˆ ์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์œ„์น˜๋Š” ํฌ๊ฒŒ ์—ฐ๊ด€์ด ์—†์–ด๋ณด์ž„์—๋„ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ๋‹ค๋Š” ์ด์œ ๋กœ ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด 400์ค„ ๊ฐ€๋Ÿ‰ ๋˜๋Š” ํŒŒ์ผ์—์„œ ์ € ๋ถ€๋ถ„์„ ์ฐพ์•„์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…ํ•  ๋‹น์‹œ์—๋Š” ๋‹น์—ฐํ•œ ๋ถˆํŽธํ•จ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ๊ฐ๋‚ดํ•ด ์™”์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ๋ฅผ ์ƒ์ƒํ•ด ๋ณด๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์‹œํฐํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด CSS-in-JS์ž…๋‹ˆ๋‹ค.

๐Ÿ˜†emotion/styled

React์—์„œ ์‚ฌ์šฉํ•˜๋Š” CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” styled-components์™€ emotion ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์‹ค ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณด๋ฉด emotion๋งŒ์ด css props๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์„ ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์‹œ์ ์—์„œ๋Š” ์–‘์ชฝ ๋‹ค ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์—ญ์‹œ emotion์ด ์•ž์„ ๋‹ค๋Š” ๋ถ„์„์ด ์žˆ์ง€๋งŒ styled-components ์—ญ์‹œ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ณ , ์• ์ดˆ์— ๊ทธ๋ ‡๊ฒŒ ํฐ ํญ์œผ๋กœ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์†์— ์žกํžˆ๋Š” ๊ฒƒ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” emotion์ด ๋” ์†์— ์ต๋‹ค๋Š” ์ด์œ ๋กœ emotion์„ ๊ณจ๋ž์Šต๋‹ˆ๋‹ค. styled๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ ์ž˜ ์•ˆ ์ณ ์ง€๋”๋ผ๊ตฌ์š”.

npm i @emotion/styled @emotion/babel-plugin
 

@emotion/babel-plugin์€ babel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„ค์น˜ ํ›„ configํŒŒ์ผ์˜ plugins์— @emotion์„ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

export default function TestRecoil() {
   const [count, setCount] = useRecoilState(counterState);
   return (
@@ -88,16 +88,16 @@
     </ResetButton>
   </WrapperDiv>
 );
-

Untitled

์งœ์ž”! ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชป์ƒ๊ธด ๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ ์–ด์จŒ๋“  ์ œ ์˜๋„๋Œ€๋กœ ๋ชป์ƒ๊ฒผ๋„ค์š”.

๐Ÿ“‹emotion์˜ ํŠน์ง•

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•˜์œผ๋‹ˆ, ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

Untitled

  • styled component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (CamelCase) +

Untitled

์งœ์ž”! ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชป์ƒ๊ธด ๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ ์–ด์จŒ๋“  ์ œ ์˜๋„๋Œ€๋กœ ๋ชป์ƒ๊ฒผ๋„ค์š”.

๐Ÿ“‹emotion์˜ ํŠน์ง•

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•˜์œผ๋‹ˆ, ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

Untitled

  • styled component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (CamelCase) ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ทœ์น™์ด ์›์ธ์ธ๋ฐ, ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ํƒœ๊ทธ ๊ฐ๊ฐ์ด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์ด ์ผ๊ด€์„ฑ ์žˆ๊ธฐ๋„ ํ•˜๊ตฌ์š”.
  • ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ style ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ .ts ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์Šคํƒ€์ผ์„ exportํ•˜๊ณ  importํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. css ํŒŒ์ผ๊ณผ์˜ ์ฐจ์ด๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ ์ •์˜๋ฅผ IDE๊ฐ€ ๋ฐ”๋กœ ์ฐพ์•„์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. VS Code ๊ธฐ์ค€, Ctrl + ํด๋ฆญ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!
  • scss ๋ฌธ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. scss์˜ nesting ๋ฌธ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. backquote ์•ˆ์—์„œ๋Š” ์™„์ „ scss์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!
  • class / id ์„ ํƒ์ž๋ฅผ ์ง€์–‘ํ•ฉ์‹œ๋‹ค! ๊ธฐ๋ณธ์ ์œผ๋กœ scss์˜ ๋ชจ๋“  ์„ ํƒ์ž๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ฒœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์„ ํƒ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•˜๋‹ˆ๊นŒ์š”. ์–ด๋Š ์บ ํผ๋ถ„์—๊ฒŒ ๋“ค์—ˆ๋˜ ๋‚ด์šฉ์ธ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ“ ์•„๋‹ˆ ๊ทธ๋Ÿผ .selected ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋˜ ํด๋ž˜์Šค์˜ ์—ญํ• ์€ ๋ˆ„๊ฐ€ ํ•˜๋‚˜์š”? -emotion์€ ๋†€๋ž๊ฒŒ๋„ CSS props๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ React Component์—์„œ ์‚ฌ์šฉํ•˜๋Š” Props๋ฅผ ๊ทธ๋Œ€๋กœ CSS์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ œ๋ชฉ ์—†์Œ-1.png

์œ„์™€ ๊ฐ™์ด props๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์œ ๋™์ ์ธ ์Šคํƒ€์ผ ์ง€์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊น”๋”ํ•˜์ฃ ? ์Šคํƒ€์ผ์˜ props interface์— ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ ์‹ค์ œ ์‚ฌ์šฉ์—์„œ props ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋นจ๊ฐ„ ์ค„์„ ๊ทธ์–ด ์ฃผ๊ธฐ๋„ ํ•œ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ”จํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ

VS Code์—๋Š” emotion๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ๋“ค์ด ์žˆ๋Š”๋ฐ์š”, ์งค๋ง‰ํ•˜๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์†Œ๊ฐœํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Auto Rename Tag

Untitled

ํ™•์žฅ1.gif

tsx, jsx๋ฅผ ํฌํ•จํ•œ ํŒŒ์ผ์—์„œ HTML ํƒœ๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์—ด๋ฆฐ ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•ด ์ฃผ๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ div๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ๋ฅผ ์ •ํ™•ํžˆ ์ง์„ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ๊ณ ์ณ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ ์ ์šฉ์ด ๋งค์šฐ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

Highlight Matching Tag

Untitled

Untitled

์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ๋ˆˆ์— ๋„๋„๋ก ๋ฐ‘์ค„๋กœ ๊ฐ•์กฐํ•ด ์ค๋‹ˆ๋‹ค. Auto Rename Tag์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

vscode-styled-components

Untitled

Untitled

Untitled

styled.tag๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋ฉด css ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋˜์–ด ์ž๋™์™„์„ฑ์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋ฐ์š”, ์ด ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์ด css ํ”„๋กœํผํ‹ฐ๋กœ ์ธ์‹๋˜์–ด css ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋“ฏ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์ง€ ์ข‹์ฃ ?

Color Highlight

Untitled

Untitled

IDE ์ฐจ์›์—์„œ ์ƒ‰์ƒ์˜ hex code์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด ์ค๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ํฌ๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค์„ ์ญ‰ ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ๊ฑฐ๋“ ์š”.

๐Ÿค”์“ฐ์‹œ๊ฒŒ์š”?

CSS-in-JS์˜ ๊ฐœ๋…๊ณผ ๊ทธ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CSS-in-JS๋Š” ๊ณผ์—ฐ ์ •๋‹ต์ผ๊นŒ์š”? ์–ผ๋งˆ ์ „์— ์Šฌ๋ž™์—์„œ ์ด์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ  ๋ผ๋Š” ์ œ๋ชฉ์˜ ๊ธ€์ธ๋ฐ์š”, Emotion์˜ ๋ฉ”์ธ ๊ธฐ์—ฌ์ž ์ค‘ ํ•œ ๋ช…์ด ์ด๋Ÿฐ ๊ธ€์„ ์ผ๋‹ค๋Š” ์ ์—์„œ ๊ณ ๋ฏผํ•ด ๋ณผ ๊ฐ€์น˜๋Š” ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ์˜ ๋‹จ์ ๊ณผ React์™€์˜ ๋ช‡ ๊ฐ€์ง€ ์—ญ์‹œ๋„ˆ์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ œ ์ˆ˜์ค€์—์„œ๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ฒด๊ฐํ•˜๊ธฐ๋„, ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ค์šด ๋‚ด์šฉ์ด์ง€๋งŒ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ทธ๋Ÿฌํ•˜๋“ฏ CSS-in-JS๋„ ๊ทธ ์žฅ๋‹จ์ ์„ ์ธ์ง€ํ•˜๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋Š ์„ ํƒ์ด ์ตœ์„ ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 

๐Ÿ“–Refs.

https://github.com/jsjoeio/styled-components-vs-emotion
styled-components ๊ณผ emotion, ๋„๋Œ€์ฒด ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€?
[๋ฒˆ์—ญ] CSS-in-JS์— ๊ด€ํ•ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ
does not exist on type ‘jsx.intrinsicelements’ ๋ฌธ์ œ ํ•ด๊ฒฐ
(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 
ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๊ฐ„๋™์•ˆ ์ œ๊ฐ€ ๊ฒ€์ƒ‰ ํ•œ ๋ฒˆ ์—†์ด emotion์„ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๊ฐ„ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋˜์–ด์ฃผ์‹  J154 ์ด์ •์šฑ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‡

 ยฉ 2024 PrayinforRain. +emotion์€ ๋†€๋ž๊ฒŒ๋„ CSS props๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ React Component์—์„œ ์‚ฌ์šฉํ•˜๋Š” Props๋ฅผ ๊ทธ๋Œ€๋กœ CSS์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ œ๋ชฉ ์—†์Œ-1.png

์œ„์™€ ๊ฐ™์ด props๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์œ ๋™์ ์ธ ์Šคํƒ€์ผ ์ง€์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊น”๋”ํ•˜์ฃ ? ์Šคํƒ€์ผ์˜ props interface์— ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ ์‹ค์ œ ์‚ฌ์šฉ์—์„œ props ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋นจ๊ฐ„ ์ค„์„ ๊ทธ์–ด ์ฃผ๊ธฐ๋„ ํ•œ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ”จํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ

VS Code์—๋Š” emotion๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ๋“ค์ด ์žˆ๋Š”๋ฐ์š”, ์งค๋ง‰ํ•˜๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์†Œ๊ฐœํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Auto Rename Tag

Untitled

ํ™•์žฅ1.gif

tsx, jsx๋ฅผ ํฌํ•จํ•œ ํŒŒ์ผ์—์„œ HTML ํƒœ๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์—ด๋ฆฐ ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•ด ์ฃผ๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ div๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ๋ฅผ ์ •ํ™•ํžˆ ์ง์„ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ๊ณ ์ณ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ ์ ์šฉ์ด ๋งค์šฐ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

Highlight Matching Tag

Untitled

Untitled

์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ๋ˆˆ์— ๋„๋„๋ก ๋ฐ‘์ค„๋กœ ๊ฐ•์กฐํ•ด ์ค๋‹ˆ๋‹ค. Auto Rename Tag์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

vscode-styled-components

Untitled

Untitled

Untitled

styled.tag๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋ฉด css ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋˜์–ด ์ž๋™์™„์„ฑ์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋ฐ์š”, ์ด ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์ด css ํ”„๋กœํผํ‹ฐ๋กœ ์ธ์‹๋˜์–ด css ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋“ฏ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์ง€ ์ข‹์ฃ ?

Color Highlight

Untitled

Untitled

IDE ์ฐจ์›์—์„œ ์ƒ‰์ƒ์˜ hex code์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด ์ค๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ํฌ๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค์„ ์ญ‰ ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ๊ฑฐ๋“ ์š”.

๐Ÿค”์“ฐ์‹œ๊ฒŒ์š”?

CSS-in-JS์˜ ๊ฐœ๋…๊ณผ ๊ทธ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CSS-in-JS๋Š” ๊ณผ์—ฐ ์ •๋‹ต์ผ๊นŒ์š”? ์–ผ๋งˆ ์ „์— ์Šฌ๋ž™์—์„œ ์ด์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ  ๋ผ๋Š” ์ œ๋ชฉ์˜ ๊ธ€์ธ๋ฐ์š”, Emotion์˜ ๋ฉ”์ธ ๊ธฐ์—ฌ์ž ์ค‘ ํ•œ ๋ช…์ด ์ด๋Ÿฐ ๊ธ€์„ ์ผ๋‹ค๋Š” ์ ์—์„œ ๊ณ ๋ฏผํ•ด ๋ณผ ๊ฐ€์น˜๋Š” ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ์˜ ๋‹จ์ ๊ณผ React์™€์˜ ๋ช‡ ๊ฐ€์ง€ ์—ญ์‹œ๋„ˆ์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ œ ์ˆ˜์ค€์—์„œ๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ฒด๊ฐํ•˜๊ธฐ๋„, ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ค์šด ๋‚ด์šฉ์ด์ง€๋งŒ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ทธ๋Ÿฌํ•˜๋“ฏ CSS-in-JS๋„ ๊ทธ ์žฅ๋‹จ์ ์„ ์ธ์ง€ํ•˜๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋Š ์„ ํƒ์ด ์ตœ์„ ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 

๐Ÿ“–Refs.

https://github.com/jsjoeio/styled-components-vs-emotion
styled-components ๊ณผ emotion, ๋„๋Œ€์ฒด ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€?
[๋ฒˆ์—ญ] CSS-in-JS์— ๊ด€ํ•ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ
does not exist on type ‘jsx.intrinsicelements’ ๋ฌธ์ œ ํ•ด๊ฒฐ
(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 
ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๊ฐ„๋™์•ˆ ์ œ๊ฐ€ ๊ฒ€์ƒ‰ ํ•œ ๋ฒˆ ์—†์ด emotion์„ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๊ฐ„ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋˜์–ด์ฃผ์‹  J154 ์ด์ •์šฑ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‡

+Hugo.
\ No newline at end of file diff --git a/posts/2022/11/making-editor-contenteditable/index.html b/posts/2022/11/making-editor-contenteditable/index.html index 5bd521b..2ff60b2 100644 --- a/posts/2022/11/making-editor-contenteditable/index.html +++ b/posts/2022/11/making-editor-contenteditable/index.html @@ -1,7 +1,7 @@ ๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3] | PrayinForRain.dev -

๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]

Table of Contents

๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]


๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

https://hackmd.io/
https://ui.toast.com/tui-editor

๋ ˆํผ๋Ÿฐ์Šค ์‚ดํŽด๋ณด๊ธฐ

Untitled

๋†€๋ž๊ฒŒ๋„ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์—๋””ํ„ฐ ์ค‘ textarea๋‚˜ input ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ปํ•ด์•ผ ๊นƒํ—ˆ๋ธŒ์˜ ์—๋””ํ„ฐ๊ฐ€ textarea๋กœ ๋˜์–ด ์žˆ๋˜ ๊ธฐ์–ต์ด ๋‚˜๋„ค์š”. textarea์˜ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ž…๋ ฅ ์นธ ์•ˆ์— ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, syntax highlighting์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ์—์„œ๋Š”์š”.

๊ทธ ๋ฌธ์ œ๋ฅผ ์šฐ๋ฆฌ๋Š” div ํƒœ๊ทธ์— contenteditable ์†์„ฑ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. contenteditable์€ div๋ฅผ textarea์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋ฉฐ, ์ค‘๊ฐ„์— span๊ฐ™์€ ํƒœ๊ทธ๋กœ ๋ถ€๋ถ„ ์Šคํƒ€์ผ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก contenteditable์„ ์ ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

A component is contentEditable and contains children managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.

์ด๋Š” contenteditable์ด ์ ์šฉ๋œ ํƒœ๊ทธ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์— ๋”ฐ๋ผ ์ƒˆ element๊ฐ€ ๋Š˜๊ธฐ๋„ ํ•˜๊ณ , ๋‹ค์‹œ ์ค„์–ด๋“ค๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— React ์—”์ง„์ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ๊ทธ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์€ ๋„ˆ ์•Œ์•„์„œ ํ•ด๋ผ ๋ผ๊ณ  ๋งํ•˜๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ์ด element๋ฅผ ๋” ์ด์ƒ React๊ฐ€ ์ง€์ผœ์ค„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒฝ๊ณ ์ธ๋ฐ์š”, contenteditable ์†์„ฑ์ด ์ ์šฉ๋œ ํƒœ๊ทธ์— suppressContentEditableWarning ์†์„ฑ์„ ๊ฐ™์ด ๋‹ฌ์•„์ฃผ๋ฉด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•ด๋ณด์ž

๊ทธ๋Ÿผ ์ด์ œ ๊ฐ„๋‹จํ•˜๊ฒŒ contenteditable์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<div>
   <div>Toolbar</div>
   <div contentEditable>content</div>
   <div>
@@ -11,7 +11,7 @@
   </div>
 </div>
 

Untitled -Untitled

์˜ค.. ์ž˜ ๋ฉ๋‹ˆ๋‹ค. ์™œ ๋ ๊นŒ์š”?

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๊นŒ๋ณด๋‹ˆ ๊ฐœํ–‰ ์ž…๋ ฅ์„ ํ•  ๋•Œ๋งˆ๋‹ค div ํƒœ๊ทธ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด ๊ทธ ์•ˆ์— ๋‚ด์šฉ์ด ์ž…๋ ฅ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด contenteditable์ด ๊ฑธ๋ฆฐ div๋ฅผ ์ฐธ์กฐํ•˜์—ฌ innerText, innerHTML์ค‘ ํ•œ ์ชฝ์„ ์„ ํƒํ•ด์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

contenteditable์ด ๊ฑธ๋ฆฐ div์— css๋กœ display: inline-block; ์†์„ฑ์„ ์ฃผ๋ฉด ๊ฐœํ–‰์ด brํƒœ๊ทธ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค๊ณ  ํ•˜๋„ค์š”. ์ง€๊ธˆ ์ €๋Š” syntax highlight ๊ธฐ๋Šฅ๊นŒ์ง€ ์š•์‹ฌ์„ ๋‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„ ์Šคํƒ€์ผ ์ ์šฉ์ด ๋น„๊ต์  ํŽธํ•ด ๋ณด์ด๋Š” div๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ChangeEvent๊ฐ€ ์—†๋Š” Input

์—ฌ๊ธฐ์„œ ๋งˆ์ฃผ์นœ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์‚ฌ์ง„์—์„œ๋Š” ์ด์˜๊ฒŒ ๋ชจ๋“  ํ–‰์ด divํƒœ๊ทธ์— ๊ฐ์‹ธ์ ธ ์žˆ์—ˆ์ง€๋งŒ, ์‚ฌ์‹ค ๋ชจ๋“  ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ํ•œ ๋ฒˆ ๋” ๋ˆ„๋ฅด๋ฉด ์ฒซ ์ค„์ด contenteditable div ์ž์ฒด์˜ innerText๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์†Œ๋ฆฌ๋ƒ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

Untitled

์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ฒซ ์ค„๋งŒ ์ €๋Ÿฐ ํ˜•ํƒœ๋กœ ๋‚˜์˜ค๋ฉด ์‹ฌ๋ฆฌ์ ์ธ ๋ถˆํŽธํ•จ์ด ์žˆ๊ณ , ๋‘๋ฒˆ์งธ๋กœ ๋‚˜์ค‘์— syntax-highlight๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ฒซ ์ค„์— ํ•œ์ •๋œ ๋ฒ„๊ทธ๊ฐ€ ์Ÿ์•„์ ธ ๋‚˜์˜ฌ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ delete๋‚˜ ๋ฐฑ์ŠคํŽ˜์ด์Šค ์ž…๋ ฅ์œผ๋กœ ์ธํ•ด ๋‚ด์šฉ์ด ์—†์–ด์ง€๋ฉด <div><br/></div>๋กœ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก onChange ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. <br/>์ด ํฌํ•จ๋œ ์ด์œ ๋Š” ๋น„์–ด์žˆ๋Š” div ํƒœ๊ทธ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ž…๋ ฅํ•  ๋•Œ ๊ทธ ์•ˆ์œผ๋กœ ์ž…๋ ฅ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š”, contenteditable์€ onChange์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์• ์ดˆ์— input ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ž…๋ ฅํ•œ ๊ฐ’์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— onKeyUp, onKeyDown๊ฐ™์€ Key ์ด๋ฒคํŠธ์™€ contenteditable ํƒœ๊ทธ์˜ innerHTML์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์šฐํšŒํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

const handleKeyUp = (e: KeyboardEvent<HTMLDivElement>) => {
+Untitled

์˜ค.. ์ž˜ ๋ฉ๋‹ˆ๋‹ค. ์™œ ๋ ๊นŒ์š”?

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๊นŒ๋ณด๋‹ˆ ๊ฐœํ–‰ ์ž…๋ ฅ์„ ํ•  ๋•Œ๋งˆ๋‹ค div ํƒœ๊ทธ๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์–ด ๊ทธ ์•ˆ์— ๋‚ด์šฉ์ด ์ž…๋ ฅ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌ๋ฉด contenteditable์ด ๊ฑธ๋ฆฐ div๋ฅผ ์ฐธ์กฐํ•˜์—ฌ innerText, innerHTML์ค‘ ํ•œ ์ชฝ์„ ์„ ํƒํ•ด์„œ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

contenteditable์ด ๊ฑธ๋ฆฐ div์— css๋กœ display: inline-block; ์†์„ฑ์„ ์ฃผ๋ฉด ๊ฐœํ–‰์ด brํƒœ๊ทธ๋กœ ๋‚˜๋ˆ ์ง„๋‹ค๊ณ  ํ•˜๋„ค์š”. ์ง€๊ธˆ ์ €๋Š” syntax highlight ๊ธฐ๋Šฅ๊นŒ์ง€ ์š•์‹ฌ์„ ๋‚ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„ ์Šคํƒ€์ผ ์ ์šฉ์ด ๋น„๊ต์  ํŽธํ•ด ๋ณด์ด๋Š” div๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ChangeEvent๊ฐ€ ์—†๋Š” Input

์—ฌ๊ธฐ์„œ ๋งˆ์ฃผ์นœ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์‚ฌ์ง„์—์„œ๋Š” ์ด์˜๊ฒŒ ๋ชจ๋“  ํ–‰์ด divํƒœ๊ทธ์— ๊ฐ์‹ธ์ ธ ์žˆ์—ˆ์ง€๋งŒ, ์‚ฌ์‹ค ๋ชจ๋“  ๋‚ด์šฉ์„ ์ง€์šฐ๊ณ  ๋ฐฑ์ŠคํŽ˜์ด์Šค๋ฅผ ํ•œ ๋ฒˆ ๋” ๋ˆ„๋ฅด๋ฉด ์ฒซ ์ค„์ด contenteditable div ์ž์ฒด์˜ innerText๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์†Œ๋ฆฌ๋ƒ๋ฉด ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ๋˜๋Š” ๊ฒƒ์ด์ฃ .

Untitled

์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์šฐ์„  ์ฒซ ์ค„๋งŒ ์ €๋Ÿฐ ํ˜•ํƒœ๋กœ ๋‚˜์˜ค๋ฉด ์‹ฌ๋ฆฌ์ ์ธ ๋ถˆํŽธํ•จ์ด ์žˆ๊ณ , ๋‘๋ฒˆ์งธ๋กœ ๋‚˜์ค‘์— syntax-highlight๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ฒซ ์ค„์— ํ•œ์ •๋œ ๋ฒ„๊ทธ๊ฐ€ ์Ÿ์•„์ ธ ๋‚˜์˜ฌ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ delete๋‚˜ ๋ฐฑ์ŠคํŽ˜์ด์Šค ์ž…๋ ฅ์œผ๋กœ ์ธํ•ด ๋‚ด์šฉ์ด ์—†์–ด์ง€๋ฉด <div><br/></div>๋กœ ์ดˆ๊ธฐํ™” ๋˜๋„๋ก onChange ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค. <br/>์ด ํฌํ•จ๋œ ์ด์œ ๋Š” ๋น„์–ด์žˆ๋Š” div ํƒœ๊ทธ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ์ž…๋ ฅํ•  ๋•Œ ๊ทธ ์•ˆ์œผ๋กœ ์ž…๋ ฅ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š”, contenteditable์€ onChange์ด๋ฒคํŠธ๋ฅผ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ๋Š” ์• ์ดˆ์— input ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ž…๋ ฅํ•œ ๊ฐ’์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ . ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— onKeyUp, onKeyDown๊ฐ™์€ Key ์ด๋ฒคํŠธ์™€ contenteditable ํƒœ๊ทธ์˜ innerHTML์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์šฐํšŒํ•ด์„œ ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

const handleKeyUp = (e: KeyboardEvent<HTMLDivElement>) => {
   if (!contentRef.current) return;
   const { key } = e;
   if (key === "Backspace" || key === "Delete") {
@@ -24,7 +24,7 @@
   }
   setContent(contentRef.current.innerText.replace(/\n\n/g, "\n"));
 };
-

Untitled

์ž ๊น์˜ ํ…Œ์ŠคํŠธ ๋์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค์„œ๋ฅผ ์ฐพ๊ณ  ์ œ์–ดํ•˜๊ธฐ

์ด์ œ ๋‹ค ๋œ๊ฑธ๊นŒ์š”? ๋•Œ๋งˆ์นจ ๊ฒŒ๋”ํƒ€์šด์— ์žˆ๋˜ ํŒ€์›๋ถ„์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ–ˆ๋”๋‹ˆ \t ์บ๋ฆญํ„ฐ ์ž…๋ ฅ์ด ์•ˆ๋˜๋Š” ์ ์ด ์•„์‰ฝ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์Œ.. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ• ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์š”์†Œ์ธ๋ฐ ํƒญํ‚ค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณค๋ž€ํ•˜๋‹ˆ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ onKeyDown์œผ๋กœ Tab ํ‚ค๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ์ž…๋ ฅ์„ ํ•ด์ฃผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”? ..์–ด? ๊ทผ๋ฐ ์‚ฌ์šฉ์ž ์ปค์„œ ์œ„์น˜์— ํƒญํ‚ค๋ฅผ ๋„ฃ๋Š” ๊ณผ์ •์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ์š”?

์—ฌ๊ธฐ์„œ window.getSelection() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. getSelection์€ ์‚ฌ์šฉ์ž์˜ ์ปค์„œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ธ๋ฐ์š”, ๋ธ”๋ก ์ง€์ •์„ ํ–ˆ์„ ๋•Œ, ๋‹จ์ผ ์œ„์น˜์— ์ปค์„œ๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ๊ฐ ๋‚˜๋ˆ„์–ด์„œ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

Untitled

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•  ์š”์†Œ๋Š” anchorOffset๊ณผ focusOffset์ž…๋‹ˆ๋‹ค. type์ด Caret์ผ ๊ฒฝ์šฐ ๋‘ ๊ฐ’์€ ๋˜‘๊ฐ™์ด ํ˜„์žฌ ์ปค์„œ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, type์ด Range์ธ, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ๋“œ๋ž˜๊ทธ๋กœ ๋ธ”๋ก ์ง€์ •์„ ํ•œ ๊ฒฝ์šฐ์—๋Š” anchorOffset์ด ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์ง€์ , focusOffset์ด ๋“œ๋ž˜๊ทธ ์ข…๋ฃŒ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฑธ ์ด์šฉํ•ด์„œ, ์‚ฌ์šฉ์ž์˜ ์ปค์„œ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด์„œ, ํ•ด๋‹น ์œ„์น˜์˜ node์˜ innerText๋ฅผ ์ œ์–ดํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž… ํ›„์— window.getSelection().collapse()๋ฅผ ์ด์šฉํ•ด ์ž…๋ ฅ๋œ ๋ฌธ์ž์˜ ๋ฐ”๋กœ ๋’ค๋กœ ์ปค์„œ๋ฅผ ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋” ์ข‹๊ฒ ๋„ค์š”!

const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
+

Untitled

์ž ๊น์˜ ํ…Œ์ŠคํŠธ ๋์— ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ปค์„œ๋ฅผ ์ฐพ๊ณ  ์ œ์–ดํ•˜๊ธฐ

์ด์ œ ๋‹ค ๋œ๊ฑธ๊นŒ์š”? ๋•Œ๋งˆ์นจ ๊ฒŒ๋”ํƒ€์šด์— ์žˆ๋˜ ํŒ€์›๋ถ„์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ–ˆ๋”๋‹ˆ \t ์บ๋ฆญํ„ฐ ์ž…๋ ฅ์ด ์•ˆ๋˜๋Š” ์ ์ด ์•„์‰ฝ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์Œ.. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ• ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ์š”์†Œ์ธ๋ฐ ํƒญํ‚ค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณค๋ž€ํ•˜๋‹ˆ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ onKeyDown์œผ๋กœ Tab ํ‚ค๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ์ž…๋ ฅ์„ ํ•ด์ฃผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”? ..์–ด? ๊ทผ๋ฐ ์‚ฌ์šฉ์ž ์ปค์„œ ์œ„์น˜์— ํƒญํ‚ค๋ฅผ ๋„ฃ๋Š” ๊ณผ์ •์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ์š”?

์—ฌ๊ธฐ์„œ window.getSelection() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. getSelection์€ ์‚ฌ์šฉ์ž์˜ ์ปค์„œ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ธ๋ฐ์š”, ๋ธ”๋ก ์ง€์ •์„ ํ–ˆ์„ ๋•Œ, ๋‹จ์ผ ์œ„์น˜์— ์ปค์„œ๊ฐ€ ์žˆ์„ ๋•Œ ๊ฐ๊ฐ ๋‚˜๋ˆ„์–ด์„œ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค๋‹ˆ๋‹ค.

Untitled

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•  ์š”์†Œ๋Š” anchorOffset๊ณผ focusOffset์ž…๋‹ˆ๋‹ค. type์ด Caret์ผ ๊ฒฝ์šฐ ๋‘ ๊ฐ’์€ ๋˜‘๊ฐ™์ด ํ˜„์žฌ ์ปค์„œ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ, type์ด Range์ธ, ์ฆ‰ ์‚ฌ์šฉ์ž๊ฐ€ ๋“œ๋ž˜๊ทธ๋กœ ๋ธ”๋ก ์ง€์ •์„ ํ•œ ๊ฒฝ์šฐ์—๋Š” anchorOffset์ด ๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์ง€์ , focusOffset์ด ๋“œ๋ž˜๊ทธ ์ข…๋ฃŒ ์ง€์ ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฑธ ์ด์šฉํ•ด์„œ, ์‚ฌ์šฉ์ž์˜ ์ปค์„œ ์œ„์น˜๋ฅผ ์•Œ์•„๋‚ด์„œ, ํ•ด๋‹น ์œ„์น˜์˜ node์˜ innerText๋ฅผ ์ œ์–ดํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‚ฝ์ž… ํ›„์— window.getSelection().collapse()๋ฅผ ์ด์šฉํ•ด ์ž…๋ ฅ๋œ ๋ฌธ์ž์˜ ๋ฐ”๋กœ ๋’ค๋กœ ์ปค์„œ๋ฅผ ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋” ์ข‹๊ฒ ๋„ค์š”!

const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
   const { key } = e;
   const cursor = window.getSelection();
   if (!cursor) return;
@@ -41,12 +41,12 @@
     }
   }
 };
-

\t ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ํ–ˆ๋”๋‹ˆ ํƒญ์„ ์—ฐ๋‹ฌ์•„ ์ž…๋ ฅํ•˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ์ž…๋ ฅ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ๊ณต๋ฐฑ ๋‘ ์นธ์œผ๋กœ ๋Œ€์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Untitled

์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”๊ตฐ์š”. ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค!

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์ž

์ด์ œ ๋งˆํฌ๋‹ค์šด์„ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ํ•จ์ˆ˜์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„˜๊ฒจ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ innerText๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ณด๋‚ด๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

Untitled

์œ„ ์ž…๋ ฅ ๊ฒฐ๊ณผ์˜ innerText๋Š” ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”?

์ฒซ์ค„\n\n\n์…‹์งธ์ค„\n
+

\t ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ํ–ˆ๋”๋‹ˆ ํƒญ์„ ์—ฐ๋‹ฌ์•„ ์ž…๋ ฅํ•˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ์ž…๋ ฅ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ๊ณต๋ฐฑ ๋‘ ์นธ์œผ๋กœ ๋Œ€์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Untitled

์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”๊ตฐ์š”. ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค!

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์ž

์ด์ œ ๋งˆํฌ๋‹ค์šด์„ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ํ•จ์ˆ˜์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋„˜๊ฒจ์ฃผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ innerText๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ณด๋‚ด๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

Untitled

์œ„ ์ž…๋ ฅ ๊ฒฐ๊ณผ์˜ innerText๋Š” ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”?

์ฒซ์ค„\n\n\n์…‹์งธ์ค„\n
 

์ด๋Ÿฐ.. div ์ž์ฒด๊ฐ€ ํ•œ ์ค„๋กœ ์ž…๋ ฅ์ด ๋˜๊ณ  ๋‘˜์งธ์ค„ ์•ˆ์˜ br ํƒœ๊ทธ๊ฐ€ ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ํ•˜๋‚˜ ๋” ์ž…๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. contenteditable์€ ๋นˆ ์ค„์— ์ž๋™์œผ๋กœ br์„ ์‚ฝ์ž…ํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๊ธฐ ์ „์— ์ •๊ทœํ‘œํ˜„์‹์œผ๋กœ ์—ฐ์†๋œ ๊ฐœํ–‰๋ฌธ์ž๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์น˜๋Š” ์ž‘์—…์„ ๊ฑฐ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค.

setContent(contentRef.current.innerText.replace(/\n\n/g, "\n"));
-

์Œ, ์ด์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ •์ œ๋˜์—ˆ๋„ค์š”! ์ด๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ์‹์„ ์–ด๋–ป๊ฒŒ ์ž…ํž๊นŒ์š”?

Untitled

์ •์ œํ•œ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ , ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ #์„ ์ด์šฉํ•œ ํ—ค๋”ฉ ๋งˆํฌ๋‹ค์šด์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๊ทœ์น™์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ง‘์–ด ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์ข‹์€ ๋ฐฉ์‹์ผ๊นŒ์š”? #์„ ์ด์šฉํ•œ ํ—ค๋”ฉ๋„ ์žˆ์ง€๋งŒ ์•„๋žซ์ค„์— - ๋˜๋Š” =๋ฅผ ์ž…๋ ฅํ•ด์„œ ํ—ค๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ์š”? ๋งŒ์•ฝ ํ—ค๋”ฉ๊ณผ ์ฝ”๋“œ๋ธ”๋Ÿญ ๋งˆํฌ๋‹ค์šด์ด ์ค‘์ฒฉ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ์š”? ํ‘œ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€์š”?

์ƒ๊ฐ๋งŒ ํ•ด๋„ ๋ฒŒ์จ ๋จธ๋ฆฌ๊ฐ€ ์–ผํฐํ•ด์ง€๋„ค์š”. ํ .. ๊ฐ‘์ž๊ธฐ tokenizer, lexer, parser๊ฐ™์€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋ง‰ ๋– ์˜ค๋ฅด๋Š”๋ฐ.. ๋‹ค์‹œ ์ฐจ๋ถ„ํžˆ ๊ณต๋ถ€ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€์˜ ๋‚ด์šฉ์ด ๋ฒŒ์จ ์ง์ž‘์ด ๊ฐ€๋Š”๊ตฐ์š”. ์ง€๊ธˆ๊นŒ์ง€ contenteditable๊ณผ getSelection()์„ ํ™œ์šฉํ•œ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 ยฉ 2024 PrayinforRain. +

์Œ, ์ด์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ์ •์ œ๋˜์—ˆ๋„ค์š”! ์ด๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ์‹์„ ์–ด๋–ป๊ฒŒ ์ž…ํž๊นŒ์š”?

Untitled

์ •์ œํ•œ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ง€๊ณ , ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ #์„ ์ด์šฉํ•œ ํ—ค๋”ฉ ๋งˆํฌ๋‹ค์šด์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ๋ชจ๋“  ๊ทœ์น™์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ง‘์–ด ๋„ฃ๋Š” ๋ฐฉ์‹์ด ์ข‹์€ ๋ฐฉ์‹์ผ๊นŒ์š”? #์„ ์ด์šฉํ•œ ํ—ค๋”ฉ๋„ ์žˆ์ง€๋งŒ ์•„๋žซ์ค„์— - ๋˜๋Š” =๋ฅผ ์ž…๋ ฅํ•ด์„œ ํ—ค๋”ฉ์„ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ์š”? ๋งŒ์•ฝ ํ—ค๋”ฉ๊ณผ ์ฝ”๋“œ๋ธ”๋Ÿญ ๋งˆํฌ๋‹ค์šด์ด ์ค‘์ฒฉ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ• ๊นŒ์š”? ํ‘œ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€์š”?

์ƒ๊ฐ๋งŒ ํ•ด๋„ ๋ฒŒ์จ ๋จธ๋ฆฌ๊ฐ€ ์–ผํฐํ•ด์ง€๋„ค์š”. ํ .. ๊ฐ‘์ž๊ธฐ tokenizer, lexer, parser๊ฐ™์€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋ง‰ ๋– ์˜ค๋ฅด๋Š”๋ฐ.. ๋‹ค์‹œ ์ฐจ๋ถ„ํžˆ ๊ณต๋ถ€ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธ€์˜ ๋‚ด์šฉ์ด ๋ฒŒ์จ ์ง์ž‘์ด ๊ฐ€๋Š”๊ตฐ์š”. ์ง€๊ธˆ๊นŒ์ง€ contenteditable๊ณผ getSelection()์„ ํ™œ์šฉํ•œ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

+Hugo.
\ No newline at end of file diff --git a/posts/2022/11/making-editor-getselection/index.html b/posts/2022/11/making-editor-getselection/index.html index 862b78d..2b5c8f6 100644 --- a/posts/2022/11/making-editor-getselection/index.html +++ b/posts/2022/11/making-editor-getselection/index.html @@ -1,27 +1,27 @@ ๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3] | PrayinForRain.dev -

๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]

Table of Contents

๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]


์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ?

๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ข ์ฒซ ๋‹จ์ถ”๊ฐ€ ์ค‘์š”ํ•˜๋‹ค

Untitled

์ง€๊ธˆ ๋งŒ๋“  contenteditable div๋Š” ์น˜๋ช…์  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. contenteditable์ด ์‚ฌ์ง„์ฒ˜๋Ÿผ ์ฒซ ์ค„์˜ ํ…์ŠคํŠธ๋ฅผ div ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ๊ธฐ์–ต ๋‚˜์‹œ๋‚˜์š”? ์‚ฌ์‹ค ์ €๋Š” ์ฒ˜์Œ ๊ธ€์—์„œ ์ฒซ ์ค„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ์ฒ™ ์ด์•ผ๊ธฐํ•œ ๋ฐ” ์žˆ์ฃ . ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์—ฌ์ „ํžˆ contenteditable div์— ์ง์ ‘ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์†”์งํ•˜๊ฒŒ ๊ทธ ๋•Œ๋Š” ์–ด์ฐจํ”ผ syntax highlighting์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ด ์‰ฌ์‰ฌํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ, ๋ถ™์—ฌ๋„ฃ๊ธฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

์•„๋ฌด ์ž…๋ ฅ๋„ ๋˜์–ด ์žˆ์ง€ ์•Š์€ contenteditable div์— ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ๋‹ค์‹œ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๋ฉด ๊ทธ ๋•Œ๋ถ€ํ„ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”๋ฐ, ์–ด์ฐจํ”ผ ์ด๋Ÿฐ ์—๋Ÿฌ ์ฏค์ด์•ผ ์ฝ˜์†”์„ ์—ด์–ด๋†“๊ณ  ์›น์„œํ•‘์„ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๊ณ ์„œ์•ผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋‹ˆ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๊ฒฐ์ •์ ์œผ๋กœ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ›„ ์ปค์„œ๊ฐ€ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ ๊ธ€๊ท€์˜ ๋์œผ๋กœ ์ด๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ ํƒญ ํ‚ค์— ๋Œ€ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ๋˜ ์ฝ”๋“œ๋„ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋„ค์š”.

์˜ค๋Š˜์€ ์ด ์˜ค๋ฅ˜์˜ ์›์ธ๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •์— ๋Œ€ํ•ด ๊ธฐ๋กํ•˜๋Š” ๊ธ€์„ ์จ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ–ฑ๏ธ windows.getSelection()

contenteditable์˜ ๋ฌธ์ œ

์ €๋ฒˆ ๊ธ€์—์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ๋ฐ”์™€ ๊ฐ™์ด, contenteditable div๋Š” ์ผ๋ฐ˜์ ์ธ ์ž…๋ ฅ ๋™์ž‘์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐฉํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐจ๋ถ„ํžˆ ๊ธ€์„ ์ž…๋ ฅํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ฒซ ์ค„๋งŒ div ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ฃผ์ง€ ์•Š๋Š”๋‹ค๊ฑฐ๋‚˜, ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•˜๋ฉด ๋Œ€๋œธ ์›๋ณธ์˜ ์„œ์‹์ด ๊ทธ๋Œ€๋กœ ์ ์šฉ๋œ ๊ธ€๊ท€๊ฐ€ ์ž…๋ ฅ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Untitled

๋Œ€์ถฉ ์ด๋Ÿฐ ๋Š๋‚Œ์ด์ฃ . ๊ทธ ์™ธ์—๋„ ์ˆ˜์ •์„ ์–ด๋–ป๊ฒŒ ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ฌ˜ํ•˜๊ฒŒ ๋‹ฌ๋ผ์ง€๊ธฐ๋„ ํ•˜๋Š” ๋“ฑ, ๋„ˆ๋ฌด๋‚˜ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๊ฐ€ ์‚ฐ์žฌํ•ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ก ์ด ๋„ˆ๋ฌด ๊ธธ์—ˆ๋„ค์š”. ๊ทธ๋ƒฅ con..์–ด์ฉŒ๊ตฌ์— ๋Œ€ํ•ด ์ฒ˜์Œ ๊ธ€์„ ์“ธ ๋•Œ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์ด ์žˆ๋‹ค๊ณ  ์„ค๋ช…ํ•  ๊ฑธ ๊ทธ๋žฌ์–ด์š”.

์•„๋ฌดํŠผ ์ด๋Ÿฐ ๋ถˆ์พŒํ•œ ๋™์ž‘๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, keydown, keyup, paste ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์ง์ ‘ ์ด๋Ÿฐ ์ œ์Šค์ณ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ์†Œ๊ฐœํ–ˆ๋˜ ๊ฒƒ์ด ๋ฐ”๋กœ windows.getSelection()์ด์˜€์ฃ .

Untitled

type Selection

์šฐ์„  ์ด ๋…€์„์ด ์ œ๊ณตํ•ด์ฃผ๋Š” Selection ํƒ€์ž… ๊ฐ์ฒด์˜ property๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์„ค๋ช…
anchorNode์„ ํƒ์ด ์‹œ์ž‘๋œ ์ง€์ (=๋“œ๋ž˜๊ทธ ์‹œ์ž‘ ์ง€์ )์˜ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
anchorOffset์„ ํƒ์ด ์‹œ์ž‘๋œ ์ง€์ ์˜ anchorNode์ƒ์—์„œ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
focusNode์„ ํƒ์ด ๋๋‚œ ์ง€์ (=๋“œ๋ž˜๊ทธ ์ข…๋ฃŒ ์ง€์ )์˜ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
focusOffset์„ ํƒ์ด ๋๋‚œ ์ง€์ ์˜ focusNode์ƒ์—์„œ์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
type๋ธ”๋ก ์ง€์ •์‹œ Range, ๋‹จ์ผ ์ปค์„œ๋Š” Caret์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

ํฐ ์˜๋ฏธ ์—†๊ฑฐ๋‚˜ ์ •์‹ ์ŠคํŽ™์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•˜๊ณ  ์ด ์ •๋„๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋“œ๋ž˜๊ทธ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ์ง€์ ์„ ๋ช…์‹œํ•œ ์ด์œ ๋Š” ์ €๋ฒˆ ๊ธ€์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋“œ๋ž˜๊ทธ์—๋Š” ๋ฐฉํ–ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . Caret์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ญ์ƒ ๋‘ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Selection ํƒ€์ž…์€ ์ œ๊ณตํ•˜๋Š” method๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„์„ค๋ช…
getRangeAt(index)ํ˜„์žฌ ์„ ํƒ๋œ index๋ฒˆ์งธ Range ๋ฒ”์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์„ ํƒ์ด ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๋ณดํ†ต index๋Š” 0์ด ์ตœ๋Œ€์ž…๋‹ˆ๋‹ค.
addRange(range)ํ˜„์žฌ ์„ ํƒ๋œ Range์— ๋”ํ•ด range๋ฅผ ํ•จ๊ป˜ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์ค‘ ์„ ํƒ์ด ์ง€์›๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ range๋งŒ์ด ์žฌ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
collapse(node, offset?)node์˜ offset ์œ„์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
containsNode(node, partialContainment?)node๊ฐ€ ์„ ํƒ Range ์•ˆ์— ํฌํ•จ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. partialContainment๊ฐ€ true์ธ ๊ฒฝ์šฐ ์ผ๋ถ€๋งŒ ํฌํ•จ๋˜์–ด ์žˆ์–ด๋„ true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์ง€๋งŒ ์“ฐ์ด์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„ ๊ธธ๊ฒŒ ์ ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ์™ธ์— Selection ํƒ€์ž… ๊ฐ์ฒด๋Š” ๊ฐ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์–•์€ ์ฐธ์กฐ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•ด๋„ ์ฐธ์กฐ ์‹œ์ ์— ๋”ฐ๋ผ ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๊ฒ ๋„ค์š”. ์—ฌ๊ธฐ์„œ ์ œ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฉ”์†Œ๋“œ๋Š” collapse์˜€์Šต๋‹ˆ๋‹ค. ๋Œ€์ถฉ getSelection()์œผ๋กœ ๋ฐ›์€ anchorNode๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ , anchorOffset + ์ถ”๊ฐ€ํ•œ ๋ฌธ์ž์—ด ๊ธธ์ด๋กœ ์œ„์น˜๋ฅผ ์žก๋Š” ์‹์ด์ฃ .

anchorNode๋Š” node๋‹ค

๊ทธ๋Ÿฐ๋ฐ ์ด anchorOffset์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ๋ƒ๋ฉด, ์ด ๋…€์„์„ 1๋กœ ์ง€์ •ํ•˜๋ฉด ์ปค์„œ๊ฐ€ ๋์œผ๋กœ ๊ฐˆ ๋•Œ๊ฐ€ ์žˆ๊ณ , ๋‘ ๋ฒˆ์งธ ๊ธ€์ž๋กœ ์ปค์„œ๊ฐ€ ์ด๋™ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ง์ด์ฃ .

๋ณต์‚ฌ๋งจ2.gif

๋‘ ๋ฒˆ์งธ ๊ธ€์ž๋กœ ์ปค์„œ๊ฐ€ ๊ฐ€๋Š”๊ฑด ์ดํ•ด๊ฐ€ ๊ฐ€๋Š”๋ฐ, ์ฒ˜์Œ์—” ์™œ ๋์œผ๋กœ ๊ฐ”๋˜ ๊ฑธ๊นŒ์š”? ๊ทธ ๋น„๋ฐ€์€ getSelection์ด ์ฐธ์กฐํ•˜๋˜ anchorNode์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ™์—ฌ๋„ฃ๊ธฐ์™€ ๊ทธ ์ดํ›„์˜ ๋ถ™์—ฌ๋„ฃ๊ธฐ์˜ anchorNode๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ฒซ ๋ฒˆ์งธ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋Š” contenteditable div๋ฅผ, ๊ทธ ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ผ์ธ์˜ div..๋„ ์•„๋‹ˆ๋ผ ๊ทธ div์˜ **ํ…์ŠคํŠธ ๋…ธ๋“œ**๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์•„์‹œ๋‚˜์š”?

์œ„์— ์ œ๊ฐ€ console.log๋ฅผ ์ฐ์–ด๋ณธ ์‚ฌ์ง„์—๋Š” anchorNode์— text๋ผ๊ณ  ์“ฐ์—ฌ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” contenteditable div์˜ ์ž์‹ div์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ง์ด์ฃ . ์ฆ‰ getSelection์€ ์„ ํƒ์ค‘์ธ ํ…์ŠคํŠธ ๋…ธ๋“œ๊นŒ์ง€ ๋”ฐ์ ธ์„œ ์ฐธ์กฐํ•œ๋‹ค๋Š” ํŠน์ง•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ๋…ธ๋“œ๋ผ.. ๋”ฑํžˆ ์–ด๋Š ํƒœ๊ทธ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด์„œ ์• ๋งคํ•˜๊ฒŒ ํ…์ŠคํŠธ๋งŒ ๋“ค์–ด์žˆ๋Š” ๋ฐ”๋กœ ๊ทธ innerText๋ฅผ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ชจ์–‘์ž…๋‹ˆ๋‹ค.

Untitled

๋ฐ”๋กœ ์š” ๋…€์„์ธ๋ฐ์š”, ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ์™€ ๋‹ค๋ฅด๊ฒŒ ์กฐ๊ธˆ ํŠน์ดํ•œ ์„ฑ์งˆ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅด๋‹ค๊ณ  ํ•˜๋‚˜, ์•„๋ฌดํŠผ Node ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜์ง€๋งŒ HTML Element๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ๊ต‰์žฅํžˆ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค.

  • innerText๊ฐ€ ๋น„์–ด์žˆ๋Š”, ์ฆ‰ โ€˜โ€™์ธ Element๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ถ€๋ชจ์˜ childNodes๊ฐ™์€ ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ ์ •๋œ ์ธ๋ฑ์Šค์— ์žˆ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
    • ์ฆ‰ ๋‹ค๋ฅธ ํ˜•์ œ ๋…ธ๋“œ์™€์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ธ๋ฑ์Šค๊ฐ€ ๋ณ€ํ•ฉ๋‹ˆ๋‹ค..

๋‹ค์‹œ ๋Œ์•„์™€์„œ collapse์— ์ œ๊ณตํ•œ offset์ด ์–ด์งธ์„œ ํ…์ŠคํŠธ ์ƒ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์•˜๋Š๋ƒ, ๋…ธ๋“œ์ƒ์—์„œ์˜ offset์€ ํ…์ŠคํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ž์‹ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์ฆ‰ ์•„๋ž˜ ๊ณผ์ •๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ณต์‚ฌํ–ˆ์„ ๋•Œ์—๋Š” anchorNode๊ฐ€ contenteditable div์˜€๊ธฐ ๋•Œ๋ฌธ์—, offset = 1์— ํ•ด๋‹นํ•˜๋Š” ์œ„์น˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div contenteditable>
 	<textNode>๋ณต์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค</textNode>
-	<!-- ์—ฌ๊ธฐ! -->
+	<!-- ์—ฌ๊ธฐ! -->
 </div>
 

์ด๋ ‡๊ฒŒ ์ปค์„œ๋ฅผ ์ด๋™์‹œํ‚ค๊ณ  ๋‚˜๋ฉด, div ํƒœ๊ทธ ์•ˆ์˜ ์ž…๋ ฅ์€ ๋ชจ๋‘ ํ…์ŠคํŠธ ๋…ธ๋“œ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฏ€๋กœ ์ปค์„œ๋Š” ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ๋๋‚˜๊ธฐ ์ง์ „ ์œ„์น˜๋กœ ์ž๋™์œผ๋กœ ๋ณด์ •๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„ํ•˜์ž๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋˜๊ฒ ๊ตฐ์š”.

<div contenteditable>
 	<textNode>
 		๋ณต์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค
-		<!-- ์—ฌ๊ธฐ! -->
+		<!-- ์—ฌ๊ธฐ! -->
 	</textNode>
 </div>
 

์ด ์ƒํƒœ์—์„œ ํ•œ๋ฒˆ ๋” ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•œ๋‹ค๋ฉด ๋์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ถ™์—ฌ๋„ฃ๊ธฐ๊ฐ€ ๋˜์ง€๋งŒ, ์ด๋ฒˆ์— ์ฐธ์กฐํ•˜๋Š” anchorNode๋Š” ํ…์ŠคํŠธ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝ๋˜์–ด offset์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋Š” ์ฒ˜์Œ ์›ํ–ˆ๋˜ ๋ฐ”๋กœ ๊ทธ ํ…์ŠคํŠธ์—์„œ์˜ ์œ„์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์™„๋ฃŒํ•œ ํ›„์˜ ์ปค์„œ ์ƒํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

<div contenteditable>
 	<textNode>
-		๋ณต<!-- ์—ฌ๊ธฐ! -->์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค๋ณต์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค
+		๋ณต<!-- ์—ฌ๊ธฐ! -->์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค๋ณต์‚ฌํ•œ ๊ธ€๊ท€์ž…๋‹ˆ๋‹ค
 	</textNode>
 </div>
-

์ •๋ง ๋”์ฐํ•˜๊ตฐ์š”. offset์ด ๋…ธ๋“œ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋œ๋‹ค๋‹ˆ! ์•„๋‹ˆ ๊ทธ ์ด์ „์— ์™œ anchorNode๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ํ…์ŠคํŠธ๋…ธ๋“œ๋ฅผ ์žก์•„ ์ฃผ์ง€ ์•Š๋Š”๊ฑฐ์ฃ ?

Node.nodeType

๋‹คํ–‰ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐ”๋กœ์žก์„ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Node ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” nodeType์ธ๋ฐ์š”, ์ด ๋…€์„์ด 1์ด๋ฉด Element, 3์ด๋ฉด Text ๋…ธ๋“œ๋ผ๊ณ  ํ•˜๋„ค์š”. ๊ทธ ๋ง์ธ ์ฆ‰ anchorNode๊ฐ€ 1์ด๊ฑฐ๋‚˜ 3์ผ ๋•Œ ๋‹ค๋ฅธ ํ•œ ์ชฝ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ†ต์ผํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ.. ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์—ฌ๊ฐ„ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ nodeType์— ๋”ฐ๋ผ offset์„ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const position = anchorNode.nodeType === 3 ? anchorOffset + data.length : 1;
+

์ •๋ง ๋”์ฐํ•˜๊ตฐ์š”. offset์ด ๋…ธ๋“œ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋œ๋‹ค๋‹ˆ! ์•„๋‹ˆ ๊ทธ ์ด์ „์— ์™œ anchorNode๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ํ…์ŠคํŠธ๋…ธ๋“œ๋ฅผ ์žก์•„ ์ฃผ์ง€ ์•Š๋Š”๊ฑฐ์ฃ ?

Node.nodeType

๋‹คํ–‰ํžˆ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐ”๋กœ์žก์„ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ Node ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” nodeType์ธ๋ฐ์š”, ์ด ๋…€์„์ด 1์ด๋ฉด Element, 3์ด๋ฉด Text ๋…ธ๋“œ๋ผ๊ณ  ํ•˜๋„ค์š”. ๊ทธ ๋ง์ธ ์ฆ‰ anchorNode๊ฐ€ 1์ด๊ฑฐ๋‚˜ 3์ผ ๋•Œ ๋‹ค๋ฅธ ํ•œ ์ชฝ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ†ต์ผํ•ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ.. ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ํ…์ŠคํŠธ ๋…ธ๋“œ๋Š” ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ์—ฌ๊ฐ„ ์–ด๋ ค์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์€ nodeType์— ๋”ฐ๋ผ offset์„ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const position = anchorNode.nodeType === 3 ? anchorOffset + data.length : 1;
 window.getSelection()?.collapse(anchorNode, position);
-

ํ…์ŠคํŠธ ๋…ธ๋“œ์ด๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ธธ์ด๋ฅผ ๋”ํ•ด์„œ ๋์ž๋ฆฌ๋ฅผ ์žก์•„์ฃผ๊ณ , ์—˜๋ฆฌ๋จผํŠธ์ด๋ฉด 1์˜ offset์„ ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ๋นˆ ์นธ์— ์ตœ์ดˆ ์ž…๋ ฅ ์‹œ์—๋งŒ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ƒˆ๋กœ์šด ์ผ€์ด์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ € 1์„ ๋ฌด์ฒ™ ํ”ผ๊ณคํ•˜๊ณ  ๊ท€์ฐฎ์€ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊ฟ” ์ฃผ์–ด์•ผ ๊ฒ ๋„ค์š”.

๐Ÿคฆ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์˜ ๊ธธ๋ชฉ์—์„œ

๊ณ ์ณค๋งจ.gif

์ฒ˜์Œ์—๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ๋ฅผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ ๋’ค์— ์–ผ๋งˆ๋‚˜ ๊นŠ์€ ์‹ฌ์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชธ์†Œ ๋‘๋“ค๊ฒจ ๋งž๊ฒŒ ๋˜๋Š” ์š”์ฆ˜์ž…๋‹ˆ๋‹ค. input์ด๋‚˜ textarea๋ฅผ ์ผ์œผ๋ฉด ์ด๋Ÿฐ ๊ธด ๊ธ€์„ ๋‘ ๊ฐœ๋‚˜ ์“ธ ํ•„์š”๊ฐ€ ์—†์—ˆ์„ํ…๋ฐ, ์ œ๊ฐ€ ๋ฌด์Šจ ๋ถ€๊ท€์˜ํ™”๋ฅผ ๋ˆ„๋ฆฌ์ž๊ณ  contenteditable์„ ์“ฐ์ž๊ณ  ํ–ˆ์„๊นŒ์š”?

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ•˜๊ณ  ๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ •๋ง ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ ๋ฐœํ‘œ ์‹œ๊ฐ„์—๋„ ์ œ๊ฐ€ ์ฆ๊ฑฐ์›Œํ•ด์•ผ ํ• ํ…๋ฐ์š”, ๋‹ค์Œ ๊ธ€์€ ๋“œ๋””์–ด ๋งˆํฌ๋‹ค์šด์„ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์จ๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์–ด๋Š ๋‚œ๊ด€์— ๋ถ€๋”ชํ˜€ ๋ฉˆ์ถฐ ์žˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ๋œ๋‹ค๋ฉด ์•„๋งˆ 6์ฃผ์ฐจ์— ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ํ™”์ดํŒ…!

 ยฉ 2024 PrayinforRain. +

ํ…์ŠคํŠธ ๋…ธ๋“œ์ด๋ฉด ์ •์ƒ์ ์œผ๋กœ ๊ธธ์ด๋ฅผ ๋”ํ•ด์„œ ๋์ž๋ฆฌ๋ฅผ ์žก์•„์ฃผ๊ณ , ์—˜๋ฆฌ๋จผํŠธ์ด๋ฉด 1์˜ offset์„ ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ๋นˆ ์นธ์— ์ตœ์ดˆ ์ž…๋ ฅ ์‹œ์—๋งŒ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ƒˆ๋กœ์šด ์ผ€์ด์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ € 1์„ ๋ฌด์ฒ™ ํ”ผ๊ณคํ•˜๊ณ  ๊ท€์ฐฎ์€ ๋ณ€์ˆ˜๋กœ ๋ฐ”๊ฟ” ์ฃผ์–ด์•ผ ๊ฒ ๋„ค์š”.

๐Ÿคฆ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์˜ ๊ธธ๋ชฉ์—์„œ

๊ณ ์ณค๋งจ.gif

์ฒ˜์Œ์—๋Š” ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ๋ฅผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ฐ„๋‹จํ•œ ์—๋””ํ„ฐ ๋’ค์— ์–ผ๋งˆ๋‚˜ ๊นŠ์€ ์‹ฌ์—ฐ์ด ์žˆ๋Š”์ง€ ๋ชธ์†Œ ๋‘๋“ค๊ฒจ ๋งž๊ฒŒ ๋˜๋Š” ์š”์ฆ˜์ž…๋‹ˆ๋‹ค. input์ด๋‚˜ textarea๋ฅผ ์ผ์œผ๋ฉด ์ด๋Ÿฐ ๊ธด ๊ธ€์„ ๋‘ ๊ฐœ๋‚˜ ์“ธ ํ•„์š”๊ฐ€ ์—†์—ˆ์„ํ…๋ฐ, ์ œ๊ฐ€ ๋ฌด์Šจ ๋ถ€๊ท€์˜ํ™”๋ฅผ ๋ˆ„๋ฆฌ์ž๊ณ  contenteditable์„ ์“ฐ์ž๊ณ  ํ–ˆ์„๊นŒ์š”?

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ•˜๊ณ  ๊ธ€์„ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ •๋ง ์ฆ๊ฒ์Šต๋‹ˆ๋‹ค. ๋ฐ๋ชจ ๋ฐœํ‘œ ์‹œ๊ฐ„์—๋„ ์ œ๊ฐ€ ์ฆ๊ฑฐ์›Œํ•ด์•ผ ํ• ํ…๋ฐ์š”, ๋‹ค์Œ ๊ธ€์€ ๋“œ๋””์–ด ๋งˆํฌ๋‹ค์šด์„ ํŒŒ์‹ฑํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์จ๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์–ด๋Š ๋‚œ๊ด€์— ๋ถ€๋”ชํ˜€ ๋ฉˆ์ถฐ ์žˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ๋œ๋‹ค๋ฉด ์•„๋งˆ 6์ฃผ์ฐจ์— ๋ฆฌํŒฉํ† ๋ง์„ ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ํ™”์ดํŒ…!

+Hugo.
\ No newline at end of file diff --git a/posts/2022/11/npm-vs-yarn-vs-pnpm/index.html b/posts/2022/11/npm-vs-yarn-vs-pnpm/index.html index b42d685..195c032 100644 --- a/posts/2022/11/npm-vs-yarn-vs-pnpm/index.html +++ b/posts/2022/11/npm-vs-yarn-vs-pnpm/index.html @@ -1,13 +1,13 @@ npm vs yarn vs pnpm | PrayinForRain.dev -

npm vs yarn vs pnpm

Table of Contents

์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿคท TL;DR

  • npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.
  • ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.
  • ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.

๐ŸŽ npm

Untitled

์šฐ์„  npm์ž…๋‹ˆ๋‹ค. npm์— ๋Œ€ํ•ด ๋” ํ•  ์ด์•ผ๊ธฐ๋Š” ์—†์ง€๋งŒ, ์šฐ์„  ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ค€์ด ๋  ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰๊นŒ์ง€ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ ์‹คํ—˜ํ•  ํ”„๋กœ์ ํŠธ๋Š” ์ œ๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” React boilerplate์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ๋“ค์„ ํฌํ•จํ•˜๋Š”์ง€๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ README.md๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

Untitled

์„ค์น˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Œ€๋กœ package.json์— ์ •์˜๋œ dev ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฆฌ์•กํŠธ ์„œ๋ฒ„์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Untitled

๋ฌด๋‚œํ•˜๊ฒŒ ์ง„ํ–‰์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿˆ Yarn

Yarn์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€, ๋น„๊ต์  ์ตœ๊ทผ์— ๋‚˜์˜จ ๋ฒ„์ „์ธ Yarn berry์˜ PnP ์ „๋žต์„ ํ†ตํ•œ ํŒŒ์ผ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค. npm์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒจํ‚ค์ง€ A, B๊ฐ€ C๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ C๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด๋„ C๋ฅผ node_modules ๋””๋ ‰ํ† ๋ฆฌ ์ตœ์ƒ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ…ํ•˜์—ฌ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋•Œ A, B๊ฐ€ ์ฐธ์กฐํ•˜๋Š” C์˜ ๋ฒ„์ „์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋‘ ๋ฒ„์ „ ์ค‘ ํ•˜๋‚˜๋งŒ์ด ํ˜ธ์ด์ŠคํŒ…๋˜๋ฉฐ, ์ดํ›„ ํ˜ธ์ด์ŠคํŒ…๋˜์ง€ ์•Š์€ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋งŽ์•„์ง€๋”๋ผ๋„ ์ด ๊ตฌ์กฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์™„์ „ํ•œ ์ตœ์ ํ™”๋Š” ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด Yarn berry์—์„œ๋Š” ํŒจํ‚ค์ง€์˜ ๊ฐ ๋ฒ„์ „๋งˆ๋‹ค ํ•˜๋‚˜์˜ .zip ํŒŒ์ผ๋กœ ์„ค์น˜๋˜๊ณ , ์•ž์„œ ๋งํ•œ ์ค‘๋ณต ์„ค์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .zip ํŒŒ์ผ๋กœ ์••์ถ•๋˜๋ฉด์„œ ์–ป๋Š” ์šฉ๋Ÿ‰ ์ƒ์˜ ์ด์ ๋„ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…์€ ํ† ์Šค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”!

๊ทธ๋Ÿผ ์ด์ œ Yarn ๊ณต์‹ ๋ฌธ์„œ์˜ ์„ค๋ช…์„ ๋”ฐ๋ผ์„œ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. NodeJS์˜ Corepack ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ์–‘์ธ๋ฐ, ๋…ธ๋“œ ๋ฒ„์ „ 16.10์„ ๊ธฐ์ค€์œผ๋กœ ์ถ”๊ฐ€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” NodeJS v16.16.0์„ ์‚ฌ์šฉ์ค‘์ด๋ฏ€๋กœ ๋ณ„๋„ ์„ค์น˜ ์—†์ด corepack์„ ํ™œ์„ฑํ™”ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

corepack enable
 corepack prepare yarn@3.2.4 --activate // yarn@stable ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ•จ
 yarn init -2
-

๐Ÿ’ก yarn init ๋’ค์˜ -2 ๋ผ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ Zero-Installs๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ๋Š” ๋ชจ์–‘์ธ๋ฐ์š”, Yarn2 (Berry)์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ node_modules๋ฅผ ๋Œ€์ฒดํ•˜๋Š” PnP ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์–‘์ž…๋‹ˆ๋‹ค. -2๋ฅผ ๋นผ๊ณ  ์ดˆ๊ธฐํ™”ํ•ด๋ณด๋‹ˆ node_modules ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜๋”๋ผ๊ตฌ์š”. Zero-Installs์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

npm์œผ๋กœ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ boilerplate ํŒŒ์ผ์„ ๋ฐฉ๊ธˆ ์ดˆ๊ธฐํ™”ํ•œ yarn ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  yarn install์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Untitled

๋ญ”๊ฐ€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๋“ฏํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ํŒจํ‚ค์ง€๋“ค์ด .zip ํŒŒ์ผ๋กœ ์••์ถ•๋˜์–ด ๋“ค์–ด์žˆ๋„ค์š”.

Untitled

Untitled

์Œ, ๊ทธ๋Ÿฐ๋ฐ ์ด ์ƒํƒœ๋กœ ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์–ด๋””๊ฐ€ ๋ถˆํŽธํ•œ์ง€ ๋น„๋ช…์„ ์ง€๋ฅด๊ณ  ์žˆ๊ตฌ์š”. ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ package.json์—๋Š” ๋ช…์‹œ๋˜์ง€ ์•Š์€ peer-dependency ํŒจํ‚ค์ง€๋“ค์ด ๋น ์ ธ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ package.json์—์„œ ์ž๋™์™„์„ฑ๊ณผ ํ•จ๊ป˜ ๋ฒ„์ „๊นŒ์ง€ ์•Œ์•„์„œ ์ฑ„์›Œ์ฃผ์–ด์„œ ์ ๋‹นํžˆ ์ ์–ด์„œ yarn install์„ ๋‹ค์‹œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ๋‹ต์„ ๊ตฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ฒฐ๊ตญ ์ง์ ‘ ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

๐ŸงŠ pnpm

Untitled

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๊ณ , yarn๊ณผ ๋ณ„ ์ฐจ์ด ์—†์ด corepack์„ ํ†ตํ•ด ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋งŒ ๋ณด๋ฉด์„œ ํ–ˆ๋Š”๋ฐ ๋ฌธ๋“ ๋ณด๋‹ˆ ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์˜์–ด๊ฐ€ ๋ฐ˜, ํ•œ๊ตญ์–ด๊ฐ€ ๋ฐ˜์œผ๋กœ ๋˜์–ด ์žˆ์—ˆ๋„ค์š”. ์œ„ ์‚ฌ์ง„์€ ๊ธ€์„ ์ฝ์ง€ ์•Š๊ณ  ๋ฌด์ž‘์ • ๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๋ฉด์„œ ์ฐ์€ ์‚ฌ์ง„์ธ๋ฐ, Powershell์ด ๋ญ”๊ฐ€ ํ•ดํ•ดํ‚นํ‚น์ด์ด ๋˜๋˜ใ„ด๋Š” ๊ธฐ๋ถ„์ด ๋“ค์–ด์„œ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

Untitled

pnpm install์„ ์‹คํ–‰ํ•˜๋‹ˆ, peer dependency ์ด์Šˆ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค. yarn์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋„ค์š”. ์ด ๋งํฌ์—์„œ ๋‹ต์„ ์ฐพ์•„ pnpm i --shamefully-hoist=true๋กœ ์„ค์น˜ํ•˜๋‹ˆ ์•Œ์•„์„œ ํ”ผ์–ด ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค.

Untitled

Untitled

๐Ÿคจ ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ์š”..?

Untitled

์‚ฌ์‹ค ์ด ์ •๋„ ํ…Œ์ŠคํŠธ๋กœ ์ฐจ์ด๋ฅผ ๋Š๋ผ๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ฒดํ—˜ํ•ด ๋ดค์œผ๋‹ˆ, ๊ทธ๋‚˜๋งˆ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • npm์€ ๋…๋ณด์ ์œผ๋กœ ์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ๋Š๋ฆฌ๊ณ , ๋ฌด๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.
  • yarn์˜ ํŒจํ‚ค์ง€ ์šฉ๋Ÿ‰์ด ์ •๋ง ๊ฐ€๋ฒผ์› ์Šต๋‹ˆ๋‹ค. pnpm์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ์ง€, npm๊ณผ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • pnpm์€ peer-dependency ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ œ๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฑฑ์ •์ด ๋งŽ์•˜๋˜ ESLint๋Š” ์˜์™ธ๋กœ ๊ธˆ๋ฐฉ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค, ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

๋ณด์•ˆ์ด๋ผ๋˜์ง€, ์„ฑ๋Šฅ์ด๋ผ๋˜์ง€ ๋น„๊ต๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ œ ์‹คํ—˜์šฉ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ์˜๋ฏธํ•œ ์ฐจ์ด๋ฅผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ package.json์— ์ •์˜๋œ npm scripts๋ฅผ ๋ฌธ์ œ์—†์ด ์‹คํ–‰ํ•ด ์ค€๋‹ค๋Š” ์ ์ด ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค. javascript์—์„œ typescript๋กœ ์˜ฎ๊ฒจ๊ฐˆ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ์นœ์ ˆํ•˜๋„ค์š”.

๐Ÿ“– Refs.

https://github.com/yarnpkg/yarn/issues/1503
node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry
pnpm does not resolve dependencies
[๋ฒˆ์—ญ] JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋น„๊ต - npm, Yarn ๋˜๋Š” pnpm?
npm, yarn, pnpm ๋น„๊ตํ•ด๋ณด๊ธฐ
์„ค์น˜ํ•˜๊ธฐ | pnpm
Installation
yarn berry(yarn2) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•
yarn berry๋กœ React.js ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ | Kasterra’s Archive
๊ทธ๋ฆฌ๊ณ  ๋ถ€์ŠคํŠธ ์ปจํผ๋Ÿฐ์Šค ํ…Œํฌํ†ก์—์„œ ๋ฉ‹์ง„ ๋ฐœํ‘œ๋ฅผ ํ•ด ์ฃผ์‹  J166 ์ดํœ˜์ฐฌ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™‡

 ยฉ 2024 PrayinforRain. +

๐Ÿ’ก yarn init ๋’ค์˜ -2 ๋ผ๋Š” ํ”Œ๋ž˜๊ทธ๊ฐ€ Zero-Installs๋ฅผ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด ์ฃผ๋Š” ๋ชจ์–‘์ธ๋ฐ์š”, Yarn2 (Berry)์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง• ์ค‘ ํ•˜๋‚˜์ธ node_modules๋ฅผ ๋Œ€์ฒดํ•˜๋Š” PnP ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ์–‘์ž…๋‹ˆ๋‹ค. -2๋ฅผ ๋นผ๊ณ  ์ดˆ๊ธฐํ™”ํ•ด๋ณด๋‹ˆ node_modules ํด๋”๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜๋”๋ผ๊ตฌ์š”. Zero-Installs์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

npm์œผ๋กœ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ boilerplate ํŒŒ์ผ์„ ๋ฐฉ๊ธˆ ์ดˆ๊ธฐํ™”ํ•œ yarn ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•˜๊ณ  yarn install์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Untitled

๋ญ”๊ฐ€ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋Š” ๋“ฏํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ค๊ฐ€ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ํŒจํ‚ค์ง€๋“ค์ด .zip ํŒŒ์ผ๋กœ ์••์ถ•๋˜์–ด ๋“ค์–ด์žˆ๋„ค์š”.

Untitled

Untitled

์Œ, ๊ทธ๋Ÿฐ๋ฐ ์ด ์ƒํƒœ๋กœ ๋ฐ”๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ์–ด๋””๊ฐ€ ๋ถˆํŽธํ•œ์ง€ ๋น„๋ช…์„ ์ง€๋ฅด๊ณ  ์žˆ๊ตฌ์š”. ์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ package.json์—๋Š” ๋ช…์‹œ๋˜์ง€ ์•Š์€ peer-dependency ํŒจํ‚ค์ง€๋“ค์ด ๋น ์ ธ ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ package.json์—์„œ ์ž๋™์™„์„ฑ๊ณผ ํ•จ๊ป˜ ๋ฒ„์ „๊นŒ์ง€ ์•Œ์•„์„œ ์ฑ„์›Œ์ฃผ์–ด์„œ ์ ๋‹นํžˆ ์ ์–ด์„œ yarn install์„ ๋‹ค์‹œ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด์Šˆ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ ๋‹ต์„ ๊ตฌํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ฒฐ๊ตญ ์ง์ ‘ ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

๐ŸงŠ pnpm

Untitled

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๊ณ , yarn๊ณผ ๋ณ„ ์ฐจ์ด ์—†์ด corepack์„ ํ†ตํ•ด ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋งŒ ๋ณด๋ฉด์„œ ํ–ˆ๋Š”๋ฐ ๋ฌธ๋“ ๋ณด๋‹ˆ ๊ณต์‹ ๋ฌธ์„œ๊ฐ€ ์˜์–ด๊ฐ€ ๋ฐ˜, ํ•œ๊ตญ์–ด๊ฐ€ ๋ฐ˜์œผ๋กœ ๋˜์–ด ์žˆ์—ˆ๋„ค์š”. ์œ„ ์‚ฌ์ง„์€ ๊ธ€์„ ์ฝ์ง€ ์•Š๊ณ  ๋ฌด์ž‘์ • ๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๋ฉด์„œ ์ฐ์€ ์‚ฌ์ง„์ธ๋ฐ, Powershell์ด ๋ญ”๊ฐ€ ํ•ดํ•ดํ‚นํ‚น์ด์ด ๋˜๋˜ใ„ด๋Š” ๊ธฐ๋ถ„์ด ๋“ค์–ด์„œ ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.

Untitled

pnpm install์„ ์‹คํ–‰ํ•˜๋‹ˆ, peer dependency ์ด์Šˆ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›Œ์ค๋‹ˆ๋‹ค. yarn์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋„ค์š”. ์ด ๋งํฌ์—์„œ ๋‹ต์„ ์ฐพ์•„ pnpm i --shamefully-hoist=true๋กœ ์„ค์น˜ํ•˜๋‹ˆ ์•Œ์•„์„œ ํ”ผ์–ด ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค.

Untitled

Untitled

๐Ÿคจ ๋ญ๊ฐ€ ๋‹ค๋ฅผ๊นŒ์š”..?

Untitled

์‚ฌ์‹ค ์ด ์ •๋„ ํ…Œ์ŠคํŠธ๋กœ ์ฐจ์ด๋ฅผ ๋Š๋ผ๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ฒดํ—˜ํ•ด ๋ดค์œผ๋‹ˆ, ๊ทธ๋‚˜๋งˆ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • npm์€ ๋…๋ณด์ ์œผ๋กœ ์˜์กด์„ฑ ์„ค์น˜๊ฐ€ ๋Š๋ฆฌ๊ณ , ๋ฌด๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.
  • yarn์˜ ํŒจํ‚ค์ง€ ์šฉ๋Ÿ‰์ด ์ •๋ง ๊ฐ€๋ฒผ์› ์Šต๋‹ˆ๋‹ค. pnpm์€ ํ”„๋กœ์ ํŠธ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ์ง€, npm๊ณผ ๋ˆˆ์— ๋„๋Š” ์ฐจ์ด๋Š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • pnpm์€ peer-dependency ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์›ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ œ๊ฐ€ ๊ฒช์€ ๋ฌธ์ œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ์ผ€์ด์Šค๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ธด ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฑฑ์ •์ด ๋งŽ์•˜๋˜ ESLint๋Š” ์˜์™ธ๋กœ ๊ธˆ๋ฐฉ ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์„ ๊ฒƒ์ด๋‹ค, ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค.

๋ณด์•ˆ์ด๋ผ๋˜์ง€, ์„ฑ๋Šฅ์ด๋ผ๋˜์ง€ ๋น„๊ต๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ์ œ ์‹คํ—˜์šฉ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์œ ์˜๋ฏธํ•œ ์ฐจ์ด๋ฅผ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ package.json์— ์ •์˜๋œ npm scripts๋ฅผ ๋ฌธ์ œ์—†์ด ์‹คํ–‰ํ•ด ์ค€๋‹ค๋Š” ์ ์ด ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค. javascript์—์„œ typescript๋กœ ์˜ฎ๊ฒจ๊ฐˆ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ์นœ์ ˆํ•˜๋„ค์š”.

๐Ÿ“– Refs.

https://github.com/yarnpkg/yarn/issues/1503
node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry
pnpm does not resolve dependencies
[๋ฒˆ์—ญ] JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋น„๊ต - npm, Yarn ๋˜๋Š” pnpm?
npm, yarn, pnpm ๋น„๊ตํ•ด๋ณด๊ธฐ
์„ค์น˜ํ•˜๊ธฐ | pnpm
Installation
yarn berry(yarn2) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฉ๋ฒ•
yarn berry๋กœ React.js ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ | Kasterra’s Archive
๊ทธ๋ฆฌ๊ณ  ๋ถ€์ŠคํŠธ ์ปจํผ๋Ÿฐ์Šค ํ…Œํฌํ†ก์—์„œ ๋ฉ‹์ง„ ๋ฐœํ‘œ๋ฅผ ํ•ด ์ฃผ์‹  J166 ์ดํœ˜์ฐฌ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™‡

+Hugo.
\ No newline at end of file diff --git a/posts/2022/11/redux-vs-recoil/index.html b/posts/2022/11/redux-vs-recoil/index.html index 13552f2..6209d68 100644 --- a/posts/2022/11/redux-vs-recoil/index.html +++ b/posts/2022/11/redux-vs-recoil/index.html @@ -1,7 +1,7 @@ Redux vs Recoil | PrayinForRain.dev -

Redux vs Recoil

Table of Contents

๐Ÿคท TL;DR

  • Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.
  • Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.
  • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž

๐Ÿšช ์„œ๋ก 

์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

โœ… ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์™œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธํ•ด ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋‹ด์€ state๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด Root ์ปดํฌ๋„ŒํŠธ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

export default function App() {
   const [userInfo, setUserInfo] = useState("not logged in");
   return (
     <React.StrictMode>
@@ -75,7 +75,7 @@
     </React.StrictMode>
   );
 }
-

์•„์ง๋„ ๋ฒ„ํ‹ธ ๋งŒ ํ•˜์‹ ๊ฐ€์š”? ๊ทธ๋Ÿผ ๋งˆ์ง€๋ง‰์œผ๋กœ **Service3์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ ChildComponent1์—์„œ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ Service1์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ ChildComponent2๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?**

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ ํŒ€์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ ํšŒ์˜์—์„œ ๊ฑฐ๋ก ๋˜์—ˆ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Redux, Recoil, Context API, Mobx ์ •๋„๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์˜ค๋Š˜์€ ๊ทธ ์ค‘์— Redux์™€ Recoil์— ๋Œ€ํ•ด ๊ฐ€๋ณ๊ฒŒ ์•Œ์•„๋ณด๊ณ  ๋น„๊ตํ•ด ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ž‘๋™ ์›๋ฆฌ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ƒ์˜ ์žฅ๋‹จ์ ์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿฌ Redux

Redux์— ๋Œ€ํ•ด.araboja

Untitled

Redux๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ recoil์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ์— ์ข…์†์ ์ด์ง€๋„ ์•Š๊ณ , mobx๋ณด๋‹ค ์˜ค๋ž˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ์š”? ์•„๋ฌดํŠผ npm trends์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์••๋„์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌ๊ธฐ๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ฌด์ฒ™ ๋งŽ๊ณ , ์Œ.. ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ฌด์ฒ™ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•œ๊ธ€๋กœ ๊ฒ€์ƒ‰ํ•ด๋„ ๋‹น์žฅ ์ด ๊ธ€์„ ์“ธ ์ด์œ ๊ฐ€ ์žˆ๋‚˜ ์‹ถ์„ ์ •๋„๋กœ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ •๋ฆฌ๊ธ€์ด ๋‚˜์˜ค๋„ค์š”.

Untitled

Redux๋Š” Flux ์•„ํ‚คํ…์ณ๋ฅผ ๊ฐœ์„ ํ•œ ๊ตฌ์กฐ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 1) ์ฝ๊ธฐ ์ „์šฉ์ธ ์ƒํƒœ๋ฅผ 2) ํ•˜๋‚˜์˜ store๊ฐ€ 3) ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐฑ์‹ ํ•œ๋‹ค๋Š” ์„ธ ๊ฐ€์ง€ ๋ฉ”์ธ ์ปจ์…‰์ด ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”. ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์œ„ ์‚ฌ์ง„์˜ ์ถœ์ฒ˜ ๋งํฌ์— ์ž˜ ์„ค๋ช…์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค

npm i redux react-redux @reduxjs/toolkit
+

์•„์ง๋„ ๋ฒ„ํ‹ธ ๋งŒ ํ•˜์‹ ๊ฐ€์š”? ๊ทธ๋Ÿผ ๋งˆ์ง€๋ง‰์œผ๋กœ **Service3์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ ChildComponent1์—์„œ ๋ณ€๊ฒฝํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ Service1์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์ธ ChildComponent2๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?**

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ ํŒ€์€ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ ํšŒ์˜์—์„œ ๊ฑฐ๋ก ๋˜์—ˆ๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Redux, Recoil, Context API, Mobx ์ •๋„๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ์˜ค๋Š˜์€ ๊ทธ ์ค‘์— Redux์™€ Recoil์— ๋Œ€ํ•ด ๊ฐ€๋ณ๊ฒŒ ์•Œ์•„๋ณด๊ณ  ๋น„๊ตํ•ด ๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์ž‘๋™ ์›๋ฆฌ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ƒ์˜ ์žฅ๋‹จ์ ์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿฌ Redux

Redux์— ๋Œ€ํ•ด.araboja

Untitled

Redux๋Š” ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ recoil์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ์— ์ข…์†์ ์ด์ง€๋„ ์•Š๊ณ , mobx๋ณด๋‹ค ์˜ค๋ž˜๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ์š”? ์•„๋ฌดํŠผ npm trends์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์••๋„์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ ํฌ๊ธฐ๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ฌด์ฒ™ ๋งŽ๊ณ , ์Œ.. ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ฌด์ฒ™ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•œ๊ธ€๋กœ ๊ฒ€์ƒ‰ํ•ด๋„ ๋‹น์žฅ ์ด ๊ธ€์„ ์“ธ ์ด์œ ๊ฐ€ ์žˆ๋‚˜ ์‹ถ์„ ์ •๋„๋กœ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ •๋ฆฌ๊ธ€์ด ๋‚˜์˜ค๋„ค์š”.

Untitled

Redux๋Š” Flux ์•„ํ‚คํ…์ณ๋ฅผ ๊ฐœ์„ ํ•œ ๊ตฌ์กฐ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 1) ์ฝ๊ธฐ ์ „์šฉ์ธ ์ƒํƒœ๋ฅผ 2) ํ•˜๋‚˜์˜ store๊ฐ€ 3) ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐฑ์‹ ํ•œ๋‹ค๋Š” ์„ธ ๊ฐ€์ง€ ๋ฉ”์ธ ์ปจ์…‰์ด ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”. ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ ์œ„ ์‚ฌ์ง„์˜ ์ถœ์ฒ˜ ๋งํฌ์— ์ž˜ ์„ค๋ช…์ด ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค

npm i redux react-redux @reduxjs/toolkit
 

์šฐ์„  ์„ธ ๊ฐ€์ง€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @reduxjs/toolkit ์ด๋ผ๋Š” ํŒจํ‚ค์ง€๋Š” redux๋ฅผ ์กฐ๊ธˆ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ธ๋ฐ์š”, ๊ฐœ์ธ์ ์œผ๋กœ RTK ์—†์ด ๋ฆฌ๋•์Šค๋ฅผ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๊ธฐ๊ฐ€ ๊ต‰์žฅํžˆ ์–ด๋ ค์› ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์œผ๋กœ ๊ธธ์„ ํ‹€์—ˆ์Šต๋‹ˆ๋‹ค.

// count.ts
 import { createSlice, PayloadAction } from "@reduxjs/toolkit";
 
@@ -165,7 +165,7 @@
 	...
 	);
 }
-

์‹ค์ œ ์‚ฌ์šฉ์€ ์œ„์™€ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐํ•  ์ƒํƒœ๋Š” useSelector๋กœ, action์€ useDispatch๋ฅผ ์ด์šฉํ•ด ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” action ๋ฉ”์†Œ๋“œ๋ฅผ importํ•ด์™”๋Š”๋ฐ ๊ทธ๊ฑธ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  useDispatch๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์กฐ๊ธˆ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด RootState๋ผ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. store.ts ์ฝ”๋“œ์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์•„๋ฌด๋ฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋  ๋งŒํผ ์ถ”์ƒํ™”๊ฐ€ ๋˜์–ด์žˆ๋Š” ํƒ€์ž…์ธ๋ฐ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋•์Šค.gif

์•„์ฃผ ๋ฌด์Œฉ๊ธด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Redux ์“ฐ๋‚˜์š”?

์žฅ์ 

  • ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๊ธ€์—๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Redux Devtools๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊น…์„ ์ง€์›ํ•ด ์ค€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • (Recoil๊ณผ ๋น„๊ตํ•ด์„œ) ์•ˆ์ •์ ์ด๊ณ , ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋งŒ ์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด์š”.

๋‹จ์ 

  • reducer, store, type ๋“ฑ๋“ฑ ์ƒํƒœ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๊น๋‹ˆ๋‹ค.
  • ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ์œ„์˜ ๋‘ ๋ฌธ์ œ์ ์œผ๋กœ ์ธํ•ด ์ง„์ž…์žฅ๋ฒฝ์ด ๊ต‰์žฅํžˆ ๋†’์•˜์Šต๋‹ˆ๋‹ค.

Redux์— ๋Œ€ํ•œ ์ฒซ ์ธ์ƒ์€ ๊ต‰์žฅํžˆ ๋ถˆ์นœ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฐ ๊ฒƒ์€ ์ข‹์€๋ฐ, ์ง„์งœ ๋„ˆ๋ฌด ๋Œ€๋ฐ• ํฌ๋‹ค๋ณด๋‹ˆ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ์„œ๋กœ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ €๋ฅผ ์ด๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ €๋„ ๋Œ€ํ•™๊ต ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ์  ๋•Œ๋ฌธ์— Redux๋ฅผ ํฌ๊ธฐํ•˜๊ณ  props๋ฅผ ๋งˆ๊ตฌ ๋‚ด๋ ธ๋‹ค ์˜ฌ๋ ธ๋‹ค ํ•˜๋Š” ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ธฐ๋„ ํ–ˆ๊ตฌ์š”.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•  ์ค„ ์•„๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฌ๋‹ˆ๊นŒ์š”. ๊ธฐํšŒ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ํ•ด ๋ณด๋ฉด, ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์•„์ง Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋“ฃ๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๋˜ ์ฃผ๋ณ€์˜ Redux๋งจ๋“ค์—๊ฒŒ ๋ฌผ์–ด๋ณด๋ฉด ๋ช‡ ๋ฒˆ ๊ฒช์–ด๋ณด๋ฉด ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์ง„๋‹ค๊ณ  ํ•˜๋‹ˆ, ์ฒซ ๊ณ ๋น„๋ฅผ ๋„˜๊ธฐ๊ณ  ๋‚˜๋ฉด ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ.. ๊ทธ๋Ÿฐ ๊ธฐ๋Œ€๋ฅผ ํ•ด ๋ด…๋‹ˆ๋‹ค.

๐Ÿ”‹ Recoil

๋ฆฌ-ํ•˜(๋ฆฌ์ฝ”์ผ ํ•˜์ด๋ผ๋Š” ๋œป)

์ด๋ฒˆ์—” Recoil์„ ์ฒดํ—˜ํ•ด ๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. Recoil๋กœ ๋งํ•  ๊ฒƒ ๊ฐ™์œผ๋ฉด ๋ฆฌ์•กํŠธ๋ฅผ ๋งŒ๋“  ํŽ˜์ด์Šค๋ถ์ด ์ง์ ‘ ๊ณต๊ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ React๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๋ฆฌ์•กํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ์„ธ๊ณ„์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๋ถ„๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด, React๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋Š” React์—์„œ ์‚ฌ์šฉํ•˜๊ณ , VanilaJS๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋Š” VanilaJS์—์„œ๋ฐ–์— ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋Š” ๋ถ„๋“ค์ด ์žˆ์ฃ .

Untitled

์ด๋Ÿฐ ๊ฑฐ๋ฆฌ๊ฐ๋•Œ๋ฌธ์— ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ โ€˜React์Šค๋Ÿฌ์šดโ€™ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์‚ฌ์ง„์€ ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์บ”๋ฒ„์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ konva์˜ ๋ฆฌ์•กํŠธ ๋ฒ„์ „, react-konva ์ฝ”๋“œ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ด ์ด์•ผ๊ธฐ๋ฅผ ์™œ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? Recoil์€, ์˜ค์ง React๋งŒ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ ์„ ๊ฐ€์žฅ ํฐ ํŠน์ง•์œผ๋กœ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. ๊ทธ ์™ธ์—๋„ atom ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ์–ด์ฉŒ๊ตฌ.. ํ•˜๋Š” ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ์ด์•ผ๊ธฐ๋„ค์š”.

์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค

npm i recoil
+

์‹ค์ œ ์‚ฌ์šฉ์€ ์œ„์™€ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐํ•  ์ƒํƒœ๋Š” useSelector๋กœ, action์€ useDispatch๋ฅผ ์ด์šฉํ•ด ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” action ๋ฉ”์†Œ๋“œ๋ฅผ importํ•ด์™”๋Š”๋ฐ ๊ทธ๊ฑธ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  useDispatch๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์กฐ๊ธˆ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด RootState๋ผ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. store.ts ์ฝ”๋“œ์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์•„๋ฌด๋ฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋  ๋งŒํผ ์ถ”์ƒํ™”๊ฐ€ ๋˜์–ด์žˆ๋Š” ํƒ€์ž…์ธ๋ฐ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•ด์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ์€ ์กฐ๊ธˆ ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

๋ฆฌ๋•์Šค.gif

์•„์ฃผ ๋ฌด์Œฉ๊ธด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Redux ์“ฐ๋‚˜์š”?

์žฅ์ 

  • ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งค์šฐ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ๊ธ€์—๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Redux Devtools๋ฅผ ํ†ตํ•ด ๋””๋ฒ„๊น…์„ ์ง€์›ํ•ด ์ค€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • (Recoil๊ณผ ๋น„๊ตํ•ด์„œ) ์•ˆ์ •์ ์ด๊ณ , ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋งŒ ์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด์š”.

๋‹จ์ 

  • reducer, store, type ๋“ฑ๋“ฑ ์ƒํƒœ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๊น๋‹ˆ๋‹ค.
  • ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ์œ„์˜ ๋‘ ๋ฌธ์ œ์ ์œผ๋กœ ์ธํ•ด ์ง„์ž…์žฅ๋ฒฝ์ด ๊ต‰์žฅํžˆ ๋†’์•˜์Šต๋‹ˆ๋‹ค.

Redux์— ๋Œ€ํ•œ ์ฒซ ์ธ์ƒ์€ ๊ต‰์žฅํžˆ ๋ถˆ์นœ์ ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฐ ๊ฒƒ์€ ์ข‹์€๋ฐ, ์ง„์งœ ๋„ˆ๋ฌด ๋Œ€๋ฐ• ํฌ๋‹ค๋ณด๋‹ˆ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์ด ์„œ๋กœ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ €๋ฅผ ์ด๋„๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ €๋„ ๋Œ€ํ•™๊ต ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์ด๋Ÿฐ ์  ๋•Œ๋ฌธ์— Redux๋ฅผ ํฌ๊ธฐํ•˜๊ณ  props๋ฅผ ๋งˆ๊ตฌ ๋‚ด๋ ธ๋‹ค ์˜ฌ๋ ธ๋‹ค ํ•˜๋Š” ์›์‹œ์ ์ธ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ธฐ๋„ ํ–ˆ๊ตฌ์š”.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Redux๋ฅผ ์‚ฌ์šฉํ•  ์ค„ ์•„๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฌ๋‹ˆ๊นŒ์š”. ๊ธฐํšŒ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ํ•ด ๋ณด๋ฉด, ํฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์•„์ง Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋Š” ๋‹ต๋ณ€์„ ๋“ฃ๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๋˜ ์ฃผ๋ณ€์˜ Redux๋งจ๋“ค์—๊ฒŒ ๋ฌผ์–ด๋ณด๋ฉด ๋ช‡ ๋ฒˆ ๊ฒช์–ด๋ณด๋ฉด ๊ธˆ๋ฐฉ ์ต์ˆ™ํ•ด์ง„๋‹ค๊ณ  ํ•˜๋‹ˆ, ์ฒซ ๊ณ ๋น„๋ฅผ ๋„˜๊ธฐ๊ณ  ๋‚˜๋ฉด ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ.. ๊ทธ๋Ÿฐ ๊ธฐ๋Œ€๋ฅผ ํ•ด ๋ด…๋‹ˆ๋‹ค.

๐Ÿ”‹ Recoil

๋ฆฌ-ํ•˜(๋ฆฌ์ฝ”์ผ ํ•˜์ด๋ผ๋Š” ๋œป)

์ด๋ฒˆ์—” Recoil์„ ์ฒดํ—˜ํ•ด ๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. Recoil๋กœ ๋งํ•  ๊ฒƒ ๊ฐ™์œผ๋ฉด ๋ฆฌ์•กํŠธ๋ฅผ ๋งŒ๋“  ํŽ˜์ด์Šค๋ถ์ด ์ง์ ‘ ๊ณต๊ฐœํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ React๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๋ฆฌ์•กํŠธ์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ์„ธ๊ณ„์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๋ถ„๋“ค์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด, React๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋Š” React์—์„œ ์‚ฌ์šฉํ•˜๊ณ , VanilaJS๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋Š” VanilaJS์—์„œ๋ฐ–์— ์“ธ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋Š” ๋ถ„๋“ค์ด ์žˆ์ฃ .

Untitled

์ด๋Ÿฐ ๊ฑฐ๋ฆฌ๊ฐ๋•Œ๋ฌธ์— ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง์ ‘ โ€˜React์Šค๋Ÿฌ์šดโ€™ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ ์‚ฌ์ง„์€ ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ ์บ”๋ฒ„์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ konva์˜ ๋ฆฌ์•กํŠธ ๋ฒ„์ „, react-konva ์ฝ”๋“œ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์ด ์ด์•ผ๊ธฐ๋ฅผ ์™œ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? Recoil์€, ์˜ค์ง React๋งŒ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ React ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ ์„ ๊ฐ€์žฅ ํฐ ํŠน์ง•์œผ๋กœ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”. ๊ทธ ์™ธ์—๋„ atom ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌ ์–ด์ฉŒ๊ตฌ.. ํ•˜๋Š” ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ ํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ์ด์•ผ๊ธฐ๋„ค์š”.

์‚ฌ์šฉํ•ด ๋ด…์‹œ๋‹ค

npm i recoil
 

์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค. redux์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ณ„๋‹ค๋ฅธ ์„ค์น˜๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๊ธด ํ•œ๋ฐ, ํ .. ๋ณ„ ์ƒ๊ฐ์€ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// atom.ts
 import { atom } from "recoil";
 
@@ -208,10 +208,10 @@
 	...
 	);
 }
-

Recoil์€ useState ํ›…๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. import๋งŒ ์ž˜ ํ•ด์คฌ๋‹ค๋ฉด, useRecoilState๋ฅผ ํ†ตํ•ด atom์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค ์„ ์–ธํ•˜๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Recoil์˜ ๊ฐ•์ ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ๋ถ€๋ถ„์ด๋„ค์š”. ์ฐธ์กฐ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” useRecoilValue, ํ• ๋‹น๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” useSetRecoilState ๋ฅผ ํ†ตํ•ด ํ•œ ์ชฝ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์ฝ”์ผ.gif

๊ฒฐ๊ณผ๋ฌผ์€ Redux์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Recoil ์“ฐ๋‚˜์š”?

์žฅ์ 

  • React์Šค๋Ÿฌ์›€
  • atom์˜ ์„ ์–ธ์ด ๊ฐ„๋‹จํ•˜๋‹ค

๋‹จ์ 

  • ์•„์ง ์‹คํ—˜์  ๊ธฐ๋Šฅ(experimental feature)์ด๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ
  • React์— ์ข…์†์ ์ด๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์š”์•ฝ๋งŒ ๋ด๋„ ๋Š๊ปด์ง€์ง€๋งŒ Recoil์€ ๊ทธ๋ ‡๊ฒŒ ์•ˆ์ •์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ์„  ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ facebookexperimental์— ์žˆ๊ณ , issue์— ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ๋Œ€ํ•œ ๋ ˆํฌํŠธ๊ฐ€ ๊ฝค ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ ๋•Œ๋ฌธ์— Recoil์€ ์•„์ง๊นŒ์ง€๋„ โ€˜๋ฆฌ์•กํŠธ์Šค๋Ÿฝ๋‹คโ€™๋Š” ์••๋„์ ์ธ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ ๋„ ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ์„ฑ์ ์„ ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ โ€˜์‹คํ—˜์  ๊ธฐ๋Šฅโ€™์— ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฏฟ๊ณ  ๋งก๊ธธ ์ˆ˜ ์žˆ์„๊นŒ์š”? React๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค ๋ณด๋‹ˆ React ์ƒํƒœ๊ณ„์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋„ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ์‹œ๋ฉด ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•˜์ง€๋งŒ Recoil์€ ๋ถ„๋ช… ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ React๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด Recoil์˜ ๋งค๋ ฅ์„ ๋ฟŒ๋ฆฌ์น˜๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด Recoil์€ React์Šค๋Ÿฌ์šฐ๋‹ˆ๊นŒ์š”. useState๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ์™„์ „ ๋˜‘๊ฐ™์ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋‹ˆ, ์ด ํŠน์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ์„ ํƒํ•  ์ด์œ ๋Š” ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

โ“ ๊ทธ๋ž˜์„œ ๋ญ ์“ฐ๋‚˜์š”?

Untitled

Redux์™€ Recoil์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ, ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋” ๋ณต์žกํ•ด์ง€๋„ค์š”. ํ•˜์ง€๋งŒ ์–ด๋Š ํ•œ ์ชฝ์ด โ€˜์ข‹๋‹คโ€™๊ณ  ๊ฒฐ๋ก ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๊ณ  ํŒฅ๋ถ•์„ ๋จน์„์ง€ ์Šˆ๋ถ•์„ ๋จน์„์ง€, ๊ทธ ๋‚ ์˜ ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ทธ๋Ÿฐ ์„ ํƒ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ €๋Š” ํŒฅ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ฅธ๋‹ค๋ฉด ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ €๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ ํ† ์ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ‘์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋“ ์š”. ๋ฐ˜๋ฉด ์ปค๋‹ค๋ž€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Redux๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋‚ ์ด ์˜ฌ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . ๋ง๋ถ™์ด์ž๋ฉด ์ปดํผ๋‹ˆ๋ฐ์ด ๋•Œ ์–ด๋–ค ๊ธฐ์—…์—์„œ๋Š” Redux์™€ Recoil์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋‹ต๋ณ€์„ ์ฃผ์‹œ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“– Refs.

TypeScript and redux tool kit , createSlice: Assignment to property of function parameter ‘state’
Getting Started with Redux
๋งค๊ฐœ๋ณ€์ˆ˜ ์žฌํ• ๋‹น์„ ์ง€์–‘ํ•˜์ž(no-param-reassign)
Redux Toolkit with Typescript: How to Get Started
RecoilRoot | Recoil
React์Šค๋Ÿฌ์šด ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Recoil์„ ์•Œ์•„๋ณด์ž
Recoil์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ
๊ทธ๋ฆฌ๊ณ  ๋ถ€์ŠคํŠธ์บ ํ”„ ์ปจํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด Recoil์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์‹  J039 ๊น€์„ฑ์€ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‡

 ยฉ 2024 PrayinforRain. +

Recoil์€ useState ํ›…๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๋ฒ•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. import๋งŒ ์ž˜ ํ•ด์คฌ๋‹ค๋ฉด, useRecoilState๋ฅผ ํ†ตํ•ด atom์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค ์„ ์–ธํ•˜๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Recoil์˜ ๊ฐ•์ ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ๋ถ€๋ถ„์ด๋„ค์š”. ์ฐธ์กฐ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” useRecoilValue, ํ• ๋‹น๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” useSetRecoilState ๋ฅผ ํ†ตํ•ด ํ•œ ์ชฝ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌ์ฝ”์ผ.gif

๊ฒฐ๊ณผ๋ฌผ์€ Redux์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Recoil ์“ฐ๋‚˜์š”?

์žฅ์ 

  • React์Šค๋Ÿฌ์›€
  • atom์˜ ์„ ์–ธ์ด ๊ฐ„๋‹จํ•˜๋‹ค

๋‹จ์ 

  • ์•„์ง ์‹คํ—˜์  ๊ธฐ๋Šฅ(experimental feature)์ด๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ
  • React์— ์ข…์†์ ์ด๋‹ค.

๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์š”์•ฝ๋งŒ ๋ด๋„ ๋Š๊ปด์ง€์ง€๋งŒ Recoil์€ ๊ทธ๋ ‡๊ฒŒ ์•ˆ์ •์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ์„  ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ facebookexperimental์— ์žˆ๊ณ , issue์— ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ๋Œ€ํ•œ ๋ ˆํฌํŠธ๊ฐ€ ๊ฝค ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ ๋•Œ๋ฌธ์— Recoil์€ ์•„์ง๊นŒ์ง€๋„ โ€˜๋ฆฌ์•กํŠธ์Šค๋Ÿฝ๋‹คโ€™๋Š” ์••๋„์ ์ธ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ ๋„ ๊ทธ๋ ‡๊ฒŒ ์ข‹์€ ์„ฑ์ ์„ ๋‚ด์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ โ€˜์‹คํ—˜์  ๊ธฐ๋Šฅโ€™์— ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๋ฏฟ๊ณ  ๋งก๊ธธ ์ˆ˜ ์žˆ์„๊นŒ์š”? React๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค ๋ณด๋‹ˆ React ์ƒํƒœ๊ณ„์—์„œ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ๋„ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋„ค์š”. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์œผ์‹œ๋ฉด ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•˜์ง€๋งŒ Recoil์€ ๋ถ„๋ช… ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ React๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด Recoil์˜ ๋งค๋ ฅ์„ ๋ฟŒ๋ฆฌ์น˜๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด Recoil์€ React์Šค๋Ÿฌ์šฐ๋‹ˆ๊นŒ์š”. useState๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ์™„์ „ ๋˜‘๊ฐ™์ด ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋‹ˆ, ์ด ํŠน์„ฑ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ์„ ํƒํ•  ์ด์œ ๋Š” ์ถฉ๋ถ„ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

โ“ ๊ทธ๋ž˜์„œ ๋ญ ์“ฐ๋‚˜์š”?

Untitled

Redux์™€ Recoil์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๊ณต๋ถ€ํ–ˆ๋Š”๋ฐ, ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ ๋” ๋ณต์žกํ•ด์ง€๋„ค์š”. ํ•˜์ง€๋งŒ ์–ด๋Š ํ•œ ์ชฝ์ด โ€˜์ข‹๋‹คโ€™๊ณ  ๊ฒฐ๋ก ์ง€์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๊ณ  ํŒฅ๋ถ•์„ ๋จน์„์ง€ ์Šˆ๋ถ•์„ ๋จน์„์ง€, ๊ทธ ๋‚ ์˜ ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ทธ๋Ÿฐ ์„ ํƒ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ €๋Š” ํŒฅ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ณ ๋ฅธ๋‹ค๋ฉด ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ €๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐ์ •ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ ํ† ์ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ‘์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋“ ์š”. ๋ฐ˜๋ฉด ์ปค๋‹ค๋ž€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด Redux๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋‚ ์ด ์˜ฌ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . ๋ง๋ถ™์ด์ž๋ฉด ์ปดํผ๋‹ˆ๋ฐ์ด ๋•Œ ์–ด๋–ค ๊ธฐ์—…์—์„œ๋Š” Redux์™€ Recoil์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋‹ต๋ณ€์„ ์ฃผ์‹œ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“– Refs.

TypeScript and redux tool kit , createSlice: Assignment to property of function parameter ‘state’
Getting Started with Redux
๋งค๊ฐœ๋ณ€์ˆ˜ ์žฌํ• ๋‹น์„ ์ง€์–‘ํ•˜์ž(no-param-reassign)
Redux Toolkit with Typescript: How to Get Started
RecoilRoot | Recoil
React์Šค๋Ÿฌ์šด ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, Recoil์„ ์•Œ์•„๋ณด์ž
Recoil์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฌธ์ œ
๊ทธ๋ฆฌ๊ณ  ๋ถ€์ŠคํŠธ์บ ํ”„ ์ปจํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด Recoil์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์‹  J039 ๊น€์„ฑ์€ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ์˜ ์ธ์‚ฌ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‡

+Hugo.
\ No newline at end of file diff --git a/posts/2022/12/finishing-moheyum/index.html b/posts/2022/12/finishing-moheyum/index.html index de124b1..d81eb66 100644 --- a/posts/2022/12/finishing-moheyum/index.html +++ b/posts/2022/12/finishing-moheyum/index.html @@ -1,11 +1,11 @@ ๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  | PrayinForRain.dev -

๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

Table of Contents

ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. [์›๋ณธ ๋งํฌ]

image

๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค..

๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” ๋ชจํ—ค์œฐ์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. [์—ฌ๊ธฐ]์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.

์˜ค๋žœ๋งŒ์— ์ง„์ง€ํ•œ ๊ธ€์„ ์จ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ฃผ์ œ๋Š” ๋ชจํ—ค์œฐ ํ˜‘์—… ํšŒ๊ณ  ์ •๋„๊ฐ€ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ฒซ ํ˜‘์—…์ด๋ผ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด ๋งŽ์•˜์–ด์„œ ๋ฌธ์ œ์ ๋งŒ์„ ์ ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์€ ์ ˆ๋Œ€ ์‹คํŒจํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ชจํ—ค์œฐ์€ ์œ ์ €์˜ ๊ฐ€์ž… โ†’ ์„œ๋น„์Šค ์ด์šฉ โ†’ ํƒˆํ‡ด๊นŒ์ง€ ์™„์ „ํ•œ ์œ ์ € ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฉฐ, ์ปจํ…Œ์ด๋„ˆํ™”๋ฅผ ํ†ตํ•œ ๋ฌด์ค‘๋‹จ ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜๊นŒ์ง€ ์šฉ์ดํ•˜๊ฒŒ ํ•œ ์™„๊ฒฐ์„ฑ์„ ๊ฐ–์ถ˜ ํ”„๋กœ์ ํŠธ์ด๋‹ค. ๋ฌผ๋ก  ํŒ”์€ ์•ˆ์œผ๋กœ ๊ตฝ๋Š”๋‹ค๊ณ  ๋‚ด ์ƒˆ๋ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋Š๋‚„ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ’€์Šคํƒ ๊ฒฝํ—˜์„ ์œ„ํ•œ ํ•„๋“œ ์Šค์™‘

์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ ์ด ์•„๋ž˜๋กœ๋Š” ์ญ‰ ์ž˜๋ชปํ•œ ๋ถ€๋ถ„๋งŒ ์žˆ๋Š”๋ฐ, ์–˜๋Š” ๊ธธ๊ธฐ๋„ ํ•˜๊ณ .. ์žฅ์ ๋„ ์ ํ˜€ ์žˆ๋Š”๊ฒŒ ์กฐ๊ธˆ ์–ด์ƒ‰ํ•ด์„œ ์ ‘์—ˆ๋‹ค.

ํŒ€ํ”„๋กœ์ ํŠธ์— ์•ž์„œ ๋ถ€์ŠคํŠธ์บ ํ”„ ์šด์˜์ง„ ๋ถ„๋“ค์€ ‘ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ ๋ถ„์•ผ๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜๋Š” ์žˆ์–ด๋„ ๋ถ€์ŠคํŠธ์บ ํ”„๋Š” ํ’€์Šคํƒ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค’๋ผ๊ณ  ๋ช‡ ๋ฒˆ์”ฉ ๊ฐ•์กฐํ•˜์…จ๋‹ค. ๋‚˜ ์—ญ์‹œ ์•ž์œผ๋กœ ๋ฐฑ์—”๋“œ ์ผ์„ ํ•  ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๋‚ด๊ฐ€ ์ž์˜์ ์œผ๋กœ ๋ฐฑ์—”๋“œ ์ชฝ์˜ ์ž‘์—…์„ ํ•  ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ง€๊ธˆ ๊ธฐํšŒ๊ฐ€ ์™”์„ ๋•Œ ์ตœ๋Œ€ํ•œ ๊ฒฝํ—˜ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํŒ€์›๋“ค๋„ ์–ด๋Š์ •๋„ ๊ณต๊ฐํ•œ ๋“ฏ ํ–ˆ๊ณ , ๊ณ ๋ฏผ ๋์— ์šฐ๋ฆฌ๋Š” ๋งค ์ฃผ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์—์„œ ํ•œ ๋ช…์”ฉ์„ ๊ตํ™˜ํ•˜์ž๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ–ˆ๋‹ค.

๋” ๋ณด๊ธฐ

Pros.

ํ”„๋ก ํŠธ์—”๋“œ / ๋ฐฑ์—”๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ๋‹ค. ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค๋…€์˜ค๋‹ˆ ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์–ผ์ฒ™ ์—†๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋ฐฑ์—”๋“œ ํŒ€์›๋“ค์—๊ฒŒ ํ•ด์™”๋Š”์ง€ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๊ทธ ๋ฌธ์ œ๋ฅผ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๊ณ , ์‹ฌ์ง€์–ด ๋ฉ˜ํ† ๋‹˜์ด ๋ฐฑ์—”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ฐฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋ง์”€ํ•˜์…จ์Œ์—๋„ ์šฐ๋ฆฌ๋Š” API๊ฐ€ ๋ณด๋‚ด์ค€ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์ˆ˜์ค€์˜ ๊ตฌ์กฐ๊ฐ€ ๊ณ„์†๋˜์—ˆ๋‹ค.

ํŒ€์›์ด ๋ถ„์•ผ๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ๋ชจ๋“  ์ฝ”๋“œ์— ์ฑ…์ž„์ด ์ƒ๊ธด๋‹ค.

๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋‚ด ์†์„ ๊ฑฐ์ณ ๊ฐ”๋‹ค๋Š” ๊ฒƒ์€, ๋‚ด๊ฐ€ ๋ชจ๋“  ์ฝ”๋“œ์— ์ผ๋ถ€๋ถ„ ์ฑ…์ž„์„ ๊ฐ–๊ฒŒ ๋จ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•™์Šต ๊ณต์œ ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.

๋ฐฑ์—”๋“œ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ˆˆ์— ์ต๋‹ค ๋ณด๋‹ˆ, ์„œ๋กœ๊ฐ€ ์“ด ํ•™์Šต ์ •๋ฆฌ๋ฅผ ์ฝ์„ ๋•Œ ๋‚œ์ด๋„๊ฐ€ ๋ฌด์ฒ™ ๋‚ด๋ ค๊ฐ”๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์˜จ์ „ํžˆ ์ดํ•ดํ•  ์ˆ˜๋Š” ์—†์—ˆ๋‹ค.

Cons.

์ฝ”๋“œ ํ’ˆ์งˆ ์ €ํ•˜๊ฐ€ ์ผ์–ด๋‚ฌ๋‹ค.

์ด๋Š” ๋’ค์—์„œ ์–ธ๊ธ‰ํ•  ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ๊ธฐ๋„ ํ•˜์ง€๋งŒ, PR ๊ฒ€ํ† ๊ฐ€ ์›ํ™œํžˆ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๋‹ค. ์ด ๋ถ€๋ถ„์„ ์šฐ๋ คํ•ด์„œ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋’€์ง€๋งŒ ๋ฐ”์œ ์ผ์ • ์†์—์„œ ๊ทธ๋งˆ์ €๋„ ์ง€์ผœ์ง€์ง€ ์•Š์•˜๋‹ค. ์ฝ”๋“œ ์ผ๊ด€์„ฑ์€ ๋ฌผ๋ก ์ด๊ณ  ์•ˆํ‹ฐํŒจํ„ด์ด ๊ณณ๊ณณ์— ์ˆจ์–ด ์žˆ์—ˆ๋‹ค. ๊ฒฐ๊ตญ ํ”„๋ก ํŠธ ๋ฐฑ ์–‘ ์ชฝ์ด ์–ด๋งˆ์–ด๋งˆํ•œ ์–‘์˜ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•ด์•ผ ํ–ˆ๋‹ค. ์ผ์„ ๋‘ ๋ฒˆ ์”ฉ ํ•œ ์…ˆ์ด๋‹ค. ์„œ๋กœ๊ฐ€ ์„œ๋กœ์—๊ฒŒ ์ฃ„์†กํ–ˆ๋‹ค..

‘๋‚จ์˜ ์˜์—ญ’์ด๋ผ๋Š” ๋ถ€๋‹ด์ด ์ƒ๊ธด๋‹ค.(๋‚ด ๊ธฐ์ค€)

๋‚ด๊ฐ€ ํ”„๋ก ํŠธ์—์„œ ๋ฐฑ ํŒ€์›์„ ๋ฐ›์•˜์„ ๋•Œ์—๋Š” ๋‚ด๊ฐ€ ๋ญ๋“  ๋„์™€๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๋ถ„์€ ๋†€๋ž๊ฒŒ๋„ ์›”์š”์ผ ๋ฐ˜๋‚˜์ ˆ ๋™์•ˆ ์‚ฌ๋ผ์กŒ๋‹ค๊ฐ€ ๋ฆฌ์•กํŠธ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋˜์–ด ๋Œ์•„์˜ค์…จ๋‹ค. ๋ฐ˜๋ฉด์— ๋‚ด๊ฐ€ ๋ฐฑ์—”๋“œ๋กœ ๊ฐ”์„ ๋•Œ์—๋Š” ‘๋‚ด๊ฐ€ ์ด๊ฑธ ์ด๋ ‡๊ฒŒ ์งฐ๋‹ค๊ฐ€ ์ž˜๋ชป ๋˜์–ด์„œ ๋ฐฑ์—”๋“œ ๋ถ„๋“ค์ด ๊ณ ์ƒํ•˜์‹œ๋ฉด ์–ด์ฉŒ์ง€?’ ํ•˜๋Š” ๊ณ ๋ฏผ์ด ํ•˜๋ฃจ์—๋„ ๋ช‡ ๋ฒˆ์”ฉ ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ฒฐ๊ณผ๋ฌผ์ด ์ข‹์ง€๋„ ๋ชปํ–ˆ๊ณ  ์–‘๋„ ๋งŽ์ด ์•Š์•˜๋‹ค. ์กฐ๊ธˆ ๋” ์ ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ํ•˜๋Š” ์•„์‰ฌ์›€์ด ๋‚จ๋Š”๋‹ค.

๊ธฐํš ๋‹จ๊ณ„์—์„œ์˜ ๋ฌธ์ œ

๊ธฐํš์ž์™€ ๋””์ž์ด๋„ˆ์˜ ์†Œ์ค‘ํ•จ์„ ์ ˆ์‹คํ•˜๊ฒŒ ๋Š๋‚€ ์‹œ๊ฐ„๋“ค์ด์—ˆ๋‹ค.

๋ฐฑ๋กœ๊ทธ ์ž์ฒด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜์ง€ ์•Š์•˜๋‹ค.

image

๋”ด์†Œ๋ฆฐ๋ฐ, ์ด๊ฑฐ closed ๋๋Š”๋ฐ opened๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฒ„๊ทธ ์งœ์ฆ๋‚œ๋‹ค

๋”ด์†Œ๋ฆฐ๋ฐ, ์ด๊ฑฐ closed ๋๋Š”๋ฐ opened๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฒ„๊ทธ ์งœ์ฆ๋‚œ๋‹ค +๋‚˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๊ณตํ•™ ์ˆ˜์—…์„ ์ •๋ง ์žฌ๋ฏธ์žˆ๊ฒŒ ๋“ค์—ˆ๋‹ค. ์‹ค์Šต์ด๋ผ๊ณค ์ „ํ˜€ ์—†๋˜ ์šฐ๋ฆฌ ํ•™๊ต์—์„œ ์œ ์ผํ•˜๊ฒŒ ์‹ค์ œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ด๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ๊ต์ˆ˜๋‹˜์ด (์•ฝ๊ฐ„์€ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ) ๋น„๊ฐœ๋ฐœ์ž ๊ณ ๊ฐ ์ž…์žฅ์—์„œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ์‹œ๋ฉด ๊ทธ๊ฒƒ๋“ค์„ ์šฐ๋ฆฌ๋ผ๋ฆฌ ๋ฐฑ๋กœ๊ทธ ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ผ์ •์„ ๊ณ„ํšํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ์‹์ด์—ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ˆ˜์—…์„ ๋“ค์œผ๋ฉฐ ๋ฐฑ๋กœ๊ทธ๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋ฉด ๋˜๋Š”์ง€ ๋„ˆ๋ฌด ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ชจํ—ค์œฐ์˜ ๋ฐฑ๋กœ๊ทธ๋Š” ์ค‘๊ตฌ๋‚œ๋ฐฉ ๊ทธ ์ž์ฒด์˜€๋‹ค. ์–ด๋–ค ๊ฒƒ์€ ์œ ์ € ์ž…์žฅ์—์„œ ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋ฉด ๋ฌด์—‡์ด ๋ณด์—ฌ์•ผ ํ•œ๋‹ค, ์ด๋ ‡๊ฒŒ ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์จ ์žˆ๊ธฐ๋„ ํ–ˆ์ง€๋งŒ, ์–ด๋–ค ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์žˆ๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ณด๋‹ˆ ๋ฐฑ๋กœ๊ทธ ์ž์ฒด๋„ ๋ฌธ์ œ๊ฐ€ ๋งŽ์•˜๊ณ , ์ด๋ฅผ ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ์ด์Šˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ๋„ ์ผ๊ด€์„ฑ์ด ์—†์—ˆ๋‹ค. ์™œ ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์„ ์ ์šฉํ•˜์ง€ ๋ชปํ–ˆ์„๊นŒ? ๊ทธ๊ฑด ๋‚ด๊ฐ€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์•Œ๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ธฐํš๊ณผ ๊ณ„ํš์„ ์ถฉ๋ถ„ํžˆ ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ •ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

์‚ฌ์‹ค ๋ชจํ—ค์œฐ์€ ๋น„์Šทํ•œ ์ปจ์…‰์˜ ์–ด๋–ค ์„œ๋น„์Šค์—์„œ, ํ•œ๋ฒˆ ๋’ค์ง‘์–ด์กŒ๋‹ค๊ฐ€, ๊ทธ๊ฒŒ ๋˜ ํ•œ ๋ฒˆ ๋’ค์ง‘์–ด์ง€๋ฉด์„œ ์ง€๊ธˆ์˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋œ ์ผ€์ด์Šค๋‹ค. ๊ธˆ์š”์ผ์ด ๊ธฐํš ๋ฐœํ‘œ์˜€๊ณ , ์ฒซ ์ „๋ณต์ด ์ˆ˜์š”์ผ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„ธ๋ถ€ ๊ธฐํš์ด ์žˆ๊ธฐ ์–ด๋ ค์šด ์ƒํ™ฉ์ด๊ธด ํ–ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๊ธฐํš์ด ๋˜‘๋ฐ”๋กœ ์žกํžˆ์ง€ ์•Š๊ณ , ํŒ€์›๋“ค์ด ์ดํ•ดํ•œ ๋ฐ”๊ฐ€ ์กฐ๊ธˆ ์”ฉ ๋‹ฌ๋ผ ์ค‘๊ฐ„์ค‘๊ฐ„ ์ถ”๊ฐ€์ ์ธ ํ† ๋ก ์ด๋‚˜ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ(ํŠนํžˆ DB ์Šคํ‚ค๋งˆ)์ด ํ•„์š”ํ–ˆ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด ‘ํšŒ์› ํƒˆํ‡ด’๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜๋‹ˆ, ํƒˆํ‡ดํ•œ ํšŒ์›์€ ๊ฒ€์ƒ‰์ด ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ , ๋‚จ๊ธด ๊ธ€์€ ๋ณด์—ฌ์•ผ ํ•˜๊ณ , ๋“ฑ๋“ฑ.. ๊ทธ๋Ÿฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ์•˜๊ณ  ์‹ฌ์ง€์–ด ๋น ๋œจ๋ฆฐ ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋‹ค.

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์•ž์˜ ํ˜‘์—… ๊ทœ์น™๊ณผ ๋งž๋ฌผ๋ ค์„œ ๋‚˜๋Š” ๋‹ค์Œ ์ฃผ์— ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฒˆ ์ฃผ์— ์ž‘์—…์„ ๋งˆ์น˜์ง€ ๋ชปํ•ด์„œ ๋ฏธ์™„๋ฃŒ ์ƒํƒœ๋กœ ๋‘๊ณ  ๊ฐ€๋ฒ„๋ฆฌ๋Š”, ๊ทธ๋Ÿฐ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋กœ ํŒ€์›์—๊ฒŒ ์กฐ๊ธˆ ๋‚ ์นด๋กญ๊ฒŒ ๋งํ•œ ๊ธฐ์–ต์ด ์žˆ๋‹ค. ์•„๋‹ˆ๋‹ค, ์ง€๊ธˆ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ๋‚ ์นด๋กญ๊ฒŒ ์ƒ๊ฐ๋งŒ ํ•˜๊ณ  ๋ง์€ ์•ˆํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ์ด์•ผ๊ธฐ ํ•˜๋ฉด ๋‹ค ๋“ค์–ด์คฌ์œผ๋‹ˆ๊นŒ. ์•„๋ฌดํŠผ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ํฐ ๊ฒฐ๊ณผ๋กœ ์ด์–ด์ง€์ง„ ์•Š์•„์„œ ๋‹คํ–‰์ด์—ˆ๋‹ค.

์šฉ์–ด๋ฅผ ๋ช…ํ™•ํžˆ ์ •ํ•˜์ง€ ์•Š์•˜๋‹ค.

ํŽ˜์ด์Šค๋ถ์˜ ‘๋‹ด๋ฒผ๋ฝ’์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž. ์ด๋ฆ„์„ ‘๋‹ด๋ฒผ๋ฝ’์ด๋ผ๊ณ  ์ •ํ–ˆ๋‹ค๋ฉด ์‚ฌ๋‚ด์˜ ๋ชจ๋‘๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ‘ํ”„๋กœํ•„ ํŽ˜์ด์ง€’ ‘๊ฐœ์ธ ํ”ผ๋“œ’ ์ด๋”ฐ์œ„ ์ด๋ฆ„์ด ์•„๋‹Œ ‘๋‹ด๋ฒผ๋ฝ’์ด๋ผ๊ณ ๋งŒ ๋ถˆ๋Ÿฌ์•ผ ํ•œ๋‹ค. ์ด๊ฑด ๋‹จ์ˆœํžˆ ‘๋ณด๊ธฐ ๋ถˆํŽธํ•ด!‘์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํŒ€์˜ ์˜์‚ฌ์†Œํ†ต์„ ์›ํ™œํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์•„์ฃผ ์ค‘์š”ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๋Š” ๊ธฐํš ๋‹จ๊ณ„์—์„œ ์ด๊ฑธ ์ œ๋Œ€๋กœ ํ•˜์ง€ ์•Š์•˜๋‹ค. ‘๋Œ“๊ธ€’ ‘๋‹ต๊ธ€’, ‘๊ฒŒ์‹œ๊ธ€ ์—ด๋žŒ ํŽ˜์ด์ง€’ ‘๊ฒŒ์‹œ๊ธ€ ๋ณด๊ธฐ ํŽ˜์ด์ง€’ ‘๊ฒŒ์‹œ๊ธ€ ๋ณด๋Š” ํŽ˜์ด์ง€’ ๋“ฑ๋“ฑ, ๋ณด๊ธฐ๋งŒ ํ•ด๋„ ํ•œ์ˆจ์ด ๋‚˜์˜ค๋Š” ์˜ค๋งŒ๊ฐ€์ง€ ์ด๋ฆ„๋“ค์ด ์žˆ์—ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ๋ถˆํŽธํ•จ๊ณผ ๋ฌธ์ œ์ ์ด ์ •๋ง ๋งŽ์•˜๋Š”๋ฐ, ๋ง‰์ƒ ์“ฐ๋ ค๋‹ˆ๊นŒ ๋”ฑ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๊ฐ€ ๋– ์˜ค๋ฅด์งˆ ์•Š๋Š”๋‹ค. ์•„๋ฌดํŠผ ์ด๊ฑธ ์ •ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฏธ ๋‚˜๋Š” ๊ธฐํš ๋‹จ๊ณ„์—์„œ ํšŒ์˜์— ๋„ˆ๋ฌด ๋งŽ์€ ๋ธŒ๋ ˆ์ดํฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฒƒ๊นŒ์ง€ ํŠธ์ง‘์„ ์žก์•˜๋‹ค๊ฐ„ ์‹ธ์›€์ด ๋‚ฌ์„ ์ˆ˜๋„ ใ…‹ใ…‹..

๊ทธ๋ผ์šด๋“œ ๋ฃฐ๊ณผ ์ปจ๋ฒค์…˜ ๋ฌธ์ œ

๋‹น์—ฐํžˆ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ผ์€, ๊ทธ๋ผ์šด๋“œ ๋ฃฐ๊ณผ ์ปจ๋ฒค์…˜ ์ •๋ฆฝ์ด์—ˆ๋‹ค. ์šฐ๋ฆฌ ์ค‘ ๊ทธ ๋ˆ„๊ตฌ๋„ ํ˜‘์—…์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†๋‹ค๋ณด๋‹ˆ, ๋ฌด์—‡๋ฌด์—‡์„ ์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?์— ๋Œ€ํ•œ ๊ฐ๊ฐ์ด ์ „ํ˜€ ์—†๋Š” ์ƒํƒœ์˜€๋‹ค. ๊ทธ๋ž˜๋„ ๋‚˜๋ฆ„์˜ ์ปค๋ฐ‹ ๊ทœ์น™๊ณผ PR์„ ๋จธ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์— ๋Œ€ํ•ด ์„ธ์›Œ ๋‚˜๊ฐ”์ง€๋งŒ, ์ด ๋ถ€๋ถ„์€ ์†”์งํžˆ.. ์ „ํ˜€ ์ž˜ํ•œ ์ ๋“ค์ด ์—†์—ˆ๋‹ค.

์ปค๋ฐ‹์˜ ๋‹จ์œ„ ์ž์ฒด๊ฐ€ ์ œ๋Œ€๋กœ ๋‚˜๋‰˜์ง€ ์•Š์•˜๋‹ค.

image

(๊นŠ์€ ํ•œ์ˆจ)

์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ git์˜ staged ๊ฐœ๋…์„ ์ž˜ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ˆ˜์ •์ด๋‚˜ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์— ์„ž์–ด์„œ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜, ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ ์ž์ฒด๋ฅผ ์ง€ํ‚ค์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋‹ค. ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋‚ด ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์ž‘์—…๋‚ด์šฉ์„ ๋ชฐ์•„ ์จ์„œ ํ•œ ๋ฒˆ์— ์ปค๋ฐ‹์„ ๋‚ ๋ ค ์˜ค๋‹ค๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๊ฐ„์ด ๋ฌธ๋“ ์ด ๋ฌธ์ œ๋ฅผ ๊นจ๋‹ฌ์•˜๋‹ค. ์šฐ๋ฆฌ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ปค๋ฐ‹ ๋‚ด์—ญ์„ ๋ณด๊ธฐ ์–ด๋ ค์šด ์ด์œ ๋Š” ๊ทธ์ € ์ปค๋ฐ‹์ด ์ปค๋ฐ‹์˜ ๋‹จ์œ„๋ฅผ ๊ฐ–์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

์ด์Šˆ๋‚˜ PR์˜ ํ…œํ”Œ๋ฆฟ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ชจํ—ค์œฐ์˜ ์ด์Šˆ์™€ PR์„ ๋ณด๋ฉด 3์ž ์ž…์žฅ์—์„œ ๋ณด๊ธฐ ๋งค์šฐ ํž˜๋“ค๋‹ค. ์šฐ์„  PR์€ ‘dev๋กœ ์˜ฌ๋ฆฌ๊ณ , mergeํ•˜์ž’ ์ •๋„๋งŒ ์ •ํ•˜๊ณ  PR์˜ ์ œ๋ชฉ์ด๋‚˜ ๋‚ด์šฉ์— ๋Œ€ํ•œ ์ปจ๋ฒค์…˜์ด ์ „ํ˜€ ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ๋ชฉ์€ ๊นƒํ—ˆ๋ธŒ๊ฐ€ ์ •ํ•ด์ฃผ๋Š” ๋Œ€๋กœ, ๋‚ด์šฉ์€ ์—†๋Š” ๊ฒฝ์šฐ๋„ ๋งŽ์•˜๋‹ค. ์•„์ฐจ, ์ด๊ฑธ ์ •ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋ผ๊ณ  ๋Š๊ผˆ์„ ๋•Œ๋Š” ์ด๋ฏธ ๋Šฆ์—ˆ๋‹ค. ๋‚˜์ค‘์— ์–ด๋–ค PR์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ์ž‘์—…ํ•œ ํŒ€์›์—๊ฒŒ ‘์ด๊ฑฐ ์–ด๋–ค PR์ด์—ˆ์ฃ ?’ ํ•˜๊ณ  ๋ฌผ์–ด๋ด์•ผ ํ•˜๋Š” ์–ผํƒฑ์ด ์—†๋Š” ์ƒํ™ฉ์ด ๋˜์–ด๋ฒ„๋ ธ๋‹ค.

์ด์Šˆ ์—ญ์‹œ ๊ทธ๋ ‡๋‹ค. ์•ž์˜ ๋ฐฑ๋กœ๊ทธ ๋ฌธ์ œ์™€๋„ ์—ฐ๊ฒฐ๋˜์ง€๋งŒ, ํ•˜๋‚˜์˜ ๋ฐฑ๋กœ๊ทธ๋ฅผ ์ด์Šˆํ™”ํ•˜๊ณ , ์ด๋ฅผ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ - ๋ฐฑ์—”๋“œ๊ฐ€ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ๋“ค์„ ๋˜ ์ž‘์€ ์ด์Šˆ๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค. ์ด ์ž‘์€ ์ด์Šˆ๋“ค์ด ๋ฐฑ๋กœ๊ทธ ์ด์Šˆ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜์ž๊ณ  ํ–ˆ์ง€๋งŒ ๋ณ„๋กœ ์ง๊ด€์ ์ด์ง„ ์•Š์•˜๊ณ , Github Project์˜ ์‚ฌ์šฉ ๋ฏธ์ˆ™์œผ๋กœ ์ž‘์€ ์ด์Šˆ๊ฐ€ ๋ฐฑ๋กœ๊ทธ์— ์˜ฌ๋ผ๊ฐ€๋ฒ„๋ฆฌ๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ธฐ๋„ ํ–ˆ๋‹ค. ๋‹ค์Œ์—” ๊ผญ Jira, Trello๋ผ๋˜์ง€, ์ตœ์†Œํ•œ ๋…ธ์…˜์œผ๋กœ ์ •๋ฆฌํ•˜๋˜๊ฐ€ ํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์Œ.. ๊ทธ๋ฆฌ๊ณ  git cz๋ฅผ ์จ ๋ณด๊ณ  ์‹ถ๋‹ค.

๊ทธ๋‚˜๋งˆ ์ •ํ•œ ๋ฃฐ๋„ ์ œ๋Œ€๋กœ ์ง€์ผœ์ง€์ง€ ์•Š์•˜๋‹ค.

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ์˜€๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ ์šฐ๋ฆฌ ํŒ€์€ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ, ๋ชจ๋‘๊ฐ€ ์ฑ…์ž„์ง€๋Š” ๊ฒƒ์„ ์ตœ์šฐ์„ ์œผ๋กœ ์—ฌ๊ฒผ๋‹ค. ์ด๋Š” ๋‚ด๊ฐ€ ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ ๋ฟ ์•„๋‹ˆ๋ผ, ๋‚ด๊ฐ€ ๋ฐฑ์—”๋“œ ์ž‘์—…์„ ํ•˜๋Š” ์ฃผ๊ฐ„์— ์˜ฌ๋ผ์˜ค๋Š” ํ”„๋ก ํŠธ PR์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ๋˜์—ˆ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” PR์„ ์˜ฌ๋ฆด ๋•Œ ๋ฆฌ๋ทฐ์–ด๋กœ ์„œ๋กœ๋ฅผ ์ง€์ •ํ•˜๊ณ , approve ๋˜์–ด์•ผ dev ๋ธŒ๋žœ์น˜์— ๋จธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž๊ณ  ์ด์•ผ๊ธฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค.

์ฒซ์งธ๋กœ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์—†์—ˆ๋‹ค. ์ฒซ ๊ธฐํš์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋’ค์ง‘์œผ๋ฉฐ ๊ธฐ๋Šฅ์„ ๊ฑฐ์˜ ๋ฐ˜ ์ดํ•˜๋กœ ์ค„์˜€์ง€๋งŒ, ๊ทธ๋ž˜๋„ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ๋ชจ์ž๋ž๋‹ค. ๋‚จ์˜ ์ฝ”๋“œ ๋ณด๊ธฐ๋ฅผ ์ตœ๊ณ ๋กœ ์ข‹์•„ํ•˜๋Š” ๋‚˜๋„ ๊ทธ๊ฑธ ๋‹ค ์ฝ๋Š”๊ฒŒ ๋„ˆ๋ฌด๋‚˜ ๋ฒ„๊ฑฐ์› ๊ณ , ์ด๋Ÿฌ๋‹ค๊ฐ„ ์ฃผ๊ฐ„ ๋งˆ์ผ์Šคํ†ค์„ ์ฑ„์šฐ๊ธฐ ์ •๋ง ์–ด๋ ค์›Œ ๋ณด์˜€๋‹ค.

๋‘˜์งธ๋กœ ์ด๋Ÿฐ ํ™˜๊ฒฝ์—์„œ ํŒ€์›์—๊ฒŒ ๋ฆฌ๋ทฐ์š”์ฒญ์„ ๊ฑฐ๋Š” ๊ฒƒ์ด ๋ถ€๋‹ด์ด์—ˆ๋Š”์ง€ ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์—†๋Š” PR์ด ์ฅ๋„ ์ƒˆ๋„ ๋ชจ๋ฅด๊ฒŒ ์˜ฌ๋ผ์™”๋‹ค๊ฐ€, ๋ฐ”๋กœ ๋จธ์ง€๋˜์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. ์กฐ๊ธˆ ์„œ์šดํ•˜๊ธฐ๋„ ํ–ˆ๊ณ , ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๊ฐ„์— ์ •๋ง ๋ง์ด ์•ˆ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด์„œ ‘์ด๊ฒŒ ์–ด๋–ป๊ฒŒ dev ๋ธŒ๋žœ์น˜๋กœ ์™”์ง€?’ ํ•˜๊ณ  ๋ณด๋ฉด ๊ทธ๋Ÿฐ PR์ด์—ˆ๋˜ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์—ˆ๋‹ค.

image

๋ฒŒ์น™์„ ๊ฐ™์ด ์ •ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ใ…‡ใ…‡..

๊ทธ๋ฆฌ๊ณ  ๋ฃฐ ์–˜๊ธฐ๋ฅผ ํ•˜๋Š” ๊น€์—, ํ›„๋ฐ˜ ๊ฐˆ์ˆ˜๋ก ํŒ€์›๋“ค์ด ์ž  ์•ˆ์ž๊ธฐ ๋Œ€ํšŒ๋ฅผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ณด์—ฌ์„œ 3์‹œ ์ดํ›„ ๊ฒŒ๋”ํƒ€์šด ์ปค๋ฐ‹ PR ์ด์Šˆ๋ฐœํ–‰ ๊ธˆ์ง€๋ผ๋Š” ๋ฃฐ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ 3์‹œ ์ดํ›„๋กœ ์—„์ฒญ๋‚œ ์ปค๋ฐ‹๊ณผ ์ด์Šˆ๊ฐ€ ์˜ฌ๋ผ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋‹˜ ๊ทธ๋Ÿฌ๋‹ค ์ฃฝ์–ด์š”

ํŒ€์›๋“ค์˜ prettier๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค.

yarn berry๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ, ๋˜ VS์ฝ”๋“œ์˜ ๋ฌธ์ œ๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ์ธ๋ฐ, lint ์—†์ด๋Š” ์‚ฌ๋žŒ์ด ์ฃฝ๋Š” ์ค„ ์•„๋Š” ๋‚˜๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ํŒ€์›์ด lint๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ด๊ฑธ ๋งž์ถ”๋ ค๊ณ  ๋”ฐ๋กœ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ธฐ๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ, ์–ผ๋งˆ ์ง€๋‚˜์ง€ ์•Š์•„ ๋˜ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๋Œ€์ฒด ์™œ์˜€์„๊นŒ? ์•„๋ฌดํŠผ ๊ทธ๋ž˜์„œ ๋Œ€๋ถ€๋ถ„์˜ PR์—๋Š”(๋‚ด ๊ฒƒ์„ ํฌํ•จํ•ด์„œ) CI ํ†ต๊ณผ๊ฐ€ ๋˜์ง€ ์•Š์•„ lint error๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ปค๋ฐ‹์ด ํ•˜๋‚˜์”ฉ ๋” ๋‹ฌ๋ ค ์žˆ์—ˆ๊ณ , prettier๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ๊ตฌ๊ฒฝํ•  ๋•Œ๊ฐ€ ๋˜์–ด์„œ์•ผ ์ ์šฉ๋˜์–ด ์“ธ๋ฐ ์—†๋Š” ๋ณ€๊ฒฝ์ด ์ƒ๊ฒจ ์ปค๋ฐ‹์ด ๋ง‰ ์ปค์ง€๊ธฐ๋„ ํ–ˆ๋‹ค.

์ž‘์—… ๊ณผ์ •์—์„œ์˜ ๋ฌธ์ œ

์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฒช์€ ์•„์‰ฌ์›€๋“ค์ด๋‹ค.

๋‚ด๊ฐ€ ๊ธฐ๋Œ€๋ฐ›๋Š” ์—ญํ• ์„ ํ•ด๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค.

๋‚˜์ค‘์— ํŒ€์žฅ๋‹˜์ด ๋‚ด๊ฒŒ ์ œ์•ˆ์„ ํ•œ ์ด์œ ๊ฐ€ ๋Œ€์ถฉ ๋‚ด๊ฐ€ ํ”„๋ก ํŠธ์—”๋“œ ์ „๋ฐ˜์„ ์ž˜ ์žก๊ณ  ํŒ€์›์—๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ธฐ๋Œ€๋ฅผ ํ–ˆ๋‹ค, ์ด๋Ÿฐ ์ด์•ผ๊ธฐ๋ฅผ ํ–ˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์šฐ์„  ๋‚˜๋Š” ๊ธฐ๋ณธ์ด ์—†์—ˆ๊ณ , ๊ธฐ๋ณธ์ด ์—†๋‹ค๋Š” ์ธ์ง€๋„ ์—†์—ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉฐ ๋‚ด๊ฐ€ ๋Š๋ผ๋Š” ๋ถˆํŽธํ•จ์ด ์ •๋ง ์•ˆํ‹ฐํŒจํ„ด์ด์–ด์„œ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ํ•˜๋˜ ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ผ์„œ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜์ง€๋„ ๋ชปํ–ˆ๋‹ค. ์˜คํžˆ๋ ค ๋‚˜๋Š” ‘์ž๊ธฐ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅธ๋‹ค’๊ณ  ํ•œ ํŒ€์›์—๊ฒŒ ๋ฐฐ์šด๊ฒŒ ๋” ๋งŽ๋‹ค. ํŠนํžˆ Next.js๋Š” ๋ฆฌ์•กํŠธ์™€ ๋น„์Šทํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค์ด ์žˆ๋Š”๋ฐ, ๋‚˜๋Š” ํŒ€์›์˜ ํ•™์Šต ์ •๋ฆฌ์— ์˜์กดํ•˜๋ฉฐ ์ด ๋ถ€๋ถ„๋“ค์„ ์ฑ„์›Œ๋‚˜๊ฐ”๋‹ค. ๊ทธ ์™ธ์—๋„ ๋งํ•˜๊ธฐ๋„ ์ฐฝํ”ผํ•œ ๋‚˜์˜ ๋ฌด์ง€ํ•จ์ด ๋ช‡ ๋ฒˆ์”ฉ ํ„ฐ์ ธ ๋‚˜์™”๋‹ค. ์‚ฌ์‹ค ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์ด ๋ฌด๋„ˆ์ง„ ์ฑ…์ž„์€ ๋Œ€๋ถ€๋ถ„ ๋‚ด๊ฒŒ ์žˆ๋‹ค. ใ…Ž;;

์˜์‚ฌ์†Œํ†ต์ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฐ–์—์„œ ์ด๋ฃจ์–ด์กŒ๋‹ค.

์ฝ”๋“œ๋ฆฌ๋ทฐ, ์ˆ˜์ •์š”์ฒญ, ๊ทธ ์™ธ ๊ธฐํƒ€๋“ฑ๋“ฑ์ด ์Šฌ๋ž™์ด๋‚˜ ๊ฒŒ๋”ํƒ€์šด์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์กŒ๋‹ค. ์ด๊ฒŒ ๋ญ๊ฐ€ ๋ฌธ์ œ๋ƒ๋ฉด, ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋งŒ ๋ด์„œ๋Š” ์ž‘์—…์˜ ๊ณผ์ •์ด ์ „ํ˜€ ๊ฐœ์—ฐ์„ฑ ์—†๊ฒŒ ๋ณด์ธ๋‹ค. ๋”์šฑ์ด ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€ ๊ทธ๋ž˜์„œ๋Š” ์•ˆ๋๋‹ค. PR ์ฝ”๋ฉ˜ํŠธ์˜ ๊ฒฝ์šฐ ๋ ˆํฌ์—์„œ ์ง€์ ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ถ€์ •์ ์ด๊ฒŒ ๋Š๊ปด์ ธ์„œ(๋‚˜์˜ ๊ณ ์งˆ๋ณ‘์ด๋‹ค) ๊ฒŒ๋”ํƒ€์šด์ด๋‚˜ ์Šฌ๋ž™์œผ๋กœ ์ด์•ผ๊ธฐํ•ด์„œ ๊ณ ์น˜๊ณค ํ–ˆ๋‹ค. PR์— ‘ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜’ ๋“ฑ์˜ ์ด๋ฆ„์„ ๊ฐ–๋Š” ์ปค๋ฐ‹์ด ์žˆ์œผ๋‚˜ ์ •์ž‘ ๊ทธ PR์— ๋‹ฌ๋ฆฐ ๋ฆฌ๋ทฐ๋Š” ์—†๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ƒฅ ๊ทผ๊ฑฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ํฌ๊ฒŒ ์ง€์ ์œผ๋กœ ๋Š๋‚„ ์‚ฌ๋žŒ๋„ ์—†์—ˆ์„ ํ…๋ฐ ๋‚ด๊ฐ€ ๊ดœํžˆ ๊ทธ๋žฌ๋‹ค. ์ด๊ฑด ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋‘ ๋๋‚œ ํ›„์— ๊ฐ‘์ž๊ธฐ ๋“  ์•„์‰ฌ์›€์ด๋‹ค.

์ •์ž‘ ๋‚ด๊ฐ€ ๊ธฐ๋ก์„ ๋งŽ์ด ํ•˜์ง€ ์•Š์•˜๋‹ค.

image

๋งŽ์ด๋„ ํ–ˆ๋‹ค

์šฐ๋ฆฌ ํŒ€์˜ ์ด๋ฆ„์€ ๋ฆฌ์ฝ”๋”์ด๋‹ค. ์ฒ˜์Œ ๊ธฐํš์ด ๊ทธ๋ฃน ๊ตํ™˜์ผ๊ธฐ ์ปจ์…‰์ด์—ˆ์–ด์„œ, ๊ธฐ๋ก์„ ํ•˜๋Š” ์„œ๋น„์Šค๋ผ๋Š” ์ ์— ์ฐฉ์•ˆํ•˜์—ฌ ‘๊ธฐ๋กํ•˜๋Š” ์‚ฌ๋žŒ๋“ค’์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ์ง€์€ ์ด๋ฆ„์ด๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋„ ํ•™์Šต์ •๋ฆฌ๋ฅผ ์—ด์‹ฌํžˆ ํ•˜์ž, ๊ธฐ๋ก์„ ๋งŽ์ด ๋‚จ๊ธฐ์ž ๋ผ๋Š” ์ œ์•ˆ์„ ํ–ˆ๋‹ค. ์ด๊ฑด ๋‚ด๊ฐ€ ํŒ€์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ํŒ€์žฅ๋‹˜๊ป˜ ์ œ์‹œํ•œ ์กฐ๊ฑด์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ์ œ์‹œํ•œ ์กฐ๊ฑด์ด๋ผ๋‹ˆ๊นŒ ๋ญ๋ผ๋„ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ณด์ธ๋‹ค.

์•„๋ฌดํŠผ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ TIL ๋ฌธ์„œ ์ˆ˜๋Š” ๊ผด์ฐŒ์— ๊ฐ€๊นŒ์› ๋‹ค. ๊ฑฐ์˜ ์Šค์Šค๋กœ๋ฅผ ๊ฐˆ์•„๋„ฃ๋Š” ์–ด๋–ค ์ฒœ์žฌ๋ถ„์ด ๋…๋ณด์ ์ด์—ˆ๊ณ *(์†”์งํžˆ ์ด ๋ถ„ ํ•™์Šต๋Ÿ‰์ด ๋ง์ด ์•ˆ๋œ๋‹ค)*, ํŒ€์žฅ๋‹˜์ด ๋‘ ๋ฒˆ์งธ, ๋‚˜๋Š” ๊ฑฐ์˜ ๊ผด์ฐŒ์— ๊ฐ€๊นŒ์› ๋‹ค. ๋‚˜๋ฆ„ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ๋“ค์€ ๊ฑฐ์˜ ์ผ์ง€๋งŒ, ๋‚ด๊ฐ€ ์•„๋Š” ๋ฒ”์œ„ ๋‚ด์—์„œ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฒ„๋ฆ‡๊ณผ ๋Š๋ฆฐ ์ž‘์—…์†๋„๊ฐ€ ์›์ธ์ด๋ผ๊ณ  ํ•‘๊ณ„๋ฅผ ๋Œ„๋‹ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์ง€๊ธˆ๋„ ์ข€ ๋ฌด์•ˆํ•˜๋‹ค. ๋‚˜๋Š” ๊ทธ๋ƒฅ ํšŒ๊ณ ์— ๋„‹๋‘๋ฆฌ๋งŒ ์˜ค์ง€๊ฒŒ ์ ์—ˆ๋‹ค..

ํŒ€์˜ ์ž์›์„ ๋„ˆ๋ฌด ๋‚ญ๋น„ํ–ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์ œ๋ฅผ ๋†“๊ณ  ๋ณด๋ฉด ๊ทธ๋ ‡๊ฒŒ ๊ฐœ์„ฑ์žˆ์ง„ ์•Š์ง€๋งŒ, ๊ตณ์ด ๊ผฝ์ž๋ฉด ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๊ฐ€ ์žˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐœ์ธ์ ์ธ ์š•์‹ฌ์œผ๋กœ ๊ณ ์ง‘ํ•œ ์ปจ์…‰์ด๊ธฐ๋„ ํ•˜๊ณ , ํŒ€์›๋“ค์ด ์ด ๊ฒƒ์„ ์œ„ํ•ด ๋‚˜์—๊ฒŒ ๋งŽ์€ ์‹œ๊ฐ„์„ ๋ชฐ์•„ ์คฌ๋Š”๋ฐ, ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ๋งŒ๋“ค๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ค์› ๋‹ค. ๊ทธ๋ƒฅ ๊ฐ€๋ณ๊ฒŒ ์ •๊ทœ์‹์œผ๋กœ ์น˜ํ™˜ํ•˜๋ฉด ๋˜๊ฒ ๊ฑฐ๋‹ˆ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ฌธ๋ฒ•๊ณผ ๋ฌธ๋ฒ•๊ฐ„์˜ ํฌํ•จ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๊ฐ€ ๊ฐ์ž ๋‹ฌ๋ž๊ณ , ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์กฐ์  ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์™„๋ฒฝํ•œ ํŒŒ์‹ฑ์„ ์œ„ํ•ด์„œ๋Š” ์ •๋ง ๋ฌธ์ž์—ด์„ lexical analyzeํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋ฒฝ์— ๊ฐ€๋กœ๋ง‰ํ˜€ ํฌ๊ธฐํ•˜๋ ค๋‹ค๊ฐ€ ์–ด๋–ค ํŒ€์›์˜ ๊ฒฉ๋ ค๋กœ ์–ด๋–ป๊ฒŒ๋“  ๋ช‡ ๊ฐ€์ง€ ๋ˆˆ์†์ž„์„ ๊ฑฐ์ณ ๋น„์Šทํ•œ ๋ชจ์–‘์„ ๋งŒ๋“ค์–ด๋ƒˆ์ง€๋งŒ, ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ํˆฌ์žํ•œ ์‹œ๊ฐ„์ด ์•„๊นŒ์šด ์ˆ˜์ค€์ด๋‹ค. ์—ฌ๋‹ด์œผ๋กœ ๊ทธ ๋•Œ ๋ฐ›์€ ๊ฒฉ๋ ค๋กœ ์ง„์งœ ์šธ ๋ป”ํ–ˆ๋‹ค ใ…‹ใ…‹..

๊ทธ๋ž˜๋„ ๋‚˜์ค‘์— ๋ฉ˜ํ† ๋‹˜ํ•œํ…Œ ๋“ค์–ด ๋ณด๋‹ˆ, ์• ์ดˆ์— ์™„์ „ํ•œ ํŒŒ์„œ๋ฅผ ๋งŒ๋“ค๊ธฐ๋Š” ์ข€ ํž˜๋“ค ๊ฒƒ์ด๊ณ , ๋ฉ˜ํ† ๋‹˜์ด ๋น„์Šทํ•œ ์ผ์„ ํ•˜์…จ์„ ๋•Œ์—๋„ ์šฐ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฌผ๊ณผ ๋น„์Šทํ•œ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ํ•˜์…จ๋‹ค๊ณ  ํ•œ๋‹ค. ์ตœ๊ณ ๋Š” ์•„๋‹ˆ์–ด๋„ ๋‚˜๋ฆ„ ์ตœ์„ ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ ๊ฒƒ ๊ฐ™๋‹ค.


image

์†”์งํžˆ ๊ธ€์“ฐ๋Š” ๊ฑฐ ์žฌ๋ฏธ์žˆ์—ˆ์Œ

์ฒซ ํ˜‘์—…์ด๋‹ˆ๊นŒ ๋ผ๋Š” ์ด์•ผ๊ธฐ๋Š” ์ข€ ๊ทธ๋ ‡๋‹ค. ์™œ๋ƒ๋ฉด ๋‹ค์Œ ํ˜‘์—…๋•Œ๋Š” ๋˜ ๋‹ค์Œ ํ˜‘์—…์˜ ์•„์‰ฌ์›€์ด ์ด ๋งŒํผ ์Œ“์ผ ๊ฒƒ์ด๊ณ , ๋‚˜๋Š” ‘์ฒ˜์Œ์ด๋‹ˆ๊นŒ’๋ผ๋Š” ์ด์œ ๋ฅผ ์ •๋ง ์‹ซ์–ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฒˆ์—” ์ฒ˜์Œ์ด๋ผ๊ณ  ์น˜๊ณ , ๋‹ค์Œ ๋ฒˆ์—๋Š” ์–ด๋–ค ๋ณ€๋ช…์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๊ทธ๋ƒฅ ์ด ๋ฌธ์ œ๋“ค๋กœ ์ธํ•ด ๋‚ด๊ฐ€ ๋Š๋‚€ ์Šฌํ””์„ ๋จธ๋ฆฟ์†์— ์ƒˆ๊ธฐ๊ณ  ๋‹ค์‹œ๋Š” ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋„๋ก ๊ฐ๊ฐ์„ ์ตํžˆ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ์— ์ด๋ ‡๊ฒŒ ํž˜๋“ค์—ˆ๋Š”๋ฐ ๋˜ ๊ฐ™์€ ์‹ค์ˆ˜๋ฅผ ํ•˜๋ฉด ์ •๋ง ์Šฌํ”Œ ๊ฒƒ ๊ฐ™๋‹ค.

์•„์‰ฌ์›€๋งŒ ์ ์—ˆ์ง€๋งŒ ์ •์ž‘ ์šฐ๋ฆฌ์˜ ํ˜‘์—…์€ ์ •๋ง ์žฌ๋ฐŒ์—ˆ๋‹ค. ์ƒˆ๋ฒฝ๊นŒ์ง€ ๊ฒŒ๋”ํƒ€์šด์—์„œ ์žก๋‹ด์„ ํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์›”๋“œ์ปต๋„ ๋ณด๊ณ , ํ…ŒํŠธ๋ฆฌ์Šค๋ฅผ ํ•˜๋ฉด์„œ ๋†€๊ธฐ๋„ ํ–ˆ๋‹ค. ์–ด์„คํ”„๋˜ ์‹œ์ ˆ๋งŒ ๊ธฐ์–ตํ•ด์„œ ๊ทธ๋ ‡์ง€ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ๊ฝค ๋ฉ‹์žˆ๋Š” ์•ฑ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์ด ๊ธ€์€ ๋‚˜์˜ ๋ฌธ์ œ๋ฅผ ์ฑ„์ฐ์งˆ ํ•˜๋Š” ๊ธ€์ด ์•„๋‹ˆ๋ผ, ๊ทธ์ € ๋‚ด๊ฐ€ ๋ถ€์ŠคํŠธ์บ ํ”„ ๋‚ด๋‚ด ํ•ด์™”๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ‘๋‹ค์Œ์—๋Š” ์ด๋ ‡๊ฒŒ ํ•ด์•ผ์ง€!’ ๊ณ„ํš์„ ์„ธ์šฐ๋Š” ๊ธ€์ด๋‹ค. ์šฐ๋ฆฌ ํŒ€์€ ๋Œ€๋‹จํ•˜๋‹ค. ์šฐ๋ฆฌ๋‹ˆ๊นŒ ์ด ์ •๋„ ํ•œ๊ฑฐ์•ผ ^^..

+Hugo. \ No newline at end of file diff --git a/posts/2022/12/making-editor-markdown/index.html b/posts/2022/12/making-editor-markdown/index.html index 074df8e..2422748 100644 --- a/posts/2022/12/making-editor-markdown/index.html +++ b/posts/2022/12/making-editor-markdown/index.html @@ -1,7 +1,7 @@ ๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3] | PrayinForRain.dev -

๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]

Table of Contents

๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]
์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]


๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. GFM(GitHub Flavored Markdown)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•„๋ฌด ์ด์Šˆ๋‚˜ ๋“ค์–ด๊ฐ€์„œ ๋Œ“๊ธ€ ์ฐฝ์— ์‹คํ—˜์„ ํ•˜๋ฉด์„œ์š”.

Untitled

์›๋ž˜๋Œ€๋กœ๋ผ๋ฉด ์ž…๋ ฅ์„ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ , Parse tree๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ์•ผ ๊ฒ ์ง€๋งŒ, ๋งˆํฌ๋‹ค์šด์ด ๋Š์Šจํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๊ณผ์ •์ด ์ง€๋‚˜์น˜๊ฒŒ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ ์‰ฌ์šด ๊ธธ์„ ์„ ํƒํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์ฃผ ์“ธ ๋ฒ•ํ•œ ๋งˆํฌ๋‹ค์šด ๋ช‡ ๊ฐ€์ง€๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฉด ๋˜๊ฒ ์ง€? ํ•˜๋Š” ์ƒ๊ฐ์œผ๋กœ ๊นƒํ—ˆ๋ธŒ๋ฅผ ์—ด์–ด์„œ ์•„๋ฌด ํ…์ŠคํŠธ๋ฅผ ๋งˆ๊ตฌ ์ž…๋ ฅํ•ด ๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ์š”.

function headers(str: string): string {
   let result = str.replace(/^### ([\S ]+)$/gm, "<h3>$1</h3>");
   result = result.replace(/^## ([\S ]+)$/gm, "<h2>$1</h2>");
   result = result.replace(/^# ([\S ]+)$/gm, "<h1>$1</h1>");
@@ -25,7 +25,7 @@
   result = divideLines(result);
   return result;
 }
-

Untitled

๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์ €๋ฒˆ ํฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„์ž…๋‹ˆ๋‹ค. ๋Œ€์ถฉ ์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ replace๋ฅผ ์Œ“์•„ ๋‚˜๊ฐ€๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”?

๐Ÿ“ ๋ญ๋“  ๊ณ„ํš์„ ์„ธ์šฐ์ž

ํ•˜์ง€๋งŒ ๋งˆํฌ๋‹ค์šด์˜ ์„ธ๊ณ„๋Š” ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋งŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. replace๋ฅผ ์Œ“์•„ ๋‚˜๊ฐ„๋‹ค๋Š” ์ƒ๊ฐ์—๋Š” ๋ณ€ํ•จ์ด ์—†์—ˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์นœ ๋ฌธ๋ฒ•์ด๋‚˜ ๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•  ๊ฒƒ์ธ์ง€์™€ ๊ฐ™์€ ๊ฐ์ข… ์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์„ ์–ด๋–ป๊ฒŒ ํ”ผํ•ด์„œ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒŒ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ์šฉ๋ฌธ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ์ฃ .

Untitled

์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ๋งค ๋ฒˆ ๊นƒํ—ˆ๋ธŒ์— ์ง์ ‘ ์ž…๋ ฅํ•ด ๋ณด๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งž์ถฐ ํŠœ๋‹์„ ํ•˜๋Š๋‹ˆ, ์ฐจ๋ผ๋ฆฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฒด๊ณ„๋ฅผ ์žก๊ณ  ๊ฐ€์ž๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด GFM ์ŠคํŽ™ ๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉฐ ๋ฌธ๋ฒ•๋“ค์„ ์ •๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์€ ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ค„ ์ „์ฒด์— ์ ์šฉ๋˜๋Š” Block ๋ฌธ๋ฒ•๊ณผ ์ค„์˜ ์ผ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋˜๋Š” Inline ๋ฌธ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • Block ๋ฌธ๋ฒ•์€ ๋ถ€๋ถ„์ ์œผ๋กœ Inline ๋ฌธ๋ฒ•์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Block ๋ฌธ๋ฒ• ์—ญ์‹œ ๋‹ค๋ฅธ Block์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” Container Blocks์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ Leaf Blocks๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์ง„์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ทœ์น™์„ ์ •๋ฆฌํ•˜๊ณ , ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ทœ์น™๋“ค์„ ๋”ฐ๋กœ ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๊ฒƒ๋“ค์„ ์ด์šฉํ•ด์„œ ๊ฐ ๋ฌธ๋ฒ•๋“ค์„ ๊ตฌํ˜„ํ•˜๊ณ , Container Blocks โ†’ Leaf Blocks โ†’ Inlines ์ˆœ์„œ๋Œ€๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export function doParse(str: string): string {
+

Untitled

๊ทธ๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์ €๋ฒˆ ํฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ์‚ฌ์ง„์ž…๋‹ˆ๋‹ค. ๋Œ€์ถฉ ์ด๋Ÿฐ ๋Š๋‚Œ์œผ๋กœ replace๋ฅผ ์Œ“์•„ ๋‚˜๊ฐ€๋ฉด ๋˜์ง€ ์•Š์„๊นŒ์š”?

๐Ÿ“ ๋ญ๋“  ๊ณ„ํš์„ ์„ธ์šฐ์ž

ํ•˜์ง€๋งŒ ๋งˆํฌ๋‹ค์šด์˜ ์„ธ๊ณ„๋Š” ๊ทธ๋ ‡๊ฒŒ ๋งŒ๋งŒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. replace๋ฅผ ์Œ“์•„ ๋‚˜๊ฐ„๋‹ค๋Š” ์ƒ๊ฐ์—๋Š” ๋ณ€ํ•จ์ด ์—†์—ˆ์ง€๋งŒ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์นœ ๋ฌธ๋ฒ•์ด๋‚˜ ๊ฐ™์€ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์–ด๋–ป๊ฒŒ ๊ตฌ๋ณ„ํ•  ๊ฒƒ์ธ์ง€์™€ ๊ฐ™์€ ๊ฐ์ข… ์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์„ ์–ด๋–ป๊ฒŒ ํ”ผํ•ด์„œ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒŒ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ์šฉ๋ฌธ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ์ฃ .

Untitled

์ด๋Ÿฐ ๋ณต์žกํ•œ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ๋งค ๋ฒˆ ๊นƒํ—ˆ๋ธŒ์— ์ง์ ‘ ์ž…๋ ฅํ•ด ๋ณด๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งž์ถฐ ํŠœ๋‹์„ ํ•˜๋Š๋‹ˆ, ์ฐจ๋ผ๋ฆฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฒด๊ณ„๋ฅผ ์žก๊ณ  ๊ฐ€์ž๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด GFM ์ŠคํŽ™ ๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉฐ ๋ฌธ๋ฒ•๋“ค์„ ์ •๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Untitled

๊ฒฐ๊ณผ์ ์œผ๋กœ ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์€ ํฌ๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ค„ ์ „์ฒด์— ์ ์šฉ๋˜๋Š” Block ๋ฌธ๋ฒ•๊ณผ ์ค„์˜ ์ผ๋ถ€๋ถ„์—๋งŒ ์ ์šฉ๋˜๋Š” Inline ๋ฌธ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • Block ๋ฌธ๋ฒ•์€ ๋ถ€๋ถ„์ ์œผ๋กœ Inline ๋ฌธ๋ฒ•์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Block ๋ฌธ๋ฒ• ์—ญ์‹œ ๋‹ค๋ฅธ Block์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š” Container Blocks์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ Leaf Blocks๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์ง„์— ๋ณด์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ ๋ฌธ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ทœ์น™์„ ์ •๋ฆฌํ•˜๊ณ , ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ทœ์น™๋“ค์„ ๋”ฐ๋กœ ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๊ฒƒ๋“ค์„ ์ด์šฉํ•ด์„œ ๊ฐ ๋ฌธ๋ฒ•๋“ค์„ ๊ตฌํ˜„ํ•˜๊ณ , Container Blocks โ†’ Leaf Blocks โ†’ Inlines ์ˆœ์„œ๋Œ€๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

export function doParse(str: string): string {
   let result = str;
   result = blockQuote(result);
   result = emptyLines(result);
@@ -41,7 +41,7 @@
   result = link(result);
   return result;
 }
-

โš’ ์ข€ ๋” ๊ฐœ์„ ํ•ด๋ณด์ž

์ ์šฉ ๋ฒ”์œ„๊ฐ€ ํฐ ๋ฌธ๋ฒ•๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•ด ๋‚˜๊ฐ์œผ๋กœ์จ inline๋ฌธ๋ฒ• ์•ˆ์— block๋ฌธ๋ฒ•์ด ์ ์šฉ๋œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜์˜€๊ณ , ๊ฐ ์ค„์„ div ํƒœ๊ทธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹œ์ ์„ ์กฐ์ ˆํ•ด์„œ ์ •๊ทœํ‘œํ˜„์‹์˜ div๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ ๋“ค์–ด๊ฐ€๋„๋ก ๋” ์˜จ์ „ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ codeBlock๊ณผ link, image์˜ URL์€ ๋งˆํฌ๋‹ค์šด์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ underline์ด๋‚˜ bold๊ฐ™์€ ๋ฌธ๋ฒ•์ด ์ ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฒซ ๋ณ€ํ™˜์‹œ placeholder ์—ญํ• ์„ ํ•˜๋Š”, ์ผ๋ฐ˜์ ์œผ๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ , ์›๋ณธ ํ…์ŠคํŠธ๋ฅผ ๋งˆ์ง€๋ง‰์— ๋‹ค์‹œ ์žฌ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ ์ค‘๊ฐ„์— ์—ฐ์†๋˜๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ pipe ํ•จ์ˆ˜๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

export function doParse(str: string): string {
+

โš’ ์ข€ ๋” ๊ฐœ์„ ํ•ด๋ณด์ž

์ ์šฉ ๋ฒ”์œ„๊ฐ€ ํฐ ๋ฌธ๋ฒ•๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉํ•ด ๋‚˜๊ฐ์œผ๋กœ์จ inline๋ฌธ๋ฒ• ์•ˆ์— block๋ฌธ๋ฒ•์ด ์ ์šฉ๋œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜์˜€๊ณ , ๊ฐ ์ค„์„ div ํƒœ๊ทธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์‹œ์ ์„ ์กฐ์ ˆํ•ด์„œ ์ •๊ทœํ‘œํ˜„์‹์˜ div๊ฐ€ ํ•„์š”ํ•œ ๋ถ€๋ถ„์—๋งŒ ๋“ค์–ด๊ฐ€๋„๋ก ๋” ์˜จ์ „ํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ codeBlock๊ณผ link, image์˜ URL์€ ๋งˆํฌ๋‹ค์šด์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„์•ผ ํ•˜๋Š”๋ฐ underline์ด๋‚˜ bold๊ฐ™์€ ๋ฌธ๋ฒ•์ด ์ ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ฒซ ๋ณ€ํ™˜์‹œ placeholder ์—ญํ• ์„ ํ•˜๋Š”, ์ผ๋ฐ˜์ ์œผ๋กœ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ•˜๊ณ , ์›๋ณธ ํ…์ŠคํŠธ๋ฅผ ๋งˆ์ง€๋ง‰์— ๋‹ค์‹œ ์žฌ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ ์ค‘๊ฐ„์— ์—ฐ์†๋˜๋Š” ๋ณ€ํ™˜ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ pipe ํ•จ์ˆ˜๋กœ ๋ฌถ์–ด์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”.

export function doParse(str: string): string {
   let result = str;
   let codes: string[] = [];
   let links: string[] = [];
@@ -71,10 +71,10 @@
 
   return result;
 }
-

๐Ÿ”ฅ ๋งˆ์น˜๋ฉฐ

dhkstjd.gif

์ฒ˜์Œ์— ์‹œ์ž‘ํ•  ๋•Œ์—๋Š” ๋ฌด์ฒ™ ๊ฑฐ์ฐฝํ•˜๊ฒŒ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ํˆฌ๋ฐ•ํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ญ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํž˜์„ ๋นŒ๋ฆฌ์ง€ ์•Š๊ณ  ์ด ์ •๋„๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๋ฐ ์˜์˜๋ฅผ ๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—๋””ํ„ฐ๊ฐ™์€ ๋ถ€๋ถ„์€ ์ฐพ์•„ ๋ณผ์ˆ˜๋ก ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด์„œ ์•„์‰ฌ์›€์ด ๋” ๋งŽ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ๋˜๋ฉด undo ๊ธฐ๋Šฅ๋„ ๊ตฌํ˜„ํ•˜๊ณ , ์ด๊ฒƒ์ €๊ฒƒ ๋” ๊ฐœ์„ ํ•ด ๋ณด๊ณ  ์‹ถ๋„ค์š”.

์ง€๊ธˆ๊นŒ์ง€ ๋ชจํ—ค์œฐ์˜ ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ณผ์ •์ด์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“– Refs.

GitHub Flavored Markdown Spec
markedjs/marked

 ยฉ 2024 PrayinforRain. +

๐Ÿ”ฅ ๋งˆ์น˜๋ฉฐ

dhkstjd.gif

์ฒ˜์Œ์— ์‹œ์ž‘ํ•  ๋•Œ์—๋Š” ๋ฌด์ฒ™ ๊ฑฐ์ฐฝํ•˜๊ฒŒ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ์ƒ๊ฐ๋ณด๋‹ค ํˆฌ๋ฐ•ํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋ญ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํž˜์„ ๋นŒ๋ฆฌ์ง€ ์•Š๊ณ  ์ด ์ •๋„๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๋ฐ ์˜์˜๋ฅผ ๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—๋””ํ„ฐ๊ฐ™์€ ๋ถ€๋ถ„์€ ์ฐพ์•„ ๋ณผ์ˆ˜๋ก ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์–ด์„œ ์•„์‰ฌ์›€์ด ๋” ๋งŽ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์‹œ๊ฐ„์ด ๋˜๋ฉด undo ๊ธฐ๋Šฅ๋„ ๊ตฌํ˜„ํ•˜๊ณ , ์ด๊ฒƒ์ €๊ฒƒ ๋” ๊ฐœ์„ ํ•ด ๋ณด๊ณ  ์‹ถ๋„ค์š”.

์ง€๊ธˆ๊นŒ์ง€ ๋ชจํ—ค์œฐ์˜ ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ ๊ณผ์ •์ด์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“– Refs.

GitHub Flavored Markdown Spec
markedjs/marked

+Hugo.
\ No newline at end of file diff --git a/posts/2022/12/prevent-sidebar-blinking/index.html b/posts/2022/12/prevent-sidebar-blinking/index.html index ac084af..8ceb3e5 100644 --- a/posts/2022/12/prevent-sidebar-blinking/index.html +++ b/posts/2022/12/prevent-sidebar-blinking/index.html @@ -1,7 +1,7 @@ ์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผ | PrayinForRain.dev -

์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผ

Table of Contents

๋ชจํ—ค์œฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ Next.js๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” NestJS๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, SSR์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”.

๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ memoization์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ Next.js 13์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ–ˆ๋˜ ์•„ํ”ˆ ์ƒ์ฒ˜๋ฅผ ์ž๊ทนํ•˜๊ณ  ์žˆ์–ด์„œ ๋ชจํ—ค์œฐ์—๋„ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿคท TL;DR

  • useMemo๋กœ memoizationํ•˜์—ฌ๋„ context ๊ฐ’์„ ์ฐธ์กฐํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋‚˜ React DevTools๋ฅผ ํ†ตํ•ด ๋ฆฌ๋ Œ๋”๋ง ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Next.js์—์„œ /pages/_app.tsx์— ๋“ค์–ด๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐฉ์ง€๋œ๋‹ค.

๐Ÿค” ์‚ฌ์ด๋“œ๋ฐ”์˜ ํ˜„์žฌ ์ƒํ™ฉ

๋ชจํ—ค์œฐ์€ Next.js๊ฐ€ ์š”๊ตฌํ•˜๋Š” ๋Œ€๋กœ pages ๋””๋ ‰ํ† ๋ฆฌ์— ๊ฐ ํŽ˜์ด์ง€์˜ ๋ ˆ์ด์•„์›ƒ์„ ์ปดํฌ๋„ŒํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ์š”.

// index.tsx
 export default function Home() {
   return (
     <AuthGuard>
@@ -12,7 +12,7 @@
     </AuthGuard>
   );
 }
-

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‹์˜ ๊ตฌํ˜„์€ ํ•œ ๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด..

befe.gif

๋ฐ”๋กœ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฝ์ž…๋˜์–ด ๋ผ์šฐํŒ…์ด ์ผ์–ด๋‚  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง์ด ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ธ๋ฐ์š”, ์–ด์ฐจํ”ผ ๋˜‘๊ฐ™์ด ์ƒ๊ธด ์‚ฌ์ด๋“œ๋ฐ”์ธ๋ฐ ๋ช‡ ๋ฒˆ์ด๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ ์ ์ผ ๋ฟ ์•„๋‹ˆ๋ผ, ์›€์งค์—์„œ ๋ณด์ด๋“ฏ์ด ์ˆœ๊ฐ„์ ์ธ ๊นœ๋นก์ž„์ด ๊ณ„์†๋˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์•„์ง ๊ธฐ๋Šฅ์ด ๋งŽ์ง€ ์•Š์•„ ๋ Œ๋”๋ง ๋ช‡ ๋ฒˆ ๋” ํ•œ๋‹ค๊ณ  ์–ต์šธํ•  ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊นœ๋นก์ž„์€ ์กฐ๊ธˆ ์ฐธ๊ธฐ๊ฐ€ ํž˜๋“ค๊ตฐ์š”.

๐Ÿ“ ๋ฉ”๋ชจ์•ผ ๋„์™€์ค˜

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ์š”? ์ผ๋‹จ ์ €๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ธ€์ด ์„ค๋ช…ํ•œ ๋Œ€๋กœ useMemo๋ฅผ ํ†ตํ•ด ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ memoizeํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฉˆ์ถ”์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์— ์‚ฌ์ด๋“œ๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์กฐ๋ฆฌ Memo๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ ๋ฆฌ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ง€๋ฅผ ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ์š”? ๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” React Devtools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์ ์šฉํ•ด์„œ ๊ฐ™์ด ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

memo.gif

์Œ.. ์ดˆ๋ก ์„ ์ด ๋งˆ๊ตฌ ๊ทธ์–ด ์ง€๋Š” ๊ฑธ ๋ณด๋‹ˆ ๋ Œ๋”๋ง๋„ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ณ , ์‹ค์ œ๋กœ๋„ ๊นœ๋นก์ž„์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ 2022๋…„์— ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๊นœ๋นก์ด๋Š” ์›น์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฑธ๊นŒ์š”? ์ •๋ง ์†์ƒํ•˜๊ตฐ์š”.

๊ทธ๋Ÿฐ๋ฐ ์ œ๊ฐ€ ๋ดค๋˜ ๊ธ€์—๋Š” ์ด๋Ÿฐ ๋‚ด์šฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Context์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด React.memo๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ memoizatonํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ด์š”.

์‚ฌ์ด๋“œ๋ฐ”์—์„œ Recoil์„ ํ†ตํ•ด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์ง€๋งŒ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ด๋„ ์—ฌ์ „ํžˆ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™์•˜๊ณ , ์ €๋Š” ๊ฒฐ๊ตญ Next.js 13๋•Œ CSS-in-JS๊ฐ€ Context API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋˜ ๊ธฐ์–ต์ด ๋– ์˜ฌ๋ผ, ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋˜ Emotion๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํฌ๋ง์„ ํฌ๊ธฐํ•˜๊ฒŒ ๋˜๋Š”๊ตฌ๋‚˜, ํ•˜๊ณ  ์ฒด๋…์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ชจ์…˜ ์š”๋†ˆ ํ•˜๋‚˜ ๋•Œ๋ฌธ์— ์žƒ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋งŽ๊ตฐ์š”.

โžก๏ธ Next์•ผ ๋‚˜๋Š” ๋„ˆ๋ฅผ ๋ฏฟ์—ˆ์–ด

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํฌ๊ธฐํ•˜๋ฉด ์—ฌํƒœ ์“ด ๊ธ€๊ณผ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์•„๊นŒ์› ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์• ๋งคํ–ˆ๊ณ  ์•„์‰ฌ์šด ๋งˆ์Œ์— ๊ฒ€์ƒ‰์„ ํ•˜๋˜ ์ค‘ ๋ช‡ ๊ฐ€์ง€ ๊ธ€๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

You can wrap your page component with yourย Layoutย component insideย _app.js +

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‹์˜ ๊ตฌํ˜„์€ ํ•œ ๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ตฌํ˜„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด..

befe.gif

๋ฐ”๋กœ ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฝ์ž…๋˜์–ด ๋ผ์šฐํŒ…์ด ์ผ์–ด๋‚  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ Œ๋”๋ง์ด ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋ฌธ์ œ์ธ๋ฐ์š”, ์–ด์ฐจํ”ผ ๋˜‘๊ฐ™์ด ์ƒ๊ธด ์‚ฌ์ด๋“œ๋ฐ”์ธ๋ฐ ๋ช‡ ๋ฒˆ์ด๊ณ  ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ ์ ์ผ ๋ฟ ์•„๋‹ˆ๋ผ, ์›€์งค์—์„œ ๋ณด์ด๋“ฏ์ด ์ˆœ๊ฐ„์ ์ธ ๊นœ๋นก์ž„์ด ๊ณ„์†๋˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์•„์ง ๊ธฐ๋Šฅ์ด ๋งŽ์ง€ ์•Š์•„ ๋ Œ๋”๋ง ๋ช‡ ๋ฒˆ ๋” ํ•œ๋‹ค๊ณ  ์–ต์šธํ•  ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊นœ๋นก์ž„์€ ์กฐ๊ธˆ ์ฐธ๊ธฐ๊ฐ€ ํž˜๋“ค๊ตฐ์š”.

๐Ÿ“ ๋ฉ”๋ชจ์•ผ ๋„์™€์ค˜

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ์š”? ์ผ๋‹จ ์ €๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ๊ธ€์ด ์„ค๋ช…ํ•œ ๋Œ€๋กœ useMemo๋ฅผ ํ†ตํ•ด ์‚ฌ์ด๋“œ๋ฐ”๋ฅผ memoizeํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฉˆ์ถ”์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์— ์‚ฌ์ด๋“œ๋ฐ” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ชจ์กฐ๋ฆฌ Memo๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ ๋ฆฌ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ง€๋ฅผ ์กฐ๊ธˆ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ์š”? ๋ฆฌ์•กํŠธ์—์„œ ์ œ๊ณตํ•˜๋Š” React Devtools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ์ ์šฉํ•ด์„œ ๊ฐ™์ด ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

memo.gif

์Œ.. ์ดˆ๋ก ์„ ์ด ๋งˆ๊ตฌ ๊ทธ์–ด ์ง€๋Š” ๊ฑธ ๋ณด๋‹ˆ ๋ Œ๋”๋ง๋„ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ณ , ์‹ค์ œ๋กœ๋„ ๊นœ๋นก์ž„์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ 2022๋…„์— ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ๊นœ๋นก์ด๋Š” ์›น์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฑธ๊นŒ์š”? ์ •๋ง ์†์ƒํ•˜๊ตฐ์š”.

๊ทธ๋Ÿฐ๋ฐ ์ œ๊ฐ€ ๋ดค๋˜ ๊ธ€์—๋Š” ์ด๋Ÿฐ ๋‚ด์šฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Context์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด React.memo๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ memoizatonํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•ด์š”.

์‚ฌ์ด๋“œ๋ฐ”์—์„œ Recoil์„ ํ†ตํ•ด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ์ง€๋งŒ ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ด๋„ ์—ฌ์ „ํžˆ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™์•˜๊ณ , ์ €๋Š” ๊ฒฐ๊ตญ Next.js 13๋•Œ CSS-in-JS๊ฐ€ Context API๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋˜ ๊ธฐ์–ต์ด ๋– ์˜ฌ๋ผ, ๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๋˜ Emotion๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํฌ๋ง์„ ํฌ๊ธฐํ•˜๊ฒŒ ๋˜๋Š”๊ตฌ๋‚˜, ํ•˜๊ณ  ์ฒด๋…์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ชจ์…˜ ์š”๋†ˆ ํ•˜๋‚˜ ๋•Œ๋ฌธ์— ์žƒ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋งŽ๊ตฐ์š”.

โžก๏ธ Next์•ผ ๋‚˜๋Š” ๋„ˆ๋ฅผ ๋ฏฟ์—ˆ์–ด

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํฌ๊ธฐํ•˜๋ฉด ์—ฌํƒœ ์“ด ๊ธ€๊ณผ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์•„๊นŒ์› ์Šต๋‹ˆ๋‹ค. ์ƒˆ ์ด์Šˆ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์• ๋งคํ–ˆ๊ณ  ์•„์‰ฌ์šด ๋งˆ์Œ์— ๊ฒ€์ƒ‰์„ ํ•˜๋˜ ์ค‘ ๋ช‡ ๊ฐ€์ง€ ๊ธ€๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

You can wrap your page component with yourย Layoutย component insideย _app.js , it should prevent it from re-mounting.

์ •๋‹ต์€ Next.js๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ตฐ์š”. ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ• ๋•Œ ์‚ฌ์šฉ๋˜๋Š” _app.tsx์— ๋‹ฌ์•„ ๋†“์€ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ฐ๊ฐ ๋‹ฌ๋ ค์žˆ๋Š” Frame๊ณผ SideBar ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  _app.tsx๋กœ ์ด์ „ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ์š”, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ณตํ†ต๋œ ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์ด์ ๊นŒ์ง€ ์ฑ™๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// _app.tsx
 export default function App({ Component, pageProps }: AppProps) {
   return (
@@ -53,10 +53,10 @@
     </ThemeProvider>
   );
 }
-

_app.tsx๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , pages ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  SideBar๋ฅผ importํ•˜๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋” ๋งŽ์•„์ง€๊ณ  ๋‚˜์„œ ํ–ˆ์œผ๋ฉด ์†๋ชฉ์— ๋ฌด๋ฆฌ๊ฐ€ ์™”์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก CSS-in-JS๋Š” React DevTools์—์„œ ๋ Œ๋”๋ง ์ •๋ณด๋ฅผ ์ž˜๋ชป ๋ณด์—ฌ์ค€๋‹ค?
์ •ํ™•ํ•˜์ง€๋Š” ์•Š์€ ์ •๋ณด์ด์ง€๋งŒ, React DevTools๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์ •๋ณด๊ฐ€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฆฌ๋ Œ๋”๋ง ์ƒํ™ฉ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋ Œ๋”๋ง โ†’ ํŽ˜์ธํŠธ ํ”Œ๋ž˜์‹œ๋ฅผ ์ฒดํฌํ•ด์„œ ํ™•์ธํ•˜๋ผ๊ณ  ํ•˜๋„ค์š”.
๋ฆฌ์•กํŠธ ๋ฐ๋ธŒํˆด๊ณผ์˜ ์ฐจ์ด๋Š” ๋ฆฌ์•กํŠธ์˜ virtual render์™€ ๋ธŒ๋ผ์šฐ์ €์˜ native rerender๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฐจ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ข€ ๋” ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ž…๋‹ˆ๋‹ค.
Untitled

aftr.gif

๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ํ”Œ๋ž˜์‹œ๋ฅผ ์ฒดํฌํ•˜๊ณ  ํ™•์ธํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. gif ํŒŒ์ผ์„ ๊ณ„์† ํ•˜์ด๋ผ์ดํŠธํ•ด์„œ ์ •์‹ ์ด ์‚ฌ๋‚ฉ์ง€๋งŒ, ์•„๋ฌดํŠผ ์šฐ์ธก์˜ ๋ฉ”์ธ ์„น์…˜์ด ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๋™์•ˆ ์‚ฌ์ด๋“œ๋ฐ” ๋งŒํผ์€ ํ•œ ๋ฒˆ์˜ ๊นœ๋นก๊ฑฐ๋ฆผ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ข€ ๋‚ซ๋„ค์š”!

๐Ÿ“– Refs.

re rendering conditions
Next js how to avoid re-rendering of common components between routed pages?
NEXT JS - How to prevent layout get re-mounted?
How to prevent parent component from re-rendering with React (next.js) SSR two-pass rendering?
๋„ค?? Component๋ฅผ memoizationํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค๊ตฌ์š”..?? ๐Ÿ’ฆ (feat. context)

 ยฉ 2024 PrayinforRain. +

_app.tsx๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , pages ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  SideBar๋ฅผ importํ•˜๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋” ๋งŽ์•„์ง€๊ณ  ๋‚˜์„œ ํ–ˆ์œผ๋ฉด ์†๋ชฉ์— ๋ฌด๋ฆฌ๊ฐ€ ์™”์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก CSS-in-JS๋Š” React DevTools์—์„œ ๋ Œ๋”๋ง ์ •๋ณด๋ฅผ ์ž˜๋ชป ๋ณด์—ฌ์ค€๋‹ค?
์ •ํ™•ํ•˜์ง€๋Š” ์•Š์€ ์ •๋ณด์ด์ง€๋งŒ, React DevTools๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๋ฆฌ๋ Œ๋”๋ง ์ •๋ณด๊ฐ€ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฆฌ๋ Œ๋”๋ง ์ƒํ™ฉ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋ Œ๋”๋ง โ†’ ํŽ˜์ธํŠธ ํ”Œ๋ž˜์‹œ๋ฅผ ์ฒดํฌํ•ด์„œ ํ™•์ธํ•˜๋ผ๊ณ  ํ•˜๋„ค์š”.
๋ฆฌ์•กํŠธ ๋ฐ๋ธŒํˆด๊ณผ์˜ ์ฐจ์ด๋Š” ๋ฆฌ์•กํŠธ์˜ virtual render์™€ ๋ธŒ๋ผ์šฐ์ €์˜ native rerender๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ฐจ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ข€ ๋” ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์–ด ๋ณด์ž…๋‹ˆ๋‹ค.
Untitled

aftr.gif

๋ธŒ๋ผ์šฐ์ €์˜ ํŽ˜์ธํŠธ ํ”Œ๋ž˜์‹œ๋ฅผ ์ฒดํฌํ•˜๊ณ  ํ™•์ธํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. gif ํŒŒ์ผ์„ ๊ณ„์† ํ•˜์ด๋ผ์ดํŠธํ•ด์„œ ์ •์‹ ์ด ์‚ฌ๋‚ฉ์ง€๋งŒ, ์•„๋ฌดํŠผ ์šฐ์ธก์˜ ๋ฉ”์ธ ์„น์…˜์ด ๊ณ„์† ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๋™์•ˆ ์‚ฌ์ด๋“œ๋ฐ” ๋งŒํผ์€ ํ•œ ๋ฒˆ์˜ ๊นœ๋นก๊ฑฐ๋ฆผ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ์ž‘๋™ํ•จ์„ ํ™•์ธํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ข€ ๋‚ซ๋„ค์š”!

๐Ÿ“– Refs.

re rendering conditions
Next js how to avoid re-rendering of common components between routed pages?
NEXT JS - How to prevent layout get re-mounted?
How to prevent parent component from re-rendering with React (next.js) SSR two-pass rendering?
๋„ค?? Component๋ฅผ memoizationํ•ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค๊ตฌ์š”..?? ๐Ÿ’ฆ (feat. context)

+Hugo.
\ No newline at end of file diff --git a/posts/2023/01/browser-rendering-performance/index.html b/posts/2023/01/browser-rendering-performance/index.html index 971f58b..e31f8d5 100644 --- a/posts/2023/01/browser-rendering-performance/index.html +++ b/posts/2023/01/browser-rendering-performance/index.html @@ -1,19 +1,19 @@ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ | PrayinForRain.dev -

๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ

Table of Contents

๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง

์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Untitled

  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)
  • ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)
  • ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ ๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)
    • ๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ will-change๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!

์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

DocumentFragment๋ฅผ ์‚ฌ์šฉ

์•ž์— ์ •๋ฆฌํ•œ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ € ์„ฑ๋Šฅ์— ๊ฐ€์žฅ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ถ€๋ถ„์€ Reflow ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ฆ‰ Reflow์˜ ๋ฐœ์ƒ์„ ์ค„์ด๋ฉด ํฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋…ธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ•œ ๋ฒˆ์— ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ๋ ˆ์ด์•„์›ƒ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ํ–‰์— ๋Œ€ํ•ด Reflow๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. - ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ์ผ๋ถ€ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

๋”ฐ๋ผ์„œ ๋ชจ๋“  ์ˆ˜์ •์ด ์™„๋ฃŒ๋œ ํ›„์— ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์— ๋Œ€ํ•ด์„œ๋งŒ Reflow๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DocumentFragment๊ฐ€ ๊ทธ ํ•ด๊ฒฐ์ฑ… ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, DocumentFragment๋ž€ React์˜ ๋ฒ„์ถ”์–ผ DOM๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ, DOM๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ์‹ค์ œ HTML DOM์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” Document์˜ ๊ฐ€๋ฒผ์šด ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

DocumentFragment์€ ๋ Œ๋”๋ง ์ž์ฒด๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Reflow ๊ฑฑ์ • ์—†์ด ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DocumentFragment ๋‚ด๋ถ€์—์„œ ๋ ˆ์ด์•„์›ƒ์„ ๋ณ€๊ฒฝํ•˜๊ณ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์„ HTML DOM์— ์‚ฝ์ž…ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ Reflow ๋ฐœ์ƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

const documentFragment = new DocumentFragment();
 // const documentFragment = document.createDocumentFragment();
 
 const div = document.createElement("div");
 // do something...
 
 document.getElementById("parent-to-append").appendChild(documentFragment);
-

Canvas ์‚ฌ์šฉ

์ผ๋ฐ˜์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋‚ด์˜ ์š”์†Œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ์˜ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋งŽ์•„์ง‘๋‹ˆ๋‹ค. 9๊ฐœ์˜ div๊ฐ€ 3*3์œผ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ div์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋‚˜๋จธ์ง€ 8๊ฐœ์˜ div๋„ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๋ถ€๋ชจ ์š”์†Œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋‚ด๋ถ€์˜ ์š”์†Œ๋“ค๋งŒ ์žฌ๊ณ„์‚ฐ์ด ์ผ์–ด๋‚˜์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์‹œ๊ฐ ํšจ๊ณผ๋ฅผ ์—ฐ์ถœํ•˜๊ฑฐ๋‚˜, ๋งŽ์€ Element๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” canvas๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. canvas๋Š” ์ •ํ•ด์ง„ ์บ”๋ฒ„์Šค ์˜์—ญ ์•ˆ์—์„œ๋งŒ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Reflow๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

Refs.

JavaScript ์ตœ์ ํ™”: DOM ํ•ธ๋“ค๋ง ์†๋„ ๊ฐœ์„ 
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ˆœ์„œ์™€ ์›๋ฆฌ
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง
์ฃผ์†Œ์ฐฝ์— www.google.com์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •
DocumentFragment - Web API | MDN
Javascript - DocumentFragment๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž [์„ฑ๋Šฅ ์ตœ์ ํ™”]

+

Canvas ์‚ฌ์šฉ

์ผ๋ฐ˜์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋‚ด์˜ ์š”์†Œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ ˆ์ด์•„์›ƒ ๊ณ„์‚ฐ ๊ณผ์ •์—์„œ์˜ ๊ณ„์‚ฐ๋Ÿ‰์ด ๋งŽ์•„์ง‘๋‹ˆ๋‹ค. 9๊ฐœ์˜ div๊ฐ€ 3*3์œผ๋กœ ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ๊ทธ ์ค‘ ํ•˜๋‚˜์˜ div์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋‚˜๋จธ์ง€ 8๊ฐœ์˜ div๋„ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋œ ๋ถ€๋ชจ ์š”์†Œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ทธ ๋‚ด๋ถ€์˜ ์š”์†Œ๋“ค๋งŒ ์žฌ๊ณ„์‚ฐ์ด ์ผ์–ด๋‚˜์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์‹œ๊ฐ ํšจ๊ณผ๋ฅผ ์—ฐ์ถœํ•˜๊ฑฐ๋‚˜, ๋งŽ์€ Element๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋“ค์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” canvas๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. canvas๋Š” ์ •ํ•ด์ง„ ์บ”๋ฒ„์Šค ์˜์—ญ ์•ˆ์—์„œ๋งŒ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— Reflow๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

Refs.

JavaScript ์ตœ์ ํ™”: DOM ํ•ธ๋“ค๋ง ์†๋„ ๊ฐœ์„ 
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์ˆœ์„œ์™€ ์›๋ฆฌ
๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง
์ฃผ์†Œ์ฐฝ์— www.google.com์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •
DocumentFragment - Web API | MDN
Javascript - DocumentFragment๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž [์„ฑ๋Šฅ ์ตœ์ ํ™”]

-
 ยฉ 2024 PrayinforRain. +
+Hugo.
\ No newline at end of file diff --git a/posts/2023/01/css-display/index.html b/posts/2023/01/css-display/index.html index 7793074..be8f089 100644 --- a/posts/2023/01/css-display/index.html +++ b/posts/2023/01/css-display/index.html @@ -1,10 +1,10 @@ CSS์˜ display ์†์„ฑ | PrayinForRain.dev -

CSS์˜ display ์†์„ฑ

Table of Contents

CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

display:

๋ฐ”๊นฅ์ชฝ

Untitled

  • block
    • ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.
  • inline
    • ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ inline, block ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด block ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, inline ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. span๊ณผ pํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋˜ inline์˜ ๊ฒฝ์šฐ์—๋Š” ํฌ๊ธฐ๊ฐ€ ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ๋‚ด์šฉ์˜ ํฌ๊ธฐ๋งŒํผ๋งŒ์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์—, ๋”ฐ๋กœ width๋‚˜ height๋ฅผ ์ง€์ •ํ•ด๋„ ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ inline div๋Š” width: 500%;๋ฅผ ์ง€์ •ํ•œ ์ƒํƒœ์ด์ง€๋งŒ ํฌํ•จํ•œ ํ…์ŠคํŠธ์˜ ํฌ๊ธฐ๋งŒํผ๋งŒ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ inline ์†์„ฑ์˜ ํŠน์„ฑ์„ ๊ฐ–๋„๋ก ํ•˜๋Š” inline-block ์†์„ฑ์ด ์กด์žฌํ–ˆ์œผ๋‚˜, ์ด๋Š” ํ˜„์žฌ ๋ ˆ๊ฑฐ์‹œ๋กœ ๋ถ„๋ฅ˜๋˜์–ด inline flow-root๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ์ชฝ

์š”์†Œ๊ฐ€ ํฌํ•จํ•˜๋Š” ์ž์‹ ์š”์†Œ๋“ค์˜ ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•์„ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„ ์‹คํ—˜์  ๊ธฐ๋Šฅ์œผ๋กœ flow, ruby๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • flow-root
    • ์™ธ๋ถ€์— block, ๋‚ด๋ถ€์— float์ด ์ ์šฉ๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • table
    • <table> ํƒœ๊ทธ์˜ ๋‚ด๋ถ€์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • flex
  • grid

๊ถ๊ธˆ์ฆ๋“ค

inline-block์€ ์™œ ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ๋˜์—ˆ์„๊นŒ?

์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋ฐ”์™€ ๊ฐ™์ด inline-block์€ inline flow-root๋กœ ๋Œ€์ฒด๋˜์–ด ๋ ˆ๊ฑฐ์‹œ๋กœ ๋ถ„๋ฅ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ inline flow-root๋ผ๋Š” ์†์„ฑ์€ ๊ต‰์žฅํžˆ ์ƒ์†Œํ•ฉ๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์„๊นŒ์š”?

CSS2๊นŒ์ง€์˜ ์ŠคํŽ™์—์„œ๋Š” display์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐ”๊นฅ์ชฝ์— inline, ์•ˆ์ชฝ์— flex๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ inline-flex๊ฐ™์€ ๊ฐ’์„ ๋”ฐ๋กœ ์ •ํ•ด ๋‘๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๋Š”๋ฐ์š”, inline-block ์—ญ์‹œ ๊ทธ๋Ÿฐ ์ผ€์ด์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ CSS3์ด ๋‚˜์˜ค๋ฉด์„œ display์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐ’์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด์„œ ์ด๋Ÿฐ ๊ฐ’๋“ค์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด์ฃ .

๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์ด์ œ inline-block์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. MDN์—์„œ๋Š” display์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” CSS3์˜ ์ŠคํŽ™์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์–ธ๊ธ‰์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

The Level 3 specification details two values for theย displayย property โ€” enabling the specification of the outer and inner display type explicitly โ€” but this is not yet well-supported by browsers.

์ฆ‰, ์•„์ง ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์™„์ „ํžˆ ํ˜ธํ™˜๋˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— deprecated๊ฐ€ ์•„๋‹Œ legacy๋กœ ๋ถ„๋ฅ˜๋œ ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

visibility: hidden;๊ณผ display: none;์˜ ์ฐจ์ด๋Š”?

visibility: hidden;๊ณผ display: none;์€ ๋‘˜ ๋‹ค ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์†Œ๋ฅผ ๋ณด์ด์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” ์†์„ฑ์ด ๋‘ ๊ฐœ ์”ฉ์ด๋‚˜ ํ•„์š”ํ• ๊นŒ์š”? ๋‘˜์˜ ์ฐจ์ด์ ์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • visibility: hidden;์€ ์š”์†Œ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์€ ๋ณด์กด๋œ๋‹ค.
    • display: none;์€ ์•„์˜ˆ ํŽ˜์ด์ง€ ๋‚ด์—์„œ ์š”์†Œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•  ๋•Œ์—๋„ ํ•ด๋‹น ์š”์†Œ๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋ฐ์š”, ๋ฐ˜๋ฉด visibility: hidden์€ ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๊ณต๊ฐ„์€ ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„ ๋ ˆ์ด์•„์›ƒ์„ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ, ํ•ด๋‹น ๋ถ€๋ถ„์€ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • innerText๋กœ ์ ‘๊ทผํ–ˆ์„ ๋•Œ์˜ ์ฐจ์ด
    Untitled
    • innerText๋กœ ํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ผ๋ฐ˜์ ์ธ(๋ณด์ด๋Š”) ์ƒํƒœ์—์„œ, ๋‘ ๋ฒˆ์งธ๋Š” display: none;, ์„ธ ๋ฒˆ์งธ๋Š” visibility: hidden;์„ ์ ์šฉํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด innerHTML์€ ์…‹ ๋‹ค ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.

๋‘ ๋ฐฉ๋ฒ• ์™ธ์—๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์†Œ๋ฅผ ์ˆจ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ๊ด€์‹ฌ์ด ์žˆ์œผ์‹  ๋ถ„์€ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ๋„ ์—ฎ์—ฌ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [์ด ํฌ์ŠคํŠธ]๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด์‹œ๊ธธ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

Refs.

display - CSS: Cascading Style Sheets | MDN

CSS Display Module Level 3

์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ˆจ๊น€ ํ…์ŠคํŠธ

+Hugo. \ No newline at end of file diff --git a/posts/2023/01/ecmascript/index.html b/posts/2023/01/ecmascript/index.html index af6e565..a614150 100644 --- a/posts/2023/01/ecmascript/index.html +++ b/posts/2023/01/ecmascript/index.html @@ -1,11 +1,11 @@ ECMAScript | PrayinForRain.dev -

ECMAScript

Table of Contents

untitled

Ecma international

Ecma International is an industry association dedicated to the standardization of information and communication systems +Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. > https://www.ecma-international.org/

Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)

์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ECMA ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ Ecma๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.

Ecma๊ฐ€ ์ •์˜ํ•œ ํ‘œ์ค€์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ๋งํฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Standards - Ecma International

ECMAScript

ECMA์Šคํฌ๋ฆฝํŠธ๋ž€ ์•ž์—์„œ ์„ค๋ช…ํ•œ Ecma ์ธํ„ฐ๋‚ด์…”๋„์ด ์ •์˜ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(โ‰’์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด) ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์–ธ์–ด๋Š” ๊ณง ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ฆ‰ ECMAScript(ECMA-262)์— ์˜ํ•ด ํ‘œ์ค€ํ™”๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์–ผ๋งˆ ์ „์— ๋ฉด์ ‘์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ECMAScript์˜ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•œ ์–ธ์–ด๋ผ๊ณ  ์ด์•ผ๊ธฐํ–ˆ๋Š”๋ฐ, ์ด๋Š” ํ‹€๋ฆฐ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์—ญ์‚ฌ์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํƒ„์ƒ

untitled

๋„ท์Šค์ผ€์ดํ”„๋ฅผ ์•„์‹œ๋‚˜์š”? Internet Explorer๊ฐ€ ์„ธ์ƒ์„ ์ง€๋ฐฐํ•˜๊ธฐ ์ „์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ์ธํ„ฐ๋„ท ๋ธŒ๋ผ์šฐ์ €์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ํŒŒ์ด์–ดํญ์Šค๊ฐ€ ๋„ท์Šค์ผ€์ดํ”„์˜ ์—ญ์‚ฌ๋ฅผ ์ด์–ด๊ฐ€๊ณ  ์žˆ๋Š”๋ฐ์š”, ๋‹น์‹œ ์œ ๋ฃŒ์˜€๋˜ ๋„ท์Šค์ผ€์ดํ”„๋Š” ๋ฌด๋ฃŒ๋กœ ๋งˆ๊ตฌ๋งˆ๊ตฌ ๋ฐฐํฌ๋˜๋Š” IE์—๊ฒŒ ๋ฐ€๋ ค๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ๋ฐ”์™€ ๊ฐ™์ด HTML๊ณผ CSS๋งŒ์œผ๋กœ ์›นํŽ˜์ด์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์—๋Š” ๋ช…ํ™•ํ•œ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด์ฃ . ์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ๋„ท์Šค์ผ€์ดํ”„๋Š” 1995๋…„, ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ–ˆ๊ณ , ์ด ๊ฒƒ์ด ๋ธŒ๋ Œ๋˜ ์•„์ดํฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ „์‹ , ๋ชจ์นด(Mocha)์ž…๋‹ˆ๋‹ค. ๋ชจ์นด์˜ ์ด๋ฆ„์€ LiveScript๋ฅผ ๊ฑฐ์ณ ์ง€๊ธˆ์˜ JavaScript๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์œ ํ–‰ํ•œ Java์™€ ๋ฌธ๋ฒ•์ด ๋น„์Šทํ•˜๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜์—ฌ ๋งˆ์ผ€ํŒ… ์ „๋žต์„ ์„ธ์šด ๊ฒƒ์ด์ฃ .

JScript์˜ ๋“ฑ์žฅ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŒŒํŽธํ™”

๊ทธ ์ดํ›„ 1996๋…„์— ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์—ญ์‹œ IE์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœ ์ง€์› ๋ฟ ์•„๋‹ˆ๋ผ IE๋งŒ์˜ ๋…์ž์ ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์„œ ๋น„์Šทํ•˜์ง€๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๊ตฌํ˜„ํ–ˆ์ฃ . ์ด ์–ธ์–ด๋Š” JScript๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ๊ฐ€์žฅ ํฐ ํŠน์ง•์œผ๋กœ๋Š” ์œˆ๋„์šฐ์— ์ข…์†์ ์ด๋ฉฐ ์•…๋ช…๋†’์€ ActiveX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript์™€ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ์™„์ „ํ•˜๊ฒŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ๋˜ ์•„๋‹ˆ์˜€์Šต๋‹ˆ๋‹ค.

JavaScript์™€ JScript์˜ ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ, ์‚ฌ์šฉ์ž๋Š” ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ด์Šˆ๊ฐ€ ์ƒ๊ฒจ๋‚œ ๊ฒƒ์ด์ฃ . ๋”๊ตฐ๋‹ค๋‚˜ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ ๊ณต๊ฒฉ์ ์ธ ๋งˆ์ผ€ํŒ… ์ „๋žต์œผ๋กœ ์ธํ•ด JScript์˜ ์ ์œ ์œจ์€ ์ ์  ๋†’์•„์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒํŽธํ™” ๋ฌธ์ œ๊ฐ€ ์ ์  ์‹ฌํ™”๋˜์ž ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œ์ค€์ด ํ•„์š”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋„ท์Šค์ผ€์ดํ”„๋Š” Ecma International(๋‹น์‹œ ECMA)์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œ์ค€ํ™”๋ฅผ ์š”์ฒญํ•˜์˜€๊ณ , ๊ทธ๋ ‡๊ฒŒ ECMA-262๋ผ๋Š” ํ‘œ์ค€์ด ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, JavaScript๊ฐ€ ์ƒ๊ฒจ๋‚˜๊ณ , ํŒŒํŽธํ™” ํ˜„์ƒ์ด ์ผ์–ด๋‚˜์ž ์ด๋ฅผ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ECMAScript๊ฐ€ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์š”์•ฝํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

ECMAScript ๋ณ€์ฒœ์‚ฌ

ECMAScript๋Š” ์ง€๊ธˆ์— ์™€์„œ๋Š” ๊ฑฐ์˜ ๋งค ๋…„ ์ƒˆ ๋ฒ„์ „์ด ๋ฐฐํฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 2015๋…„๊นŒ์ง€๋Š” ES6์™€ ๊ฐ™์€ ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๋ฐฐํฌ ์ฃผ๊ธฐ๊ฐ€ ์—ฐ๋‹จ์œ„๋กœ ๋นจ๋ผ์ง€๋Š” ์ƒํ™ฉ์— ๋งž์ถ”์–ด ES2020๊ณผ ๊ฐ™์€ ๋„ค์ด๋ฐ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„˜๋ฒ„๋ง์€ ๋Œ€์ถฉ ES6 = ES2015์ดํ›„๋กœ 1๋…„์— 1์”ฉ ๋ฒ„์ „์ด ์˜ค๋ฅธ๋‹ค๊ณ  ์•Œ๊ณ  ๊ณ„์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒ์ถœํŒ์ผ์ด๋ฆ„์ด์ „ ํŒ๊ณผ์˜ ์ฐจ์ด์ 
11997๋…„ 6์›”์ดˆํŒ
21998๋…„ 6์›”ISO/IEC 16262 ๊ตญ์ œ ํ‘œ์ค€๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ ๊ทœ๊ฒฉ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ.
31999๋…„ 12์›”๊ฐ•๋ ฅํ•œ ์ •๊ทœ ํ‘œํ˜„์‹, ํ–ฅ์ƒ๋œ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ, ์ƒˆ๋กœ์šด ์ œ์–ด๋ฌธ , try/catch ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์—„๊ฒฉํ•œ ์˜ค๋ฅ˜ ์ •์˜, ์ˆ˜์น˜ํ˜• ์ถœ๋ ฅ์˜ ํฌ๋งคํŒ… ๋“ฑ.
4๋ฒ„๋ ค์ง4๋ฒˆ์งธ ํŒ์€ ์–ธ์–ด์— ์–ฝํžŒ ์ •์น˜์  ์ฐจ์ด๋กœ ์ธํ•ด ๋ฒ„๋ ค์กŒ๋‹ค. ์ด ํŒ์„ ์ž‘์—… ๊ฐ€์šด๋ฐ ์ผ๋ถ€๋Š” 5๋ฒˆ์งธ ํŒ์„ ์ด๋ฃจ๋Š” ๊ธฐ๋ณธ์ด ๋˜๊ณ  ๋‹ค๋ฅธ ์ผ๋ถ€๋Š” ECMA์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์„ ์ด๋ฃจ๊ณ  ์žˆ๋‹ค.
52009๋…„ 12์›”๋” ์ฒ ์ €ํ•œ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์˜ค๋ฅ˜ ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ํ”ผํ•˜๋Š” ํ•˜๋ถ€์ง‘ํ•ฉ์ธ “strict mode"๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. 3๋ฒˆ์งธ ํŒ์˜ ๊ทœ๊ฒฉ์— ์žˆ๋˜ ์ˆ˜๋งŽ์€ ์• ๋งคํ•œ ๋ถ€๋ถ„์„ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค.
5.12011๋…„ 6์›”ECMA์Šคํฌ๋ฆฝํŠธ ํ‘œ์ค€์˜ ์ œ 5.1ํŒ์€ ISO/IEC 16262:2011 ๊ตญ์ œ ํ‘œ์ค€ ์ œ3ํŒ๊ณผ ํ•จ๊ป˜ ํ•œ๋‹ค.
62015๋…„ 6์›”ECMAScript 2015 (ES2015)6ํŒ์—๋Š” ํด๋ž˜์Šค์™€ ๋ชจ๋“ˆ ๊ฐ™์€ ๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฌธ๋ฒ•์˜ ์˜๋ฏธ๋Š” 5ํŒ์˜ strict mode์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •์˜๋œ๋‹ค. ์ด ํŒ์€ “ECMAScript Harmony” ํ˜น์€ “ES6 Harmony” ๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฌ๊ธฐ๋„ ํ•œ๋‹ค.
72016๋…„ 6์›”ECMAScript 2016 (ES2016)์ œ๊ณฑ์—ฐ์‚ฐ์ž ์ถ”๊ฐ€, Array.prototype.includes
82017๋…„ 6์›”ECMAScript 2017 (ES2017)ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ธ์ž์—์„œ trailing commas ํ—ˆ์šฉ, Object values/entries ๋ฉ”์†Œ๋“œ, async/await ๋“ฑ.
92018๋…„ 6์›”ECMAScript 2018 (ES2018)Promise.finally, Async iteration, object rest/spread property ๋“ฑ.
102019๋…„ 6์›”ECMAScript 2019 (ES2019)Object.fromEntries, flat, flatMap, Symbol.description, optional catch ๋“ฑ.

๊ถ๊ธˆ์ฆ๋“ค

CommonJS๋Š” ๋ฌด์—‡์ผ๊นŒ?

์ง€๊ธˆ๊นŒ์ง€ ์ด์•ผ๊ธฐํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ด์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ๋ธŒ๋ผ์šฐ์ € ์—†์ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋…ผ์˜๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ด๋ฃจ์–ด์กŒ๊ณ , ์ด๋ฅผ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€์ด ์ œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒƒ์ด CommonJS์ด๊ณ , ์ด๋ฅผ ์ด์šฉํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด Node.js์ž…๋‹ˆ๋‹ค.

์•„.. ๋ณต์žกํ•ด์š” ์•„๋ž˜ ๊ธ€ ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”.. ๋‚˜์ค‘์— ๋” ์ฐพ์•„๋ณด๊ณ  ์ •๋ฆฌํ• ๊ฒŒ์š”.. ๊ทผ๋ฐ ์‚ฌ์‹ค ์ด๊ฒŒ ๋‹ค๋ผ์„œ ๋” ์ •๋ฆฌํ•ด์•ผ ํ•  ๋‚ด์šฉ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”. ES๋„ ๋ชจ๋“ˆํ™”๋ฅผ ์ฑ™๊ธฐ๊ธฐ ์œ„ํ•ด ESM์ด๋ผ๋Š” ํ‘œ์ค€์ด ์žˆ๋‹ค๋Š” ๊ฒƒ ์ •๋„?

[ JavaScript ] ES Modules ์ •๋ฆฌํ•˜๊ธฐ

Refs.

Ecma ์ธํ„ฐ๋‚ด์…”๋„ - ์œ„ํ‚ค๋ฐฑ๊ณผ
Ecma International
Introduction | PoiemaWeb
CommonJS
ES5 to ES6+
ECMAScript ์ŠคํŽ™ ์ฝ๋Š”๋ฒ•

+Hugo. \ No newline at end of file diff --git a/posts/2023/01/migrating-to-hugo/index.html b/posts/2023/01/migrating-to-hugo/index.html index 8a5b5f2..6f8761e 100644 --- a/posts/2023/01/migrating-to-hugo/index.html +++ b/posts/2023/01/migrating-to-hugo/index.html @@ -1,12 +1,12 @@ Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์ž | PrayinForRain.dev -

Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์ž

Table of Contents

์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

image

์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..

์‚ฌ์‹ค ์ €๋Š” ํ‹ฐ์Šคํ† ๋ฆฌ๋ฅผ ๋ฌด์ฒ™ ์ž˜ ์“ฐ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ ๋‹นํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๋˜๋ฉด์„œ, ์–ด๋ฆด ๋•Œ ์‚ฌ์šฉํ•˜๋˜ ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ์™€ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ณ , ๊ฐ์ข… ๋ถ„์„ ๊ธฐ๋Šฅ๊นŒ์ง€ ์•Œ์•„์„œ ์ œ๊ณตํ•ด ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ทธ๋Ÿฐ๋ฐ ๋ถ€์ŠคํŠธ์บ ํ”„๋ฅผ ๊ฒช์œผ๋ฉด์„œ ๋งŽ์€ ๊ฒƒ๋“ค์ด ๋‹ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ๋งˆํฌ๋‹ค์šด์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ฒ˜์Œ ๋ถ€์ŠคํŠธ์บ ํ”„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ์ข… ๋ฌธ์„œ๋ฅผ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ์–ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ณด๋‹ค๋„ ๋งˆํฌ๋‹ค์šด์„ ๋จผ์ € ๋ฐฐ์›Œ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ๋งˆํฌ๋‹ค์šด์˜ ์ฒซ ์ธ์ƒ์ด ๋„ˆ๋ฌด ํˆฌ๋ฐ•ํ•˜๊ณ  ๋ณ„๋กœ์˜€๋Š”๋ฐ.. ๋ฐ˜๋…„๋™์•ˆ ์ง€๋…ํ•˜๊ฒŒ ์—ฎ์ด๊ณ  hackmd๋‚˜ Notion๊ฐ™์€ ํˆด์— ์ต์ˆ™ํ•ด ์ง€๋ฉด์„œ ๋งˆํฌ๋‹ค์šด๊ณผ ์‚ฌ๋ž‘์— ๋น ์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ๋…ธ์…˜๋„ ์ •๋ง ๋ณ„๋กœ์˜€๋Š”๋ฐ ์ง€๊ธˆ์€ ์šฉ์ผ€ ์ž˜ ์“ฐ๊ณ  ์žˆ๋„ค์š”.

image

๊ฒฐ๊ตญ ์ œ ๋ถ€์ŠคํŠธ์บ ํ”„๋Š” ๋งˆํฌ๋‹ค์šด์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‹คํ•˜๋‹ค ์ €๋Š” ๋งˆ์ง€๋ง‰ ํŒ€ ํ”„๋กœ์ ํŠธ ์ฃผ์ œ๋ฅผ ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๋กœ ์žก๊ธฐ์— ์ด๋ฆ…๋‹ˆ๋‹ค. ์ด์œ ๋Š” ์ ๋‹นํžˆ ์–ด๋ ค์› ๊ณ , ์ ๋‹นํžˆ ๋„์ „์ ์ด์—ˆ๊ณ , GitHub PR๊ณผ ๋…ธ์…˜์„ ํ™œ์šฉํ•˜๋ฉด์„œ ๋งˆํฌ๋‹ค์šด ๋ฝ•(?)์— ์ทจํ•ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜๋‹ค ๋ณด๋‹ˆ, ๋Œ€์ถฉ ์จ๋„ ์ผ๊ด€์„ฑ ์žˆ๋Š” ์„œ์‹์œผ๋กœ ๊ฐ€๋…์„ฑ์„ ๋ณด์žฅํ•ด ์ฃผ๋Š” ์ ๋„ ๋„ˆ๋ฌด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋‹ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ํ•™์Šต์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ํ™œ์šฉํ•˜๋˜ ๋…ธ์…˜์€ ๋งˆํฌ๋‹ค์šด ๊ธฐ๋ฐ˜์ด์—ˆ๊ณ , ๊ทธ ์™ธ์— ๋‹ค๋ฅธ ํˆด๋“ค๋„ ๋งˆํฌ๋‹ค์šด์— ๋ฐ˜์ฏค ๊ฑธ์ณ ์žˆ์—ˆ๋Š”๋ฐ, ๋„ค์ด๋ฒ„, ๋‹ค์Œ์„ ํ•„๋‘๋กœ ํ•˜๋Š” ํ•œ๊ตญํ˜• ๋ธ”๋กœ๊ทธ๋“ค์€ ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋…ธ์…˜์œผ๋กœ ์ž‘์„ฑํ–ˆ๋˜ TIL ๋ฌธ์„œ๋ฅผ ํ‹ฐ์Šคํ† ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๋Š” ์‹œ๋„๋ฅผ ํ•ด ๋ณด์•˜์ง€๋งŒ ์ดˆ์•ˆ ์ž‘์„ฑ๊ณผ ๋น„์Šทํ•œ ๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ๋„ ๋งˆํฌ๋‹ค์šด ์—๋””ํ„ฐ๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ํ‹ฐ์Šคํ† ๋ฆฌ ์Šค์Šค๋กœ๊ฐ€ ์ผ๋ถ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Œ์„ ๊ฒฝ๊ณ ํ•˜๊ณ  ์žˆ์–ด์„œ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ๊ธฐ๋ณธ ์—๋””ํ„ฐ์™€์˜ ๋ณ€ํ™˜์ด ์›ํ™œํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•˜๋Š” ๋ฌธ๊ตฌ๊ฒ ์ง€๋งŒ, ๊ทธ ์™ธ์—๋„ ๋งˆํฌ๋‹ค์šด์œผ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•˜๋Š” ๊ณผ์ •์ด ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฌธ์ œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Why Hugo?

๊ทธ๋ ‡๊ฒŒ ์ €๋Š” ์ฃผ๋ณ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ธ”๋กœ๊ทธ ์˜ฎ๊ธด๋‹ค~ ์˜ฎ๊ธด๋‹ค ๋…ธ๋ž˜๋ฅผ ๋ถ€๋ฅด๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ์ƒˆํ•ด๊ฐ€ ๋˜์–ด์„œ์•ผ ์ด์ฃผ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. velog๋‚˜ medium๊ฐ™์€ ์„ ํƒ์ง€๋„ ์žˆ์—ˆ์ง€๋งŒ ์ €๋Š” ๊ธฐ์™• ํ•˜๋Š” ๊ฑฐ ๊นƒํ—ˆ๋ธŒ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์ž๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด prayinforrain.github.io๋ผ๋Š” URL์ด ๋„ˆ๋ฌด ๋ฉ‹์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์ด๋ฅผ ์œ„ํ•ด Javascript, API, Markup์˜ ์š”์†Œ๋ฅผ ์ด๋ฃจ๋Š” Jamstack์ด๋ผ๋Š” ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๊ณ , ๋Œ€์ถฉ ์•Œ์•„๋ณด๋‹ˆ Jamstack ์‚ฌ์ดํŠธ ์ƒ์„ฑ๊ธฐ์˜ ์ˆœ์œ„๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ–ˆ๊ณ , ๋งŽ์€.. ์ž‘์—…์ด ํ•„์š”ํ•จ์„ ์•Œ๊ณ  ์žˆ๋Š” Next.js๋ฅผ ์ œ์™ธํ•˜๊ณ  Jekyll, Hugo, Gatsby ์„ธ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ๋ˆˆ์— ๋•๋‹ˆ๋‹ค. ์ €๋Š” Hugo๋ฅผ ์„ ํƒํ–ˆ๊ณ , ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Jekyll์€ GitHub Pages์—์„œ ์ง์ ‘ ์ถ”์ฒœํ•˜๋Š” SSG์ด์ง€๋งŒ, ๋งž๋Š” ํ…Œ๋งˆ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
    • ๋‹ค์–‘ํ•œ ์‚ฌ์ดํŠธ์—, ๋‹ค์–‘ํ•œ ์–‘์‹์œผ๋กœ ํ…Œ๋งˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ์—ˆ๊ณ , ์ด ์ค‘์—์„œ ๋ฌด๋ฃŒ์ด๋ฉด์„œ ์ œ๊ฐ€ ์›ํ•˜๋Š” ํ…Œ๋งˆ๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๊ดด๋กœ์› ์Šต๋‹ˆ๋‹ค. ์ฝ”์–ด ๋ถ€๋ถ„์ด Ruby๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ œ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ๊ฐ–์ถ˜ ํ…Œ๋งˆ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜.. ์ผ๋ถ€ ํ…Œ๋งˆ ๋ฆฌ์ŠคํŠธ๋Š” ์‚ฌ์ดํŠธ ์ž์ฒด์˜ ๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•„ ์•„์˜ˆ ๋ ˆ๊ฑฐ์‹œ์ธ ๊ฒƒ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Gatsby๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.
    • React๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค๋Š” ์ ˆ๋Œ€๋กœ ๋ฌด์‹œํ•˜์ง€ ๋ชปํ•  ์ตœ๊ณ ์˜ ๊ฐ•์ ์ด ์žˆ์—ˆ์Œ์—๋„ ์ œ๊ฐ€ ๋งŒ์กฑํ• ๋งŒํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Gatsby๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ํ•œ๊ธ€ ๋ ˆํผ๋Ÿฐ์Šค์•ผ ๋ฌด์ฒ™ ๋งŽ์•˜์ง€๋งŒ.. ๊ธ€์„ ์“ฐ๋Š” ์ง€๊ธˆ์— ์™€์„œ๋Š” ๊ธฐ์–ต์ด ์ž˜ ๋‚˜์ง€ ์•Š๋Š” ์–ด๋–ค ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.(์–ต๊นŒ ์•„๋‹˜)
    • ์‚ฌ์‹ค ์ตœ๊ทผ์— ์ธํ”„๋Ÿฐ์˜ Gatsby ๊ฐ•์˜๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹ซ์„ ๋•Œ ์กฐ๊ธˆ์”ฉ ์ฝ๊ณ  ์žˆ๋Š”๋ฐ ์ถฉ๋ถ„ํžˆ ๋งˆ์Œ์— ๋“ค์—ˆ๋‹ค ์ƒ๊ฐ๋˜๋ฉด ๊ธˆ์„ธ ์—ฌ๊ธฐ๋กœ ์˜ฎ๊ธธ ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • Hugo๋Š” ํ…Œ๋งˆ ๋ชฉ๋ก์„ ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • Gatsby๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋‹ˆ, Jekyll๊ณผ Hugo์ค‘์—์„œ๋Š” Hugo์˜ ๋นŒ๋“œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ํ‰์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
    • ์ด ๊ฒƒ๋„ ํฌ์ŠคํŠธ๊ฐ€ ๋ช‡ ๋ฐฑ ๊ฐœ ์Œ“์ด๊ณ  ๋‚˜์„œ์˜ ๋ฌธ์ œ์ด์ง€๋งŒ ๊ทธ๋ƒฅ ๊ดœํžˆ ์„ฑ๋Šฅ์„ ์ค‘์‹œํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์ถฉ ์ด ์ •๋„๊นŒ์ง€ ์ •๋ฆฌํ•˜๊ณ  ๋‚˜์„œ, ๋ฌธ์„œ๋“ค์„ ์ญ‰ ์ฝ์–ด๋ณธ ํ›„์— Hugo๋ฅผ ์‚ฌ์šฉ์ค‘์ธ ์ง€์ธ๋ถ„๊ป˜ ์ด๋Ÿฐ์ €๋Ÿฐ ์งˆ๋ฌธ์„ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

image

์ œ๊ฐ€ ์‚ฌ๋žŒ ๋ณต ํ•˜๋‚˜๋Š”.. ๋๋‚ด์ค๋‹ˆ๋‹ค.

์•„๋ฌดํŠผ ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์ณ Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ๋˜ ๋”ฐ๋กœ ์“ธ ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค์š”. ์•ˆ ์“ธ ํ™•๋ฅ ์ด ์กฐ๊ธˆ ๋” ํด ๊ฒƒ ๊ฐ™์•„์š”.

๊ทธ๋ž˜์„œ ์ข‹์€๊ฐ€์š”?

image

์•„๋‹ˆ ์ด๊ฑธ ๋ญ˜ ํ•œ ๋‹ฌ ์”ฉ์ด๋‚˜..

์‚ฌ์‹ค 1์›” ์ดˆ์— ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ.. ์ง€๊ธˆ์€ ๋‚˜๋ฆ„ ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ณ ์น˜๊ณ  ์–ด์ฉŒ๊ณ  ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

์ต๋ช… ๋Œ“๊ธ€์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋ฌด์–ธ๊ฐ€์˜ ํ•™์Šต ์ •๋ฆฌ๋ฅผ ๋งˆ๊ตฌ๋งˆ๊ตฌ ํ–ˆ๋‹ค๊ณ  ์น˜๊ณ , ๊ฑฐ๊ธฐ์— ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์ ํ˜€์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ์‹œ๋‹ค. ๊ทธ๊ฑธ ๋ฐœ๊ฒฌํ•œ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ €์—๊ฒŒ ์ž˜๋ชป์„ ๋ฐ”๋กœ์žก์•„์ฃผ๊ณ  ์‹ถ์–ด์„œ ๋Œ“๊ธ€ ์ฐฝ์„ ๋ณด์ง€๋งŒ ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์„œ ๊ท€์ฐฎ์•„์„œ ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ€๊ธฐ๋กœ ํ•ฉ๋‹ˆ๋‹ค. +๊ทธ๋Ÿฐ ์ƒํ™ฉ์ด ์ƒ๊ธฐ๋ฉด ์•ˆ๋˜๋‹ˆ ์ต๋ช… ๋Œ“๊ธ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๋ฐ SSG ํŠน์„ฑ์ƒ ๊ทธ๊ฒŒ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— Firebase๋ฅผ ์ด์šฉํ•ด์„œ ์—ฐ๋™ํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ.. ๋‚˜์ค‘์— ์ œ๊ฐ€ ์ง์ ‘ Next.js๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ๋งŒ๋“ค๋ฉด ๊ผญ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋Œ€ํ•˜์ง€๋งŒ ์–ด๋”˜๊ฐ€ ๋‚˜์‚ฌ๋น ์ง„ ํ…Œ๋งˆ

์ œ๊ฐ€ ์“ฐ๊ณ  ์žˆ๋Š” Jane์ด๋ผ๋Š” ํ…Œ๋งˆ๋Š” ๊ธฐ๋ณธ์ด ๊ฝค ์ถฉ์‹คํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์•„์›ƒ์˜ ๋ณ€๊ฒฝ์„ ๊ฑฐ์˜ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ ์ค‘์ธ๋ฐ, ์ด ๋…€์„์˜ Quick Start ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผํ•˜๋‹ˆ ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ ํŒŒ์ผ์ด ignore๋˜์ง€ ์•Š๋Š”๋‹ค๋˜๊ฐ€, ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์œ„ํ•œ ๋ฒ„ํŠผ๋“ค์˜ ์ •๋ ฌ์ด๋‚˜ ํฌ๊ธฐ๊ฐ€ ์ œ๊ฐ๊ฐ์ด๋ผ๋˜๊ฐ€, ์ดํ•ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ผ๋ถ€ ํด๋” ๊ตฌ์กฐ๋ผ๋˜๊ฐ€.. ์ž”์ˆ˜์ •์„ ์ •๋ง์ •๋ง ๋งŽ์ด ํ–ˆ์Šต๋‹ˆ๋‹ค.

TOC์˜ ๋ฌธ์ œ

image

์™œ ํŠน์ • depth๋งŒ ํŒŒ๋ž—๊ฒŒ ์น ํ•˜๋Š”์ง€..

์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด ์šฐ์ธก์— Floating TOC(Table of Contents)๊ฐ€ ํ‘œ์‹œ๋˜๋Š”๋ฐ, ์ด ๋…€์„์ด ๋ฌธ์ œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ƒ๊ธด ๊ฒƒ๋„ ์กฐ๊ธˆ ๋ฌธ์ œ๊ณ , h2 ๋‚ด์ง€๋Š” h3 ํƒœ๊ทธ๋งŒ ํŒŒ์‹ฑํ•˜๋Š” ๋ชจ์–‘์ž…๋‹ˆ๋‹ค. h1๋„ ์•ˆ๋˜๊ณ , ๋” ๊นŠ์–ด๋„ ๋ชฉ์ฐจ์— ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. h1์€ ์ฐพ์•„๋ณด๋‹ˆ Hugo ์—”์ง„์ด ๊ณ ์˜์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ๋ชจ์–‘์ธ๋ฐ, ๋” ๊นŠ์ด๋Š” ์™œ ์•ˆ๋˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ผญ ๋„ฃ๊ณ  ์‹ถ์€ ๊ธฐ๋Šฅ์ด์—ˆ๋Š”๋ฐ ๋„ˆ๋ฌด ๋ชป์ƒ๊ธฐ๊ณ  ์ž‘๋™๋ฐฉ์‹์ด ๋ณ„๋กœ์—ฌ์„œ ๋ˆˆ๋ฌผ์„ ๋จธ๊ธˆ๊ณ  ํ•˜๋ฃจ์˜ ์ˆ˜์ •์‚ฌํ•ญ์„ ๋ชจ๋‘ ๋‚ ๋ ธ์Šต๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ๊ณ„ํš

image

์Œํ‰ํ•œ ์•ผ๋ง์ด ๋‹ด๊ธด ์š”๊ตฌ์‚ฌํ•ญ ๋ฆฌ์ŠคํŠธ

์šฐ์„ ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ˆ˜์ •ํ•œ ํ…Œ๋งˆ๊ฐ€ ์•„๊น๊ธฐ๋„ ํ•˜๊ณ , ์—„์ฒญ ํ‰์•…ํ•œ ์ˆ˜์ค€์˜ ๋ชป์ƒ๊น€์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ผ๋‹จ ์ด๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ๋‹ค์Œ ๋ธ”๋กœ๊ทธ๋กœ ๊ฐˆ์•„ํƒˆ ์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ฃผ์ €ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Gatsby๋ฅผ ์“ธ ๊ฒƒ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ , ์–ธ์  ๊ฐ€ ์ง์ ‘ ๋ธ”๋กœ๊ทธ ์—”์ง„์„ ๋งŒ๋“ค์–ด ๋ณผ ์ƒ๊ฐ์€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ž์„œ ๋งํ•œ ์ต๋ช… ๋Œ“๊ธ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๋‘์š”. ๊ทธ๋Ÿฌ๋ ค๋ฉด ์—„์ฒญ ๊ณต๋ถ€๋ฅผ ๋งŽ์ด ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”.. ์ฃผ๋ณ€ ๋ถ„๋“ค์—๊ฒ 5๋…„ ๊ณ„ํš์ด๋ผ๊ณ  ๋งํ–ˆ๋Š”๋ฐ ์ข€ ๋” ๊ธธ๊ฒŒ ๋ถ€๋ฅผ ๊ฑธ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.

Refs.

Site Generators - A List of Static Site Generators for Jamstack Sites
ํœด๊ณ  ๋ธ”๋กœ๊ทธ ๋งŒ๋“ค๊ธฐ
React ๊ธฐ๋ฐ˜ Gatsby๋กœ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๊ฐœ๋ฐœํ•˜๊ธฐ
๊ทธ๋ฆฌ๊ณ .. ์ €์˜ ๋œฌ๊ธˆ์—†๊ณ  ๊น๊นํ•œ ์งˆ๋ฌธ์— ์นœ์ ˆํ•˜๊ฒŒ ๋‹ตํ•ด์ฃผ์‹  @wcho21๋‹˜, ์–ธ์ œ๋‚˜ ๋ธ”๋กœ๊ทธ์— ์žˆ์–ด์„œ ํ”„๋กœ ๋งˆ์ธ๋“œ์ด์‹  @kasterra๋‹˜๊ป˜ ๊ฐ์‚ฌ ์ธ์‚ฌ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

+Hugo. \ No newline at end of file diff --git a/posts/2023/01/size-units-in-css/index.html b/posts/2023/01/size-units-in-css/index.html index b46e358..0615020 100644 --- a/posts/2023/01/size-units-in-css/index.html +++ b/posts/2023/01/size-units-in-css/index.html @@ -1,7 +1,7 @@ CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ | PrayinForRain.dev -

CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„

Table of Contents

CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„

Untitled

CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„

px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ ์ƒ๋Œ€ ๋‹จ์œ„๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ ˆ๋Œ€ ๋‹จ์œ„

์ ˆ๋Œ€ ๋‹จ์œ„๋Š” ์ธ์น˜์— ํ•ด๋‹นํ•˜๋Š” in์„ ๊ธฐ์ค€์œผ๋กœ MDN์— ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŽธ์˜์ƒ ์›น์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์œ„์ธ px์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‹จ์œ„์ด๋ฆ„ํฌ๊ธฐ
in์ธ์น˜1in = 2.54cm = 96px
pxํ”ฝ์…€96px = 1in
ptํฌ์ธํŠธ3pt = 4px
1pt = 1.33px
cm์„ผํ‹ฐ๋ฏธํ„ฐ1cm = 96px/2.54 = 37.795โ€ฆpx
mm๋ฐ€๋ฆฌ๋ฏธํ„ฐ1mm = 96px/25.4 = 3.7795โ€ฆpx
Q1/4 mm(quater)1Q = 96px/25.4/4 = 0.94488..px
pcPicas
(ํŒŒ์ด์นด ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋‹จ์œ„)1pc = 16px

์ƒ๋Œ€ ๋‹จ์œ„

์ƒ๋Œ€ ๋‹จ์œ„๋Š” ๋ถ€๋ชจ ์š”์†Œ๋‚˜ viewport ํฌ๊ธฐ ๋“ฑ์— ๋น„๋ก€ํ•œ ๊ธธ์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹จ์œ„๋กœ, ํ™”๋ฉด ํฌ๊ธฐ์— ๋งž์ถ”์–ด ๊ฐ ์š”์†Œ๊ฐ€ ๋น„์œจ์„ ๋งž์ถ”์–ด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋„๋ก ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

๋‹จ์œ„์„ค๋ช…
em์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ
ex์š”์†Œ ๊ธ€๊ผด์˜ x-height(๋Œ€์ถฉ ์†Œ๋ฌธ์ž๊ฐ€ ์ฐจ์ง€ํ•˜๋Š” ๋†’์ด)
ch์š”์†Œ ๊ธ€๊ผด์˜ glyph โ€œ0โ€์˜ ์‚ฌ์ „ ๊ธธ์ด(๋„ˆ๋น„); ์ฆ‰ ์š”์†Œ์˜ ๊ธ€๊ผด์—์„œ 0์ด ์ฐจ์ง€ํ•˜๋Š” width
rem๋ฃจํŠธ ์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ
lh์š”์†Œ์˜ ๋ผ์ธ ๋†’์ด
vwviewport width์˜ ํผ์„ผํŠธ ๋น„์œจ
vhviewport height์˜ ํผ์„ผํŠธ ๋น„์œจ
vmaxvw, vh ์ค‘ ํฐ ์ชฝ
vminvw, vh ์ค‘ ์ž‘์€ ์ชฝ

em, rem, vw, vh๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋‹จ์œ„์ด๋‹ˆ ๊ฐ๊ฐ์„ ์ตํ˜€ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

em๊ณผ rem

em์€ ํ˜„์žฌ ์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ์ฆ‰ ํ˜„์žฌ ์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ๊ฐ€ 10px์ธ ์š”์†Œ์˜ 1em์€ 10px์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•ด h๋‚˜ emํƒœ๊ทธ๊ฐ™์€ ๊ฐ•์กฐ ํƒœ๊ทธ์˜ ๊ธ€๊ผด ํฌ๊ธฐ๋ฅผ ์ƒ๋Œ€์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rem์€ ๋ฌธ์„œ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ์˜ font-size ๊ฐ’์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” em๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. HTML ๋ฌธ์„œ์—์„œ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” <html> ํƒœ๊ทธ์ด๋ฏ€๋กœ ์ด ์š”์†Œ์˜ font-size ๊ฐ’์ด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ถ๊ธˆ์ฆ๋“ค

1cm๋Š” ์ •๋ง 1 ์„ผํ‹ฐ๋ฏธํ„ฐ์ผ๊นŒ?

๋ชจ๋‹ˆํ„ฐ์—๋Š” ํ•ด์ƒ๋„ ๋ง๊ณ ๋„ PPI*(Pixel per Inch)*๋ผ๋Š” ์ŠคํŽ™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ŠคํŽ™์— ๋”ฐ๋ผ, 1px์„ ์‹ค์ œ ๊ธธ์ด๋กœ ์น˜ํ™˜ํ•˜๋ฉด ๋””์Šคํ”Œ๋ ˆ์ด์˜ DPI์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‹ค์ œ ๊ธธ์ด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ 1cm ์—ญ์‹œ ์ƒ๋Œ€ ๋‹จ์œ„์ธ ๊ฒƒ์ด ์•„๋‹๊นŒ์š”? ์‹คํ—˜์„ ์œ„ํ•ด height: 6.8cm;๋ฅผ ์ค€ div์— ์ง€ํ๋ฅผ ๊ฐ–๋‹ค ๋Œ€ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์šฐ๋ฆฌ๋‚˜๋ผ ๋ชจ๋“  ์ง€ํ์˜ ๋†’์ด๋Š” 6.8cm์ž…๋‹ˆ๋‹ค.

Untitled

24โ€ FHD ๋ชจ๋‹ˆํ„ฐ์™€ 15โ€ FHD ๋ชจ๋‹ˆํ„ฐ์—์„œ ์‹คํ—˜ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. 24โ€์—์„œ๋Š” ์ •ํ™•ํ•˜๊ฒŒ ์ง€ํ์˜ ํฌ๊ธฐ์™€ ์ผ์น˜ํ–ˆ์ง€๋งŒ 15โ€์—์„œ๋Š” ํ•œ์ฐธ ์ž‘์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰ 1cm๊ฐ€ ์ •ํ™•ํžˆ 1์„ผํ‹ฐ๋ฏธํ„ฐ๋ฅผ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ cm๋ผ๋Š” ๋‹จ์œ„๋Š” ์™œ ์กด์žฌํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ๋‹ต์€ ์ด ๋งํฌ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ํ˜„์žฌ๋Š” ์ธ์‡„๋ฌผ๊ณผ ๊ฐ™์ด ๋†’์€ ํ•ด์ƒ๋„์—์„œ๋Š” cm, in๊ฐ™์€ ๋‹จ์œ„๊ฐ€ ์ •ํ™•ํ•œ ์‹ค์ œ ๊ธธ์ด๋ฅผ ๊ฐ–๋„๋ก ์ถœ๋ ฅ๋˜์ง€๋งŒ, ๋””์Šคํ”Œ๋ ˆ์ด์™€ ๊ฐ™์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ํ•ด์ƒ๋„์˜ ์ถœ๋ ฅ์—์„œ๋Š” ์ด๊ฒƒ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ์—๋Š” ๋””์Šคํ”Œ๋ ˆ์ด์—์„œ๋„ ์ด ๋ถ€๋ถ„์ด ๋ณด์žฅ๋˜๋„๋ก ์š”๊ตฌ๋˜์—ˆ์ง€๋งŒ 2011๋…„์— ์ด๋Ÿฐ ์š”๊ตฌ์‚ฌํ•ญ์ด ์‚ญ์ œ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์‹ค์ œ ๊ธธ์ด ๋‹จ์œ„๋Š” ์ธ์‡„๋ฅผ ๋ชฉ์ ์œผ๋กœ ์ž‘์„ฑ๋˜๋Š” ๋ฌธ์„œ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ๋””์Šคํ”Œ๋ ˆ์ด์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์˜ ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ ˆ๋Œ€ ๋‹จ์œ„๋Š” px๋งŒ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. pt ์—ญ์‹œ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋‚˜ ์›Œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์œ„๋กœ ์‹ค์ œ ๊ธธ์ด ๋‹จ์œ„์— ๊ธฐ๋ฐ˜ํ•˜๋ฏ€๋กœ ์ธ์‡„๋ฌผ์— ์ ํ•ฉํ•œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.

em๊ณผ %์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

์•„๋ž˜ ์˜ˆ์ œ์—์„œ ๋‘ child ์š”์†Œ๋“ค์€ ๋ชจ๋‘ ๊ฐ™์€ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

// html
 <div id="parent">
   parent
   <p id="child1">Hello World!</p>
@@ -15,10 +15,10 @@
 #child2 {
   font-size: 150%;
 }
-

๊ธฐ๋ณธ์ ์œผ๋กœ font-size๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ๊ฐ’์„ ์ƒ์†๋ฐ›์œผ๋ฏ€๋กœ, ํ˜„์žฌ ์š”์†Œ์˜ font-size๋ฅผ ์ฐธ์กฐํ•˜๋Š” em์ด๋‚˜, ๋ถ€๋ชจ ์š”์†Œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” %๋‚˜ ๊ฐ™์€ ๊ธฐ์ค€ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์ด์ฃ . ์ฆ‰ ๋‘ ์š”์†Œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š”, em์€ ํ•ญ์ƒ font-size๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์œ„๋Š” ๋ชจ๋“  ์š”์†Œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ width๋‚˜ height๊ฐ™์€ ์š”์†Œ์— em์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, em์€ ํ•ญ์ƒ font-size๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ํ•ด๋‹น property ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, width์— %๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ์š”์†Œ์˜ width์— ๋Œ€ํ•œ ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Refs.

CSS ๊ฐ’ ๊ณผ ๋‹จ์œ„ - Web ๊ฐœ๋ฐœ ํ•™์Šตํ•˜๊ธฐ | MDN

CSS: em, px, pt, cm, in…

Why em instead of px?

When to use ems instead of percentage in CSS?

 ยฉ 2024 PrayinforRain. +

๊ธฐ๋ณธ์ ์œผ๋กœ font-size๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ๊ฐ’์„ ์ƒ์†๋ฐ›์œผ๋ฏ€๋กœ, ํ˜„์žฌ ์š”์†Œ์˜ font-size๋ฅผ ์ฐธ์กฐํ•˜๋Š” em์ด๋‚˜, ๋ถ€๋ชจ ์š”์†Œ์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” %๋‚˜ ๊ฐ™์€ ๊ธฐ์ค€ ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์ด์ฃ . ์ฆ‰ ๋‘ ์š”์†Œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?

๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š”, em์€ ํ•ญ์ƒ font-size๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์œ„๋Š” ๋ชจ๋“  ์š”์†Œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ width๋‚˜ height๊ฐ™์€ ์š”์†Œ์— em์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, em์€ ํ•ญ์ƒ font-size๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ถ€๋ชจ ์š”์†Œ์˜ ํ•ด๋‹น property ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, width์— %๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ธ์ œ๋‚˜ ๋ถ€๋ชจ ์š”์†Œ์˜ width์— ๋Œ€ํ•œ ๋น„์œจ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

Refs.

CSS ๊ฐ’ ๊ณผ ๋‹จ์œ„ - Web ๊ฐœ๋ฐœ ํ•™์Šตํ•˜๊ธฐ | MDN

CSS: em, px, pt, cm, in…

Why em instead of px?

When to use ems instead of percentage in CSS?

+Hugo.
\ No newline at end of file diff --git a/posts/2023/01/tree-shaking/index.html b/posts/2023/01/tree-shaking/index.html index 0d40d44..e1e3b31 100644 --- a/posts/2023/01/tree-shaking/index.html +++ b/posts/2023/01/tree-shaking/index.html @@ -1,7 +1,7 @@ Tree Shaking | PrayinForRain.dev -

Tree Shaking

Table of Contents

์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•

bundle_map

์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ Tree-shaking์ž…๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ ์‰์ดํ‚น

tree-shaking

๋‚˜๋ฌด๋ฅผ ๋งˆ๊ตฌ๋งˆ๊ตฌ ํ”๋“ค๋ฉด ์–ด๋–ป๊ฒŒ ๋‚˜๋ญ‡์žŽ์ด๋‚˜ ์—ด๋งค๊ฐ™์€ ๊ฒƒ๋“ค์ด ์กฐ๊ธˆ์”ฉ ๋–จ์–ด์ง€๋ฉด์„œ ๋‚˜๋ฌด๊ฐ€ ์ ์  ์•™์ƒํ•ด ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠธ๋ฆฌ ์‰์ดํ‚น์€ ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋“ค์ด ๋ฒˆ๋“ค์— ํฌํ•จ๋˜๋Š” ๊ฒƒ๋“ค์„ ์ง€์›Œ์„œ ํŒŒ์ผ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋‚˜๋ฌด(ํŒŒ์ผ)๋ฅผ ๋งˆ๊ตฌ ํ”๋“ค์–ด์„œ ๋‚˜๋ญ‡์žŽ(๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ)์„ ๋œ์–ด๋‚ด๋Š” ๊ฐœ๋…์ด์ฃ . ์–ด๋–ค ๊ณผ์ •์„ ํ†ตํ•ด ์ด๋ฃจ์–ด ์งˆ๊นŒ์š”? ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

example-app

https://github.com/malchata/webpack-tree-shaking-example

์‹คํ–‰ํ•ด๋ณด๊ธฐ

์šฐ์„  npm run buildํ›„ npm run start๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

bundle size before tree shaking

๋ฒˆ๋“ค๋œ ํŒŒ์ผ ๋‘๊ฐœ๋ฅผ ๋‹ค์šด๋ฐ›์•˜๊ณ , 38.4KB, 21.6KB์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ฐ๊ด€์ ์œผ๋กœ ๊ฐ€๋ณ๊ธด ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๊ตณ์ด ํŠธ๋ฆฌ ์‰์ดํ‚น์„ ํ†ตํ•ด ์šฉ๋Ÿ‰์„ ๋” ์ค„์—ฌ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒƒ๋งŒ importํ•˜๊ธฐ

analyzing scripts

์ด ์•ฑ์˜ ์ปดํฌ๋„ŒํŠธ์ธ FilterablePedalList.js๋ฅผ ๋ณด๋ฉด utils.js ํŒŒ์ผ์„ importํ•ด์˜ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ utils.js ํŒŒ์ผ์€ 1300์—ฌ ์ค„์ด ๋˜๋Š” ์•„์ฃผ ๊ธด ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๊ฐ์ข… ์ •๋ ฌ๊ณผ, ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ •์ž‘ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” simpleSort๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ 13์ค„ ์•„๋ž˜๋กœ๋Š” ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋“ค์ธ๋ฐ๋„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์ฃ . ์‹ค์ œ๋กœ ๋ฒˆ๋“ค ํŒŒ์ผ์—์„œ๋„ simpleSort ์™ธ์— uasort, uksort ๋“ฑ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋“ค์ด ๊ฐ™์ด ๋ฒˆ๋“ค๋ง๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ import๋ฌธ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

// FilterablePedalList.js
 // ...
 import * as utils from "../../utils/utils"; // before
 import { simpleSort } from "../../utils/utils"; // after
@@ -12,12 +12,12 @@
     }]
   ],
 // ...
-

modules ์˜ต์…˜์€ ES Modules ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  CommonJS ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด webpack์ด ํ•œ๋ฒˆ ๋” ํŠธ๋žœ์ŠคํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฑฐ๋“ ์š”!

๊ฒฐ๊ณผ๋ฌผ ํ™•์ธํ•˜๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ ์•ฑ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

after tree shaking

main.js ์ฒญํฌ๊ฐ€ 21.6KB โ†’ 9KB๋กœ ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํฐ ์˜๋ฏธ๋Š” ์—†์ง€๋งŒ ๋กœ๋“œ ์‹œ๊ฐ„๋„ ์ค„์–ด๋“ค์—ˆ๋„ค์š”. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์ด๋ฃจ์–ด ์ง€๋Š”์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ๊ตฟ..

๊ถ๊ธˆ์ฆ๋“ค

ํŠน์ • ํŒจํ‚ค์ง€์˜ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

๋Œ€๋ถ€๋ถ„์€ ์œ„์˜ ๊ณผ์ •์„ ํ†ตํ•ด ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๊ฐ€๋Šฅํ•˜๋‚˜, ์ผ๋ถ€ ํŒจํ‚ค์ง€์—์„œ importํ•ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ Date ๋“ฑ์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š” lodash ํŒจํ‚ค์ง€๊ฐ€ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์ธ๋ฐ์š”, ํŒจํ‚ค์ง€ ์ž์ฒด๊ฐ€ CommonJS ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. lodash๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•์— ๋งž์ถ”์–ด ์ž‘์„ฑ๋œ ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. [๋งํฌ]

๋งŒ์•ฝ ์ด๋Ÿฐ ์‹์œผ๋กœ๋„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋ฉด webpack-common-shake๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. webpack-common-shake๋Š” CommonJS์˜ ๋ฌธ๋ฒ•์œผ๋กœ module.export๋ฅผ ์‚ฌ์šฉํ•œ ํŒจํ‚ค์ง€๋ฅผ ํŠธ๋ฆฌ์‰์ดํ‚น ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ๋ฐ์š”, README์— ๋‚˜์™€ ์žˆ๋“ฏ์ด ๊ฒฐ๊ตญ ์™„์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค.

Babel์˜ โ€œmodulesโ€: false๋ž€ ๋ฌด์—‡์ผ๊นŒ?

babel์˜ modules ์˜ต์…˜์€ ES modules ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์— ๋งž์ถ”์–ด ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋Š” ์˜ต์…˜์ธ๋ฐ์š”, false๋ฅผ ์ง€์ •ํ•  ๊ฒฝ์šฐ ํŠธ๋žœ์ŠคํŒŒ์ผ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด babel์—์„œ ๊ตณ์ด ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ webpack์ด ํ•ด์ฃผ๋Š”๋ฐ, ์ด๊ฑธ ๊ตณ์ด false๋กœ ์ง€์ •ํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

Babel์˜ documentation์„ ๋ณด๋ฉด modules ์˜ต์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

"amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false, defaults toย "auto".

Enable transformation of ES module syntax to another module type. Note thatย cjsย is just an alias forย commonjs. +

modules ์˜ต์…˜์€ ES Modules ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  CommonJS ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด webpack์ด ํ•œ๋ฒˆ ๋” ํŠธ๋žœ์ŠคํŒŒ์ผ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฑฐ๋“ ์š”!

๊ฒฐ๊ณผ๋ฌผ ํ™•์ธํ•˜๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ ์•ฑ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

after tree shaking

main.js ์ฒญํฌ๊ฐ€ 21.6KB โ†’ 9KB๋กœ ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํฐ ์˜๋ฏธ๋Š” ์—†์ง€๋งŒ ๋กœ๋“œ ์‹œ๊ฐ„๋„ ์ค„์–ด๋“ค์—ˆ๋„ค์š”. ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์ด๋ฃจ์–ด ์ง€๋Š”์ง€ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ๊ตฟ..

๊ถ๊ธˆ์ฆ๋“ค

ํŠน์ • ํŒจํ‚ค์ง€์˜ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

๋Œ€๋ถ€๋ถ„์€ ์œ„์˜ ๊ณผ์ •์„ ํ†ตํ•ด ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ๊ฐ€๋Šฅํ•˜๋‚˜, ์ผ๋ถ€ ํŒจํ‚ค์ง€์—์„œ importํ•ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์ด๋‚˜ Date ๋“ฑ์„ ๋‹ค๋ฃฐ ๋•Œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๋Š” lodash ํŒจํ‚ค์ง€๊ฐ€ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์ธ๋ฐ์š”, ํŒจํ‚ค์ง€ ์ž์ฒด๊ฐ€ CommonJS ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. lodash๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•์— ๋งž์ถ”์–ด ์ž‘์„ฑ๋œ ๋นŒ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. [๋งํฌ]

๋งŒ์•ฝ ์ด๋Ÿฐ ์‹์œผ๋กœ๋„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋ฉด webpack-common-shake๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. webpack-common-shake๋Š” CommonJS์˜ ๋ฌธ๋ฒ•์œผ๋กœ module.export๋ฅผ ์‚ฌ์šฉํ•œ ํŒจํ‚ค์ง€๋ฅผ ํŠธ๋ฆฌ์‰์ดํ‚น ํ•ด์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ๋ฐ์š”, README์— ๋‚˜์™€ ์žˆ๋“ฏ์ด ๊ฒฐ๊ตญ ์™„์ „ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹™๋‹ˆ๋‹ค.

Babel์˜ โ€œmodulesโ€: false๋ž€ ๋ฌด์—‡์ผ๊นŒ?

babel์˜ modules ์˜ต์…˜์€ ES modules ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ฌธ๋ฒ•์— ๋งž์ถ”์–ด ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋Š” ์˜ต์…˜์ธ๋ฐ์š”, false๋ฅผ ์ง€์ •ํ•  ๊ฒฝ์šฐ ํŠธ๋žœ์ŠคํŒŒ์ผ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•ž์„œ ๋งํ–ˆ๋“ฏ์ด babel์—์„œ ๊ตณ์ด ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๋”๋ผ๋„ webpack์ด ํ•ด์ฃผ๋Š”๋ฐ, ์ด๊ฑธ ๊ตณ์ด false๋กœ ์ง€์ •ํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

Babel์˜ documentation์„ ๋ณด๋ฉด modules ์˜ต์…˜์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

"amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false, defaults toย "auto".

Enable transformation of ES module syntax to another module type. Note thatย cjsย is just an alias forย commonjs. ES ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ํƒ€์ž…์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. cjs๋Š” CommonJS๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Setting this toย falseย will preserve ES modules. Use this only if you intend to ship native ES Modules to browsers. If you are using a bundler with Babel, the defaultย modules: "auto"ย is always preferred. -*false๋กœ ์ง€์ •ํ•˜๋ฉด ES ๋ชจ๋“ˆ์˜ ๋ฌธ๋ฒ•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ES ๋ชจ๋“ˆ๋กœ๋งŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. Babel์— ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, modules: โ€œautoโ€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.*

์‚ฌ์‹ค modules์—๋Š” auto๋ผ๋Š” ๊ฐ’์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Babel 7.x ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ๊ธด caller ์˜ต์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋œ ๊ฐ’์ธ๋ฐ์š”, auto๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ๋ฐ”๋ฒจ์€ callerData๋ฅผ ์ด์šฉํ•˜์—ฌ ES ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋‹จํ•˜๊ณ , ์ด์— ๋งž์ถ”์–ด ํŠธ๋žœ์ŠคํŒŒ์ผ ํ•  ์ง€๋ฅผ ์ž๋™์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์—์„œ๋Š” ๋‚ฎ์€ ๋ฒ„์ „์˜ ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ์ง€์ •ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ธฐ๋ณธ๊ฐ’์ด auto๋กœ ๋˜์–ด ์žˆ์–ด import ๋ฒ”์œ„๋งŒ ์กฐ์ ˆํ•˜๋ฉด ์•Œ์•„์„œ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Refs.

Next ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ค€๋น„(bundle-analyzer, tree shaking, gzip)
์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Tree Shaking ์†Œ๊ฐœ
Reduce JavaScript payloads with tree shaking
Tree Shaking | ์›นํŒฉ
@babel/preset-env ยท Babel
https://github.com/babel/babel-loader/issues/521
https://github.com/babel/babel-loader/pull/660

 ยฉ 2024 PrayinforRain. +*false๋กœ ์ง€์ •ํ•˜๋ฉด ES ๋ชจ๋“ˆ์˜ ๋ฌธ๋ฒ•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์„ ES ๋ชจ๋“ˆ๋กœ๋งŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”. Babel์— ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, modules: โ€œautoโ€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.*

์‚ฌ์‹ค modules์—๋Š” auto๋ผ๋Š” ๊ฐ’์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Babel 7.x ๋ฒ„์ „๋ถ€ํ„ฐ ์ƒ๊ธด caller ์˜ต์…˜์„ ํ™œ์šฉํ•˜์—ฌ ์ถ”๊ฐ€๋œ ๊ฐ’์ธ๋ฐ์š”, auto๋กœ ์„ค์ •ํ•  ๊ฒฝ์šฐ ๋ฐ”๋ฒจ์€ callerData๋ฅผ ์ด์šฉํ•˜์—ฌ ES ๋ชจ๋“ˆ ๋ฌธ๋ฒ•์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋‹จํ•˜๊ณ , ์ด์— ๋งž์ถ”์–ด ํŠธ๋žœ์ŠคํŒŒ์ผ ํ•  ์ง€๋ฅผ ์ž๋™์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์—์„œ๋Š” ๋‚ฎ์€ ๋ฒ„์ „์˜ ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— false๋ฅผ ์ง€์ •ํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ธฐ๋ณธ๊ฐ’์ด auto๋กœ ๋˜์–ด ์žˆ์–ด import ๋ฒ”์œ„๋งŒ ์กฐ์ ˆํ•˜๋ฉด ์•Œ์•„์„œ ํŠธ๋ฆฌ ์‰์ดํ‚น์ด ์ด๋ฃจ์–ด์งˆ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Refs.

Next ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ค€๋น„(bundle-analyzer, tree shaking, gzip)
์›น ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Tree Shaking ์†Œ๊ฐœ
Reduce JavaScript payloads with tree shaking
Tree Shaking | ์›นํŒฉ
@babel/preset-env ยท Babel
https://github.com/babel/babel-loader/issues/521
https://github.com/babel/babel-loader/pull/660

+Hugo.
\ No newline at end of file diff --git a/posts/2023/02/firebase-with-typescript/index.html b/posts/2023/02/firebase-with-typescript/index.html index 3e2a00f..88ecc1b 100644 --- a/posts/2023/02/firebase-with-typescript/index.html +++ b/posts/2023/02/firebase-with-typescript/index.html @@ -1,7 +1,7 @@ Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ | PrayinForRain.dev -

Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

Table of Contents

์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.

image

์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?

๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?

๋ถ•๋Œ€ ๊ฐ๊ธฐ

์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

export declare interface DocumentData {
   /** A mapping between a field and its value. */
   [field: string]: any;
 }
@@ -69,10 +69,10 @@
 },
 // ...
 

… ์ •๋ง ๋…ธ๋ ฅํ–ˆ๋‹ค. ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ํƒ€์ž… ๋‹จ์–ธ์„ ๋–ผ๋‚ผ ์ˆ˜๊ฐ€ ์—†๋‹ค.
์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ์—ฌํƒœ ์‚ฌ์šฉํ–ˆ๋˜ ORM์ด๋‚˜ ODM์—์„œ๋„ ์•„๋ฌด ๊ตฌ์กฐ ์ •์˜ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ด ์ฃผ์ง€๋Š” ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๋ถ„๋ช… model์ด๋“  schema๋“  ํ•˜๋Š” ํŒŒ์ผ์„ ๋‘ฌ์„œ ๋”ฐ๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด ์žˆ์—ˆ๋‹ค. ์ƒ๊ฐ์ด ๊ฑฐ๊ธฐ๊นŒ์ง€ ๋ฏธ์น˜๋‹ˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์„œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.. ๋ผ๋Š” ๊ฒฐ๋ก ์„ ์–ป์—ˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

์• ์ดˆ์— ์ด ๋ถ€๋ถ„์—์„œ ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋ฌธ์ œ์ผ๊นŒ?

๊ณต๋ถ€ํ•˜๊ธฐ ์‹ซ์–ด์„œ ๊ทธ๋Ÿฐ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ง„์งœ ์ด๋Ÿฐ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.

Reminder: Because type assertions are removed at compile-time, there is no runtime checking associated with a type assertion. There wonโ€™t be an exception or null generated if the type assertion is wrong.
์ถœ์ฒ˜: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html

(docData: DocumentData): T => docData as T ๋กœ ์ •์˜๋˜์—ˆ๋˜ fromFirestore ํ•จ์ˆ˜์—์„œ, ๋งŒ์•ฝ์— T ํƒ€์ž…์— name property๊ฐ€ ์žˆ๊ณ  docData์—๋Š” ์—†๋‹ค๋ฉด, ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ์ฒด์˜ name์€ undefined๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋’ค์˜ ์ฝ”๋“œ์—์„œ ์ด๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ํƒ€์ž… ๋‹จ์–ธ์˜ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ์ด๋‹ค. ์ฝ”๋”ฉํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” TypeScript๊ฐ€ ์˜ค๋ฅ˜๋กœ ๋ณด์ง€ ์•Š์•˜์Œ์—๋„ ์‹ค์ œ ์‹คํ–‰์—์„œ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” ์ผ€์ด์Šค.
ํ•˜์ง€๋งŒ ๋งŒ์•ฝ Firestore์— ์ ‘๊ทผ, ์ œ์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ด ์•ฑ ํ•˜๋‚˜ ๋ฟ์ด๊ณ , ์•ฑ ์ž์ฒด์—์„œ ์ฝœ๋ ‰์…˜๋“ค์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ? ์˜คํžˆ๋ ค ์ด ๊ทœ์น™๋งŒ ์ง€์ผœ์ง„๋‹ค๋ฉด ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด ์•„๋‹๊นŒ?

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋‹ต์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ๋‚˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทผ๊ฑฐ๋กœ ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

  • ๋‚˜๋Š” ์•„์ฃผ ๊ฐ€๋ฒผ์šด ๊ทœ๋ชจ์˜ ํ† ์ด ํ”„๋กœ์ ํŠธ์— Firestore๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
  • ๊ฐ™์€ ์ฝœ๋ ‰์…˜ ๋‚ด์˜ ๋ชจ๋“  ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ํ†ต์ผํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • 1์ธ ๊ฐœ๋ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ํœด๋จผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋‚ฎ๋‹ค.
  • ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ์ผ์ด ๊ทนํžˆ ์ ๋‹ค. (์ด๋ฏธ ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„์„ ๋งˆ์นœ ์ƒํƒœ์—์„œ ๊ณ ๋ฏผํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.)

๋งŒ์•ฝ ๋‚˜์™€ ์ƒํ™ฉ์ด ๋‹ค๋ฅด๊ณ , ํƒ€์ž…์„ ๋ณด์žฅ๋ฐ›์•„์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด, ํƒ€์ž…๋ณ„๋กœ ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด์„œ util ํ•จ์ˆ˜๋กœ์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํ™•์žฅ์„ฑ๊นŒ์ง€ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ์• ์ดˆ์— ๋ฌธ์„œ ๊ตฌ์กฐ๋ฅผ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ๊ธฐ๋ณธ๊ฐ’, ํ•„์ˆ˜ ์—ฌ๋ถ€๊นŒ์ง€ ์ •์˜ํ•˜์—ฌ Converter๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค๋„๋ก ๊ตฌํ˜„ํ•˜๋˜๊ฐ€, ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
๋‹ค๋งŒ ํƒ€์ž… ๋‹จ์–ธ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๊ตณ์ด Converter๊นŒ์ง€ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค. ์–ด์ฐจํ”ผ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฌผ ๋์— as Type๋งŒ ๋ถ™์ด๋ฉด ๊ทธ๋งŒ์ด๋‹ˆ ๊ทธ๋ƒฅ ๊ทธ๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜์ž. ์Œ.. Converter ํ•จ์ˆ˜๋กœ ๊ฐ€๋ฆฌ๋ฉด ํƒ€์ž… ๋‹จ์–ธ์„ ๋‚ด ๋ˆˆ์— ๋„์ง€ ์•Š๋Š” ๊ณณ์— ์ˆจ๊ฒจ ์ฃ„์ฑ…๊ฐ์ด ๋œํ•˜๋‹ค๋Š” ์žฅ์ ์€ ์žˆ๋‹ค.

Refs.

What is the best way to define the interface of a document in firestore?
Everyday Types -FirestoreDataConverter interface - Firebase JavaScript API

 ยฉ 2024 PrayinforRain. +FirestoreDataConverter interface - Firebase JavaScript API

+Hugo.
\ No newline at end of file diff --git a/posts/2023/02/typescript-generic/index.html b/posts/2023/02/typescript-generic/index.html index cfe3d53..1b26271 100644 --- a/posts/2023/02/typescript-generic/index.html +++ b/posts/2023/02/typescript-generic/index.html @@ -1,8 +1,8 @@ Typescript Generic | PrayinForRain.dev -

Typescript Generic

Table of Contents

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

const [name, setName] = useState<string>("์ง€์ƒ๋ ฌ");
+

๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.

any ํƒ€์ž…์˜ ๋ฌธ์ œ

์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.

class Stack {
   arr: any[] = [];
   push(element: any) {
     this.arr.push(element);
@@ -19,7 +19,7 @@
 const numberStack = new Stack();
 numberStack.push(0);
 console.log(numberStack.pop().slice()); // TypeError: numberStack.pop(...).slice is not a function
-

๋‹น์—ฐํžˆ numberStack ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Stack์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ any ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.

๋˜ ์ง€๊ธˆ์˜ Stack์—์„œ๋Š” ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€๋Š” ์›์†Œ์˜ ํƒ€์ž…์— ์ƒ๊ด€ ์—†์ด ํ•ด๋‹น ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ์˜ ์ž๋™์™„์„ฑ์„ ์ „ํ˜€ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํƒ์˜ ์›์†Œ๋“ค์€ any ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ด ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด numberStack์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์„ number[]์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€๋งŒ, ๊ทธ๋Ÿผ stringStack์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด string[] ํƒ€์ž…์˜ Stack์„ ๋ณ„๋„๋กœ ์„ ์–ธํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ useState์ฒ˜๋Ÿผ any์—ฌ๋„ ์•Œ์•„์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด ์ฃผ๋ฉด ์•ˆ๋˜๋Š” ๊ฑธ๊นŒ์š”? ์•Œ์ž˜๋”ฑ๊น”์„ผ ํ•ด์ฃผ๋ฉด ๋˜์ž–์•„์š”.

์œ„์˜ ๋ฌธ์ œ๋“ค์€ any ํƒ€์ž…์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•œ๋ฐ์š”, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” **์ œ๋„ค๋ฆญ(Generic)**์˜ ๊ฐœ๋…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด๋ž€?

์ œ๋„ค๋ฆญ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(์ž๋ฐ”, C# ๋“ฑ)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”๋ฅผ ์œ„ํ•œ ํŠœํ† ๋ฆฌ์–ผ์ด๊ธด ํ•˜์ง€๋งŒ, TCPSchool์— ๊ฐœ๋… ์„ค๋ช…์ด ์ž˜ ๋˜์–ด ์žˆ์–ด ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ ์ œ๋„ค๋ฆญ(generic)์ด๋ž€ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…(data type)์„ ์ผ๋ฐ˜ํ™”ํ•œ๋‹ค(generalize)๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์€ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ปดํŒŒ์ผ ์‹œ์— ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผ ์‹œ์— ๋ฏธ๋ฆฌ ํƒ€์ž… ๊ฒ€์‚ฌ(type check)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•œ ํƒ€์ž… ๋ณ€ํ™˜ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ์— ๋“ค์–ด๊ฐ€๋Š” ๋…ธ๋ ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java - ์ œ๋„ค๋ฆญ์˜ ๊ฐœ๋…, TCPSchool.com

์ฆ‰ ์ œ๋„ค๋ฆญ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํƒ€์ž…์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ โ€˜์ด๋ฒˆ์—๋Š” ์ด๋Ÿฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ• ๊ฑฐ์•ผโ€™๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ธ ์…ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งจ ์•ž์—์„œ ๋“ค์—ˆ๋˜ useState ์˜ˆ์‹œ์— ๋‚˜์˜จ ๊บฝ์‡ ๊ฐ€ ๋ฐ”๋กœ ์ œ๋„ค๋ฆญ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•ด ๋ณด์ž

์ œ๋„ค๋ฆญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

function ๋Œ€์ถฉ_ํ•จ์ˆ˜์ด๋ฆ„<T>(arg: T) {
+

๋‹น์—ฐํžˆ numberStack ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Stack์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ any ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.

๋˜ ์ง€๊ธˆ์˜ Stack์—์„œ๋Š” ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€๋Š” ์›์†Œ์˜ ํƒ€์ž…์— ์ƒ๊ด€ ์—†์ด ํ•ด๋‹น ํƒ€์ž…์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ์˜ ์ž๋™์™„์„ฑ์„ ์ „ํ˜€ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํƒ์˜ ์›์†Œ๋“ค์€ any ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

์ด ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด numberStack์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ’์„ number[]์ฒ˜๋Ÿผ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋˜๊ฒ ์ง€๋งŒ, ๊ทธ๋Ÿผ stringStack์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด string[] ํƒ€์ž…์˜ Stack์„ ๋ณ„๋„๋กœ ์„ ์–ธํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ useState์ฒ˜๋Ÿผ any์—ฌ๋„ ์•Œ์•„์„œ ํƒ€์ž…์„ ์ถ”๋ก ํ•ด ์ฃผ๋ฉด ์•ˆ๋˜๋Š” ๊ฑธ๊นŒ์š”? ์•Œ์ž˜๋”ฑ๊น”์„ผ ํ•ด์ฃผ๋ฉด ๋˜์ž–์•„์š”.

์œ„์˜ ๋ฌธ์ œ๋“ค์€ any ํƒ€์ž…์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ด๊ธฐ๋„ ํ•œ๋ฐ์š”, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” **์ œ๋„ค๋ฆญ(Generic)**์˜ ๊ฐœ๋…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์ด๋ž€?

#์ œ๋„ค๋ฆญ์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(์ž๋ฐ”, C# ๋“ฑ)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”๋ฅผ ์œ„ํ•œ ํŠœํ† ๋ฆฌ์–ผ์ด๊ธด ํ•˜์ง€๋งŒ, TCPSchool์— ๊ฐœ๋… ์„ค๋ช…์ด ์ž˜ ๋˜์–ด ์žˆ์–ด ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์—์„œ ์ œ๋„ค๋ฆญ(generic)์ด๋ž€ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…(data type)์„ ์ผ๋ฐ˜ํ™”ํ•œ๋‹ค(generalize)๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ œ๋„ค๋ฆญ์€ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ปดํŒŒ์ผ ์‹œ์— ๋ฏธ๋ฆฌ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผ ์‹œ์— ๋ฏธ๋ฆฌ ํƒ€์ž… ๊ฒ€์‚ฌ(type check)๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  1. ํด๋ž˜์Šค๋‚˜ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ฐ˜ํ™˜๊ฐ’์— ๋Œ€ํ•œ ํƒ€์ž… ๋ณ€ํ™˜ ๋ฐ ํƒ€์ž… ๊ฒ€์‚ฌ์— ๋“ค์–ด๊ฐ€๋Š” ๋…ธ๋ ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Java - ์ œ๋„ค๋ฆญ์˜ ๊ฐœ๋…, TCPSchool.com

์ฆ‰ ์ œ๋„ค๋ฆญ์€ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํƒ€์ž…์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ โ€˜์ด๋ฒˆ์—๋Š” ์ด๋Ÿฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ• ๊ฑฐ์•ผโ€™๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ธ ์…ˆ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งจ ์•ž์—์„œ ๋“ค์—ˆ๋˜ useState ์˜ˆ์‹œ์— ๋‚˜์˜จ ๊บฝ์‡ ๊ฐ€ ๋ฐ”๋กœ ์ œ๋„ค๋ฆญ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•ด ๋ณด์ž

์ œ๋„ค๋ฆญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

function ๋Œ€์ถฉ_ํ•จ์ˆ˜์ด๋ฆ„<T>(arg: T) {
   // ...
 }
 ๋Œ€์ถฉ_ํ•จ์ˆ˜์ด๋ฆ„<string>("์•„์ž‰"); // T = string
@@ -41,7 +41,7 @@
 const numberStack = new Stack<number>();
 numberStack.push(0);
 console.log(numberStack.pop()?.slice()); // Property 'slice' does not exist on type 'number'.
-

์ œ๋Œ€๋กœ ์ž๋™์™„์„ฑ๋„ ์ง€์›ํ•˜๊ณ , numberStack์˜ slice ์—ญ์‹œ ์‹คํ–‰ ์ „์— ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ด ์ค๋‹ˆ๋‹ค. ๋˜ Array.pop() ํ•จ์ˆ˜๊ฐ€ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰์–ด ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ๋ถ™์—ฌ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋Ÿฐํƒ€์ž„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ผ์€ ์—†๊ฒ ๋„ค์š”.

๋” ์จ ๋ณด์ž

์ œ๋„ค๋ฆญ์€ ์ด๊ฒŒ ๋์ผ๊นŒ์š”? ๋‹ค์Œ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ๋” ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

string๊ณผ Array๋Š” length ๊ณตํ†ต์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํƒ€์ž…์€ ๋‹ค๋ฅด์ง€๋งŒ length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ํƒ€์ž…๋งŒ์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ œ๋„ค๋ฆญ๊ณผ ํ•จ๊ป˜ extends ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface hasLength {
+

์ œ๋Œ€๋กœ ์ž๋™์™„์„ฑ๋„ ์ง€์›ํ•˜๊ณ , numberStack์˜ slice ์—ญ์‹œ ์‹คํ–‰ ์ „์— ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ด ์ค๋‹ˆ๋‹ค. ๋˜ Array.pop() ํ•จ์ˆ˜๊ฐ€ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰์–ด ์˜ต์…”๋„ ์ฒด์ด๋‹์„ ๋ถ™์—ฌ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋Ÿฐํƒ€์ž„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ผ์€ ์—†๊ฒ ๋„ค์š”.

๋” ์จ ๋ณด์ž

์ œ๋„ค๋ฆญ์€ ์ด๊ฒŒ ๋์ผ๊นŒ์š”? ๋‹ค์Œ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ๋” ๊ณ ๋ฏผํ•ด๋ด…์‹œ๋‹ค.

string๊ณผ Array๋Š” length ๊ณตํ†ต์ ์œผ๋กœ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํƒ€์ž…์€ ๋‹ค๋ฅด์ง€๋งŒ length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ํƒ€์ž…๋งŒ์„ ์ธ์ž๋กœ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ œ๋„ค๋ฆญ๊ณผ ํ•จ๊ป˜ extends ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

interface hasLength {
   length: number;
 }
 
@@ -52,7 +52,7 @@
 console.log(getLength([1, 2]));
 console.log(getLength("12"));
 console.log(getLength(1)); // Argument of type 'number' is not assignable to parameter of type 'hasLength'.
-

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž… T๋Š” hasLength์˜ ํŠน์„ฑ์„ ๊ฐ–๋Š” ํƒ€์ž…๋งŒ์ด ์ธ์ž๋กœ ํ†ต๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”โ€ฆ ๋” ์จ๋ณด์ž

์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ํƒ€์ž…์˜ ์Šคํƒ์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function getLengthOfLastElement<T extends Stack<U>, U extends hasLength>(
+

์ด๋Ÿฐ ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž… T๋Š” hasLength์˜ ํŠน์„ฑ์„ ๊ฐ–๋Š” ํƒ€์ž…๋งŒ์ด ์ธ์ž๋กœ ํ†ต๊ณผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”โ€ฆ ๋” ์จ๋ณด์ž

์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. length ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–๋Š” ํƒ€์ž…์˜ ์Šคํƒ์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ์˜ ๊ธธ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

function getLengthOfLastElement<T extends Stack<U>, U extends hasLength>(
   stack: T
 ) {
   const element = stack.pop();
@@ -68,10 +68,10 @@
 const numberStack = new Stack<number>();
 numberStack.push(1);
 getLengthOfLastElement(numberStack); // TypeError
-

์œ„์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด ์„ ์–ธ๋œ ํƒ€์ž…์ด ์‚ฌ์šฉํ•˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Refs.

์ฝ”๋”ฉ๊ต์œก ํ‹ฐ์”จํ”ผ์Šค์ฟจ
์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ
Documentation - Generics
์ œ๋„ค๋ฆญ | ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“œ๋ถ

 ยฉ 2024 PrayinforRain. +

์œ„์™€ ๊ฐ™์ด ์ œ๋„ค๋ฆญ์„ ์ด์šฉํ•ด ์„ ์–ธ๋œ ํƒ€์ž…์ด ์‚ฌ์šฉํ•˜๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Refs.

์ฝ”๋”ฉ๊ต์œก ํ‹ฐ์”จํ”ผ์Šค์ฟจ
์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ
Documentation - Generics
์ œ๋„ค๋ฆญ | ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“œ๋ถ

+Hugo.
\ No newline at end of file diff --git a/posts/2023/03/nodejs-for-baekjoon/index.html b/posts/2023/03/nodejs-for-baekjoon/index.html index 078ffab..8a70818 100644 --- a/posts/2023/03/nodejs-for-baekjoon/index.html +++ b/posts/2023/03/nodejs-for-baekjoon/index.html @@ -1,7 +1,7 @@ ๋ฐฑ์ค€์„ ์œ„ํ•œ node.js | PrayinForRain.dev -

๋ฐฑ์ค€์„ ์œ„ํ•œ node.js

Table of Contents

JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด

Programmers IDE

๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.
๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

ํ•œ 4~5๋ฌธ์ œ ํ…Œ์ŠคํŠธํ•ด ๋ดค๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
๋ฐฑ์ค€์€ ์›Œ๋‚™ ์ž…๋ ฅ ํ˜•์‹๋„ ์ถœ๋ ฅ ํ˜•์‹๋„ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์•„๋‹ˆ์ง€๋งŒ.. ์ด ์ •๋„๋กœ ์ฐธ๊ณ  ์“ธ๋ž€๋‹ค.

Baekjoon Node.js template

function solution(input) {
   let answer = 0;
   // Your code here ...
 
@@ -20,10 +20,10 @@
 } else {
   console.log(solution(input));
 }
-
 ยฉ 2024 PrayinforRain. +
+Hugo.
\ No newline at end of file diff --git a/posts/2023/03/npm-scripts-doesnt-work/index.html b/posts/2023/03/npm-scripts-doesnt-work/index.html index 559e753..5726431 100644 --- a/posts/2023/03/npm-scripts-doesnt-work/index.html +++ b/posts/2023/03/npm-scripts-doesnt-work/index.html @@ -1,16 +1,16 @@ VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ | PrayinForRain.dev -

VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ

Table of Contents
image

๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€…

๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..

์•„๋ฌดํŠผ… ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์„ค์ •์„ ํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ๋ฅผ ๊ธฐ๋กํ•˜๊ณ ์ž ํ•œ๋‹ค.

NPM Scripts๊ฐ€ ์•ˆ ๋œ๋‹ค

NPM Scripts

VSCode๋Š” ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์—ด์—ˆ์„ ๋•Œ package.json ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ํ•˜๋‹จ์— ๋ณด์—ฌ์ค€๋‹ค. ์ด๊ฒŒ ์›๋ž˜๋Š” ์ต์Šคํ…์…˜์˜ ๊ธฐ๋Šฅ์ด์—ˆ๋‹ค๊ฐ€, ์–ธ์  ๊ฐ€ ์ต์Šคํ…์…˜์ด deprecated๊ฐ€ ๋˜๊ณ  ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ๋œ ๋ชจ์–‘์ด๋‹ค. ์•„๋ฌดํŠผ ์ €๊ฑธ ์‚ฌ์šฉํ•˜๋ฉด ๊ตณ์ด ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ ๋ช…๋ น์–ด๋ฅผ ํˆฌ๋‹ฅํˆฌ๋‹ฅ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ƒˆ ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์ค€๋‹ค. ํŠนํžˆ FE์™€ BE๋ฅผ ๊ฐ™์ด ์‹คํ–‰ํ•  ๋•Œ ๋„ˆ๋ฌด๋„ˆ๋ฌด ํŽธํ•˜๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งฅ๋ถ์—์„œ ์š”๋†ˆ์ด ์‹คํ–‰์ด ์•ˆ๋œ๋‹ค.

Error message

๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋„ ์•ˆ ๋œ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋”๋”์šฑ ์•ˆ๋œ๋‹ค. ์›๋ž˜ ๊ทธ๋ ‡๊ฒŒ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋˜ ๊ธฐ๋Šฅ์ธ๋ฐ, ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ ๊ฐ‘์ž๊ธฐ ๋ญ”๊ฐ€ ์กฑ์‡„๋ฅผ ์ฐฌ ๊ธฐ๋ถ„์ด๊ณ .. ์–ด์ฉŒ๊ณ  ์ €์ฉŒ๊ณ ..
์•„๋ฌดํŠผ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด ๋ณด๊ณ  ์ฒ˜์Œ์—๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ yarn 1.22.19 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋‚ด ๊ธ€๋กœ๋ฒŒ์— yarn berry๋งŒ ์„ค์น˜๋˜์–ด ์žˆ์–ด์„œ ๊ทธ๋Ÿฐ๊ฐ€ ํ•˜๊ณ  ๊ธฐ๋ณธ ๋ฒ„์ „์„ ๋ฐ”๊ฟ€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ ๋‹ค๋…”๋‹ค. ๋ฌผ๋ก  ์ •๋‹ต์ด ์•„๋‹ˆ์—ˆ๋‹ค.

ํ•ด๊ฒฐ ๊ณผ์ •

๋‚˜๋Š” ์ฒ˜์Œ์— node์™€ yarn์„ ์„ค์น˜ํ•  ๋•Œ, ~/.zshrc ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •์„ ๋„ฃ์—ˆ์—ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ํ•˜๋„ ๊น”์•„์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋งŽ๋‹ค๋ณด๋‹ˆ ์ด๊ฒƒ์ €๊ฒƒ ์ฐพ์•„์„œ ๋ฌป์ง€๋„ ๋”ฐ์ง€์ง€๋„ ์•Š๊ณ  ๋งˆ๊ตฌ ๋”ฐ๋ผํ–ˆ์—ˆ๋Š”๋ฐ,

export NVM_DIR="$HOME/.nvm"
+#[ -s "/usr/local/opt/nvm/nvm.sh" ] && . "/usr/local/opt/nvm/nvm.sh"  # This loads nvm
+#[ -s "/usr/local/opt/nvm/etc/bash_completion.d/nvm" ] && . "/usr/local/opt/nvm/etc/bash_completion.d/nvm"  # This loads nvm bash_completion
 

NVM_DIR๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ด ๋†“๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์žˆ์—ˆ๋‹ค. ์™œ์ผ๊นŒ? ์‹ถ์–ด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ–ˆ๋”๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

export NVM_DIR="$HOME/.nvm"
-[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
-[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
-

์Œ… ๊ทธ ์™ธ์—๋„ ~/.zshenv ๋‚ด์šฉ์„ source ~/.zshrc๋กœ ๋ณ€๊ฒฝํ•ด์„œ zshrc ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ € ์„ค์ • ํŒŒ์ผ์€ ๋Œ€์ฒด ์–ด๋””์„œ ์ž‘์„ฑ๋œ ๊ฒƒ์ผ๊นŒ? nvm์˜ ๊ณต์‹ ๋ฌธ์„œ์—๋„ $NVM_DIR๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์“ฐ์—ฌ ์žˆ์—ˆ๊ณ , ์ € ์ฝ”๋“œ๊ฐ€ ์ฒ˜์Œ ๋‚˜์˜จ ์ปค๋ฐ‹์„ ์ฐพ์•„ ๋ณด๋‹ˆ ์—ญ์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ NVM_DIR๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์žˆ์—ˆ๋‹ค.

Finding origin
๊ธฐ์›์„ ์ฐพ๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ๊ฒ€์ƒ‰๋˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋Š” ์–ด๋Š gist์— ์ €์žฅ๋œ bash_profile ์ฝ”๋“œ์˜€๋‹ค. ๋‚ด๊ฐ€ ์‰˜์— ๋Œ€ํ•ด ๊นŠ์ด ์•Œ๊ณ  ์žˆ์ง€ ์•Š์•„์„œ ๋” ์ด์ƒ ๊นŠ์ด ์›์ธ์„ ์ฐพ์œผ๋ ค๋ฉด ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค. 2๋‹ฌ๋งŒ์— ๋˜์ฐพ์€ NPM Scripts ๋ฉ”๋‰ด์— ๋ฌด์ฒ™ ๊ธฐ๋ถ„์ด ์ข‹๋‹ค.

Refs.

VSCODE build error `The terminal process “/bin/zsh ‘-c’, … - stack overflow
zsh: command not found: nvm ์˜ค๋ฅ˜ํ•ด๊ฒฐ๋ฒ•

 ยฉ 2024 PrayinforRain. +#[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +#[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion +

์Œ… ๊ทธ ์™ธ์—๋„ ~/.zshenv ๋‚ด์šฉ์„ source ~/.zshrc๋กœ ๋ณ€๊ฒฝํ•ด์„œ zshrc ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ € ์„ค์ • ํŒŒ์ผ์€ ๋Œ€์ฒด ์–ด๋””์„œ ์ž‘์„ฑ๋œ ๊ฒƒ์ผ๊นŒ? nvm์˜ ๊ณต์‹ ๋ฌธ์„œ์—๋„ $NVM_DIR๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์“ฐ์—ฌ ์žˆ์—ˆ๊ณ , ์ € ์ฝ”๋“œ๊ฐ€ ์ฒ˜์Œ ๋‚˜์˜จ ์ปค๋ฐ‹์„ ์ฐพ์•„ ๋ณด๋‹ˆ ์—ญ์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ NVM_DIR๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์žˆ์—ˆ๋‹ค.

Finding origin
๊ธฐ์›์„ ์ฐพ๊ณ  ์‹ถ์—ˆ์œผ๋‚˜ ๊ฒ€์ƒ‰๋˜๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฒฐ๊ณผ๋Š” ์–ด๋Š gist์— ์ €์žฅ๋œ bash_profile ์ฝ”๋“œ์˜€๋‹ค. ๋‚ด๊ฐ€ ์‰˜์— ๋Œ€ํ•ด ๊นŠ์ด ์•Œ๊ณ  ์žˆ์ง€ ์•Š์•„์„œ ๋” ์ด์ƒ ๊นŠ์ด ์›์ธ์„ ์ฐพ์œผ๋ ค๋ฉด ๋งŽ์€ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค. 2๋‹ฌ๋งŒ์— ๋˜์ฐพ์€ NPM Scripts ๋ฉ”๋‰ด์— ๋ฌด์ฒ™ ๊ธฐ๋ถ„์ด ์ข‹๋‹ค.

Refs.

VSCODE build error `The terminal process “/bin/zsh ‘-c’, … - stack overflow
zsh: command not found: nvm ์˜ค๋ฅ˜ํ•ด๊ฒฐ๋ฒ•

+Hugo.
\ No newline at end of file diff --git a/posts/2023/04/nextjs-storybook-with-pnp/index.html b/posts/2023/04/nextjs-storybook-with-pnp/index.html index 0af3dd9..b86ff79 100644 --- a/posts/2023/04/nextjs-storybook-with-pnp/index.html +++ b/posts/2023/04/nextjs-storybook-with-pnp/index.html @@ -1,23 +1,23 @@ Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐ | PrayinForRain.dev -

Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐ

Table of Contents

Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ

์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ … ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

Yarn Berry์˜ ๊ฐ€์žฅ ํฐ ๋ณ€ํ™”๋Š” Plug n Play ๋ฐฉ์‹์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค๋Š” ์ ์ด์ง€, Yarn Berry = PnP์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Yarn Berry๋„ nodeLinker ์˜ต์…˜์„ node-modules๋กœ ์ง€์ •ํ•œ๋‹ค๋ฉด nodemodules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜๋ถ€ํ„ฐ๋Š” _Berry ๋Œ€์‹  PnP ๋ผ๋Š” ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

๊ทธ๋Ÿผ ์“ฐ์„ธ์š”

create-next-app์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ค€๋น„

์šฐ์„  Next.js ์•ฑ์„ ์ƒ์„ฑํ•˜๊ณ , Yarn PnP๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ณด์ž.

yarn create next-app
+yarn set version berry ## yarn pnp๋กœ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋ณ€๊ฒฝ
+

PnP๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด yarn์˜ ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

## .yarnrc.yml
 nodeLinker: pnp
 
-# terminal
-yarn plugin import typescript # @types ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ด ์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ
-yarn # ์ž๋™์œผ๋กœ node_modules๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์‹œ ์„ค์น˜๋œ๋‹ค.
-yarn dlx @yarnpkg/sdks vscode # VSCode์—์„œ Repository์˜ Typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
-

๊ธฐ๋ณธ์ ์ธ ํ™˜๊ฒฝ ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค.

Storybook ์„ค์น˜ํ•˜๊ธฐ

Initialize

Storybook ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ์„ค์น˜ํ•ด ๋ณด๊ฒ ๋‹ค.

yarn dlx storybook@latest init
-

์„ค์น˜๋Š” ์ œ๋Œ€๋กœ ๋˜์—ˆ์ง€๋งŒ, yarn storybook์„ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ์ด๋Š” Yarn Berry์˜ ์—„๊ฒฉ ๋ชจ๋“œ(Strict mode)์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜์ง€ ์•Š์€ ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋ฌด์Šจ ๋ง์ผ๊นŒ? ๋Œ€์ถฉ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ A ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด, A ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” B ํŒจํ‚ค์ง€๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ์ค€์ธ์ง€๋Š” ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด babel์„ ํฌํ•จํ•œ ์ผ๋ถ€ ํŒจํ‚ค์ง€๋“ค์ด ์„ค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋งˆ React ์•ฑ์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ babel + webpack์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ํ…Œ๊ณ  Storybook์€ ์—ฌ๊ธฐ ๋‹ฌ๋ ค์žˆ๋Š” babel์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒŒ ์•„๋‹๊นŒ..(์ถ”์ƒ์ ์ธ ์ƒ๊ฐ)

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌดํ•œ ๋ฆฌํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์š”๊ตฌํ•˜๋Š” ์ข…์†์„ฑ์„ ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, .yarnrc.yml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ํ•ด์ œํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

# .yarnrc.yml
+## terminal
+yarn plugin import typescript ## @types ํŒจํ‚ค์ง€๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ด ์ฃผ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ
+yarn ## ์ž๋™์œผ๋กœ node_modules๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์‹œ ์„ค์น˜๋œ๋‹ค.
+yarn dlx @yarnpkg/sdks vscode ## VSCode์—์„œ Repository์˜ Typescript๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช…๋ น์–ด
+

๊ธฐ๋ณธ์ ์ธ ํ™˜๊ฒฝ ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค.

Storybook ์„ค์น˜ํ•˜๊ธฐ

Initialize

Storybook ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ์„ค์น˜ํ•ด ๋ณด๊ฒ ๋‹ค.

yarn dlx storybook@latest init
+

์„ค์น˜๋Š” ์ œ๋Œ€๋กœ ๋˜์—ˆ์ง€๋งŒ, yarn storybook์„ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ์ด๋Š” Yarn Berry์˜ ์—„๊ฒฉ ๋ชจ๋“œ(Strict mode)์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜์ง€ ์•Š์€ ์ข…์†์„ฑ์„ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๋ฌด์Šจ ๋ง์ผ๊นŒ? ๋Œ€์ถฉ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ A ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด, A ํŒจํ‚ค์ง€์—์„œ ์‚ฌ์šฉํ•˜๋Š” B ํŒจํ‚ค์ง€๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ •ํ™•ํžˆ ์–ด๋–ค ๊ธฐ์ค€์ธ์ง€๋Š” ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ด ๋ฌธ์ œ๋กœ ์ธํ•ด babel์„ ํฌํ•จํ•œ ์ผ๋ถ€ ํŒจํ‚ค์ง€๋“ค์ด ์„ค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋งˆ React ์•ฑ์˜ ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„ babel + webpack์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ํ…Œ๊ณ  Storybook์€ ์—ฌ๊ธฐ ๋‹ฌ๋ ค์žˆ๋Š” babel์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒŒ ์•„๋‹๊นŒ..(์ถ”์ƒ์ ์ธ ์ƒ๊ฐ)

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌดํ•œ ๋ฆฌํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์š”๊ตฌํ•˜๋Š” ์ข…์†์„ฑ์„ ํ•˜๋‚˜์”ฉ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, .yarnrc.yml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—„๊ฒฉ ๋ชจ๋“œ๋ฅผ ํ•ด์ œํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

## .yarnrc.yml
 pnpMode: loose
 
-# ๋‹ค์‹œ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜
+## ๋‹ค์‹œ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜
 yarn
 

๊ทธ๋ฆฌ๊ณ  ์–ด์งธ์„œ์ธ์ง€ ๋Š์Šจํ•œ ๋ชจ๋“œ๋กœ ์žฌ์„ค์น˜๋ฅผ ํ•ด๋„ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๋Š” styled-jsx์™€ @babel/core๋ฅผ ์„ค์น˜ํ•ด ์ฃผ๊ฒ ๋‹ค.

yarn add -D @babel/core styled-jsx
-

Webpack์˜ ์„ค์ •์„ ๊ณ ์น˜๊ธฐ

๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์Šคํ† ๋ฆฌ๋ถ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌด์–ธ๊ฐ€์˜ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ ์Šคํ† ๋ฆฌ๋ถ dev server๊ฐ€ ๊บผ์ ธ ๋ฒ„๋ฆฐ๋‹ค.

css loader error

@storybook/nextjs์˜ ๋ฒˆ๋“ค๋Ÿฌ์ธ webpack์—์„œ css-loader์™€ ๊ธฐํƒ€๋“ฑ๋“ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋Š” ๋ชจ์–‘์ด๋‹ค. ํŠน์ดํ•˜๊ฒŒ๋„ ์ด ์˜ค๋ฅ˜๋Š” PnP ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ธ๋ฐ, ๋Œ€์ถฉ ์ด ๋นŒ๋”์—์„œ webpack์˜ css-loader ๊ด€๋ จ ์„ค์ •์„ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด ์ด๋Ÿฐ ์ถ”์ธก์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. configureCss ํ•จ์ˆ˜์—์„œ options.url์„ ํฌํ•จํ•œ ๊ธฐํƒ€๋“ฑ๋“ฑ์„ ๋‹ด์€ ์„ค์ • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ์ด ๊ณผ์ •์—์„œ getImportAndUrlCssLoaderOptionsํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ getUrlResolver ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  3. getUrlResolver๋Š” NextConfig ๊ฐ์ฒด์˜ experimental property๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. experimental์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.
interface ExperimentalConfig {
+

Webpack์˜ ์„ค์ •์„ ๊ณ ์น˜๊ธฐ

๋‹ค์‹œ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์Šคํ† ๋ฆฌ๋ถ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ๋ฌด์–ธ๊ฐ€์˜ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ ์Šคํ† ๋ฆฌ๋ถ dev server๊ฐ€ ๊บผ์ ธ ๋ฒ„๋ฆฐ๋‹ค.

css loader error

@storybook/nextjs์˜ ๋ฒˆ๋“ค๋Ÿฌ์ธ webpack์—์„œ css-loader์™€ ๊ธฐํƒ€๋“ฑ๋“ฑ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด์„œ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ธฐ๋Š” ๋ชจ์–‘์ด๋‹ค. ํŠน์ดํ•˜๊ฒŒ๋„ ์ด ์˜ค๋ฅ˜๋Š” PnP ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ธ๋ฐ, ๋Œ€์ถฉ ์ด ๋นŒ๋”์—์„œ webpack์˜ css-loader ๊ด€๋ จ ์„ค์ •์„ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์„ ์‚ดํŽด๋ณด๋ฉด ์ด๋Ÿฐ ์ถ”์ธก์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. configureCss ํ•จ์ˆ˜์—์„œ options.url์„ ํฌํ•จํ•œ ๊ธฐํƒ€๋“ฑ๋“ฑ์„ ๋‹ด์€ ์„ค์ • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ์ด ๊ณผ์ •์—์„œ getImportAndUrlCssLoaderOptionsํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ getUrlResolver ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  3. getUrlResolver๋Š” NextConfig ๊ฐ์ฒด์˜ experimental property๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. experimental์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.
interface ExperimentalConfig {
   // ...
   urlImports?: NonNullable<webpack.Configuration["experiments"]>["buildHttp"];
   // ...
@@ -32,17 +32,17 @@
   "@storybook/preset-scss",
 ];
 // ...
-

storybook launched
์ด์ œ ์ •์ƒ์ ์œผ๋กœ ์Šคํ† ๋ฆฌ๋ถ์ด ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

main.ts์˜ ํƒ€์ž… ์˜ค๋ฅ˜

framework name type error

์ฒ˜์Œ init ํ–ˆ์„ ๋•Œ๋ถ€ํ„ฐ ๊ณ„์† ๊ฑฐ์Šฌ๋ ธ๋Š”๋ฐ, @storybook/nextjs ํ…œํ”Œ๋ฆฟ์ด .storybook/main.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋ ˆ์ž„์›Œํฌ๋ช…์„ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•ด์„œ ์ƒ์„ฑํ•˜๋ฉด์„œ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ชจ์ˆœ์ ์ด๊ฒŒ๋„ @storybook/nextjs์˜ StorybookConfig ๊ฐ์ฒด ํƒ€์ž…์€ ์ด ๋ถ€๋ถ„์— ๋ฌด์กฐ๊ฑด @storybook/nextjs๋ผ๋Š” ๋ฌธ์ž์—ด๋งŒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋ƒฅ ์‹คํ–‰์ด ๋˜๊ธด ํ•˜๋Š”๋ฐ, ๊ณ„์† ๋ถ‰์€ ์ค„์ด ๊ทธ์–ด์ ธ ์žˆ์œผ๋ฉด ๋ชน์‹œ ๊ณค๋ž€ํ•˜๋‹ˆ ์ด๊ฒƒ๋„ ๋ฐ”๊ฟ” ์ฃผ๊ฒ ๋‹ค.

// main.ts
+

storybook launched
์ด์ œ ์ •์ƒ์ ์œผ๋กœ ์Šคํ† ๋ฆฌ๋ถ์ด ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

main.ts์˜ ํƒ€์ž… ์˜ค๋ฅ˜

framework name type error

์ฒ˜์Œ init ํ–ˆ์„ ๋•Œ๋ถ€ํ„ฐ ๊ณ„์† ๊ฑฐ์Šฌ๋ ธ๋Š”๋ฐ, @storybook/nextjs ํ…œํ”Œ๋ฆฟ์ด .storybook/main.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ๋•Œ ํ”„๋ ˆ์ž„์›Œํฌ๋ช…์„ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•ด์„œ ์ƒ์„ฑํ•˜๋ฉด์„œ ํƒ€์ž… ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ชจ์ˆœ์ ์ด๊ฒŒ๋„ @storybook/nextjs์˜ StorybookConfig ๊ฐ์ฒด ํƒ€์ž…์€ ์ด ๋ถ€๋ถ„์— ๋ฌด์กฐ๊ฑด @storybook/nextjs๋ผ๋Š” ๋ฌธ์ž์—ด๋งŒ์„ ํ—ˆ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋ƒฅ ์‹คํ–‰์ด ๋˜๊ธด ํ•˜๋Š”๋ฐ, ๊ณ„์† ๋ถ‰์€ ์ค„์ด ๊ทธ์–ด์ ธ ์žˆ์œผ๋ฉด ๋ชน์‹œ ๊ณค๋ž€ํ•˜๋‹ˆ ์ด๊ฒƒ๋„ ๋ฐ”๊ฟ” ์ฃผ๊ฒ ๋‹ค.

// main.ts
 // ...
   framework: {
     name: "@storybook/nextjs",
     options: {},
   },
 // ...
-

ํ•˜์ง€๋งŒ node_modules๊ฐ€ ์ƒ๊ธฐ์ž–์•„์š”

node_modules folder

storybook ๋ฟ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ธ๋ฐ, PnP๋ชจ๋“œ์—์„œ๋„ ์Šคํ† ๋ฆฌ๋ถ์„ ์‹คํ–‰ํ•˜๋ฉด node_modules ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์•ˆ์—๋Š” ๋Œ€์ถฉ… ์Šคํ† ๋ฆฌ๋ถ dev ์„œ๋ฒ„ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ž„์‹œ ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๋‚˜๋ฅผ ํฌํ•จํ•ด์„œ ๋งŽ์€ Yarn PnP ์‚ฌ์šฉ์ž๋“ค์ด ์ด ํ˜„์ƒ์— ๋Œ€ํ•ด ๋ถˆํŽธํ•จ(?)์„ ๊ฒช๊ณ  ์žˆ๋Š”๋ฐ, Storybook์˜ ๊ธฐ์—ฌ์ž๊ฐ€ ์ด์Šˆ ๋Œ“๊ธ€์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทผ๊ฑฐ๋ฅผ ์ด์•ผ๊ธฐํ•ด ์ฃผ์—ˆ๋‹ค.

  • node_modules/.cache/package-name์— ์ž„์‹œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๋‹ค.
  • node_modules๋Š” ๋ชจ๋“  Javascript/Typescript ํ”„๋กœ์ ํŠธ์—์„œ .gitignore๋กœ ๋ฌด์‹œ๋˜๊ณ  ์žˆ๋‹ค.
  • node_modules์—๋Š” ๋ณดํ†ต ์–ธ์ œ๋“  ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‚ญ์ œ๋œ๋‹ค.
  • ํ˜„์žฌ ์‹œ์ ์—์„œ NPM, Yarn(PnP ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„ ์—†์ด) ๋ชจ๋‘์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ฒ„๊ทธ ๋Š” ์•„๋‹ˆ๊ณ , ๊ธฐ๋Œ€๋œ ๋™์ž‘(Expected Behavior) ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋“ฏ ํ•˜๋‹ค. ๋Œ“๊ธ€์— ๋ณด๋ฉด Yarn ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด์Šˆ์— ์ด ์บ์‹œ ํŒŒ์ผ๋“ค์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์šฉ์ด ์˜ฌ๋ผ์™€ ์žˆ๋Š”๋ฐ, 3๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๊นŒ์ง€ ์ฐธ์กฐ ๋˜๋Š” ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์–ด์„œ ์ž ์ • ๋ณด๋ฅ˜๋œ ๋ชจ์–‘์ด๋‹ค. ์ข€ ํ•ด ์ฃผ๋ฉด ์ข‹์„ํ…๋ฐ..์ฉ..

๋‚ด๊ฐ€ ์ด๊ฒผ๋‹ค ์Šคํ† ๋ฆฌ๋ถ์•„

์•ž์„œ ๋งํ•œ ๋‚ด ์ƒํ™ฉ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ฃผ๋ณ€์— ๊ฝค๋‚˜ Yarn berry ์ฒ˜๋Œ์ด(?)๋กœ ํผ์ ธ ์žˆ๋Š”๋ฐ ์ •์ž‘ ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ์—๋Š” ํ•œ์ •๋œ ์‹œ๊ฐ„ ์•ˆ์—์„œ ๋” ์ด์ƒ ์ง€์ฒดํ•  ์ˆ˜๊ฐ€ ์—†์–ด node_modules๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์•„์‰ฌ์› ๋‹ค. ์ด๋ฏธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋‘ ์ •๋ฆฌ๋œ ํ›„์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ง€๊ธˆ์— ์™€์„œ๋‚˜๋งˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋ž˜๋„ ๋‹คํ–‰์ด๋‹ค.

ํ•˜๋‚˜ ์†์ƒํ•œ ์—ํ”ผ์†Œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ.. ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ๋ดค๋˜ instruction์—์„œ npx ์ปค๋งจ๋“œ๋งŒ์„ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๊ณ , ๋‚˜๋Š” npx๊ฐ€ npm๊ณผ yarn ์ค‘ ์ƒํ™ฉ์— ๋งž๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์•Œ์•„์„œ ์„ ํƒํ•ด ์ค€๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜์‹ฌ ์—†์ด ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€ ์—๋Ÿฌ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋‚˜ ์กฐ๊ธˆ ๋” ๊ณ ์ƒํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฐ”๋กœ ์–ผ๋งˆ ์ „์— ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์ˆ˜์ •๋œ PR์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ.. ์Šคํ† ๋ฆฌ๋ถ ์ดˆ๊ธฐํ™”๋Š” yarn dlx storybook ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ์–‘์ด๋‹ค. npx๋กœ ํ•ด๋„ ํ•ด๊ฒฐ ๊ณผ์ •์— ํฐ ์ฐจ์ด๋Š” ์—†์ง€๋งŒ ์•„์ด๊ณ  ์†ํ„ฐ์ ธ

Refs.

 ยฉ 2024 PrayinforRain. +

ํ•˜์ง€๋งŒ node_modules๊ฐ€ ์ƒ๊ธฐ์ž–์•„์š”

node_modules folder

storybook ๋ฟ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ธ๋ฐ, PnP๋ชจ๋“œ์—์„œ๋„ ์Šคํ† ๋ฆฌ๋ถ์„ ์‹คํ–‰ํ•˜๋ฉด node_modules ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์•ˆ์—๋Š” ๋Œ€์ถฉ… ์Šคํ† ๋ฆฌ๋ถ dev ์„œ๋ฒ„ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ž„์‹œ ํŒŒ์ผ๋“ค์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ๋‚˜๋ฅผ ํฌํ•จํ•ด์„œ ๋งŽ์€ Yarn PnP ์‚ฌ์šฉ์ž๋“ค์ด ์ด ํ˜„์ƒ์— ๋Œ€ํ•ด ๋ถˆํŽธํ•จ(?)์„ ๊ฒช๊ณ  ์žˆ๋Š”๋ฐ, Storybook์˜ ๊ธฐ์—ฌ์ž๊ฐ€ ์ด์Šˆ ๋Œ“๊ธ€์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทผ๊ฑฐ๋ฅผ ์ด์•ผ๊ธฐํ•ด ์ฃผ์—ˆ๋‹ค.

  • node_modules/.cache/package-name์— ์ž„์‹œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํŒจํ„ด์ด๋‹ค.
  • node_modules๋Š” ๋ชจ๋“  Javascript/Typescript ํ”„๋กœ์ ํŠธ์—์„œ .gitignore๋กœ ๋ฌด์‹œ๋˜๊ณ  ์žˆ๋‹ค.
  • node_modules์—๋Š” ๋ณดํ†ต ์–ธ์ œ๋“  ์ง€์šธ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‚ญ์ œ๋œ๋‹ค.
  • ํ˜„์žฌ ์‹œ์ ์—์„œ NPM, Yarn(PnP ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๊ด€๊ณ„ ์—†์ด) ๋ชจ๋‘์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ฒ„๊ทธ ๋Š” ์•„๋‹ˆ๊ณ , ๊ธฐ๋Œ€๋œ ๋™์ž‘(Expected Behavior) ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋“ฏ ํ•˜๋‹ค. ๋Œ“๊ธ€์— ๋ณด๋ฉด Yarn ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ด์Šˆ์— ์ด ์บ์‹œ ํŒŒ์ผ๋“ค์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด์šฉ์ด ์˜ฌ๋ผ์™€ ์žˆ๋Š”๋ฐ, 3๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ๊นŒ์ง€ ์ฐธ์กฐ ๋˜๋Š” ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์–ด์„œ ์ž ์ • ๋ณด๋ฅ˜๋œ ๋ชจ์–‘์ด๋‹ค. ์ข€ ํ•ด ์ฃผ๋ฉด ์ข‹์„ํ…๋ฐ..์ฉ..

๋‚ด๊ฐ€ ์ด๊ฒผ๋‹ค ์Šคํ† ๋ฆฌ๋ถ์•„

์•ž์„œ ๋งํ•œ ๋‚ด ์ƒํ™ฉ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ฃผ๋ณ€์— ๊ฝค๋‚˜ Yarn berry ์ฒ˜๋Œ์ด(?)๋กœ ํผ์ ธ ์žˆ๋Š”๋ฐ ์ •์ž‘ ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ์—๋Š” ํ•œ์ •๋œ ์‹œ๊ฐ„ ์•ˆ์—์„œ ๋” ์ด์ƒ ์ง€์ฒดํ•  ์ˆ˜๊ฐ€ ์—†์–ด node_modules๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์•„์‰ฌ์› ๋‹ค. ์ด๋ฏธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ชจ๋‘ ์ •๋ฆฌ๋œ ํ›„์ง€๋งŒ ๊ทธ๋ž˜๋„ ์ง€๊ธˆ์— ์™€์„œ๋‚˜๋งˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋ž˜๋„ ๋‹คํ–‰์ด๋‹ค.

ํ•˜๋‚˜ ์†์ƒํ•œ ์—ํ”ผ์†Œ๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ.. ๋‚ด๊ฐ€ ์ฒ˜์Œ์— ๋ดค๋˜ instruction์—์„œ npx ์ปค๋งจ๋“œ๋งŒ์„ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๊ณ , ๋‚˜๋Š” npx๊ฐ€ npm๊ณผ yarn ์ค‘ ์ƒํ™ฉ์— ๋งž๋Š” ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์•Œ์•„์„œ ์„ ํƒํ•ด ์ค€๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜์‹ฌ ์—†์ด ์‚ฌ์šฉํ–ˆ๋‹ค๊ฐ€ ์—๋Ÿฌ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋‚˜ ์กฐ๊ธˆ ๋” ๊ณ ์ƒํ–ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๋ฐ”๋กœ ์–ผ๋งˆ ์ „์— ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์ˆ˜์ •๋œ PR์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ.. ์Šคํ† ๋ฆฌ๋ถ ์ดˆ๊ธฐํ™”๋Š” yarn dlx storybook ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ชจ์–‘์ด๋‹ค. npx๋กœ ํ•ด๋„ ํ•ด๊ฒฐ ๊ณผ์ •์— ํฐ ์ฐจ์ด๋Š” ์—†์ง€๋งŒ ์•„์ด๊ณ  ์†ํ„ฐ์ ธ

Refs.

+Hugo.
\ No newline at end of file diff --git a/posts/2023/04/numble-talk/index.html b/posts/2023/04/numble-talk/index.html index bed8daa..fc49262 100644 --- a/posts/2023/04/numble-talk/index.html +++ b/posts/2023/04/numble-talk/index.html @@ -1,14 +1,14 @@ ๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ  | PrayinForRain.dev -

๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

Table of Contents

์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

ui design

3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.

๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..

๋ง›์„ ๋ณด์ž

์Šคํ† ๋ฆฌ๋ถ์„ ์“ฐ์ž

ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์™ธ์—๋„ storybook์˜ ์ž‘์„ฑ์ด ์š”๊ตฌ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ storybook์€ ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ์žˆ์–ด์„œ ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค ์ƒ๊ฐํ–ˆ๋Š”๋ฐ.. storybook ์„ค์น˜๋ถ€ํ„ฐ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์šฐ์„  ํ”„๋กœ์ ํŠธ์—์„œ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์ด Next.js์˜€๊ณ , ๋‚ด ๊ฐœ์ธ์ ์ธ ์„ ํ˜ธ๋กœ Yarn berry(PnP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋Š”๋ฐ, Next.js ํ”„๋กœ์ ํŠธ์—์„œ storybook์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ • builder add-on์„ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ณ , ๋Œ€์ถฉ ์ด ๊ทผ์ฒ˜ ์ง€์ ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋Œ€์ถฉ ์ง์ž‘ํ•œ ์š”์ธ์€ ์ด๋žฌ๋‹ค.

  • ์ตœ๊ทผ์— ์—…๋ฐ์ดํŠธ๋œ storybook 7๊ณผ storybook/nextjs ๋นŒ๋”์˜ ํ˜ธํ™˜ ๋ฌธ์ œ
  • storybook 7๊ณผ yarn PnP์˜ ํ˜ธํ™˜ ๋ฌธ์ œ
  • Next.js 13์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” turbopack๊ณผ์˜ ํ˜ธํ™˜ ๋ฌธ์ œ
  • ๋‚ด ์ปดํ“จํ„ฐ ๋ฌธ์ œ(์ด์ „์—๋„ storybook ๊ด€๋ จํ•ด์„œ ๋‚ด ์ปดํ“จํ„ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค)

๊ฝค ๋งŽ์€ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์•„๋‹ค๋‹ˆ๋ฉฐ ํ•ด๊ฒฐ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๊ฒฐ๊ตญ Yarn PnP๋ฅผ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. PnP๋ฅผ ์“ฐ์ง€ ์•Š์œผ๋ฉด ์ง€๊ธˆ ๋ฐ์Šคํฌํƒ‘์ด ๊ฝค ๋Š๋ฆฐ ์ƒํƒœ์—ฌ์„œ ์กฐ๊ธˆ ์†์ƒํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค. ์ด ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ์ •๋ฆฌ๊ฐ€ ๋œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ธ€๋กœ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค.

OpenAI์™€ ์นœํ•ด์ง€์ž

๊ฒฐ๊ณผ๋ฌผ ์‚ฌ์ง„

์ฑ—์œ์„ ์ œ๋Œ€๋กœ ๋ชจ์‹œ๊ธฐ ์œ„ํ•ด์„œ๋Š” API ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์•ผ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์ง์ ‘ ๋งจ๋•…์—์„œ ๋ฌธ์„œ๋ฅผ ์ •๋…ํ•˜๋ฉฐ ๋ฌด์–ธ๊ฐ€ ์‹œ์ž‘ํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋˜๊ฐ€? ์•„๋ฌดํŠผ ๊ฐ€๋œฉ์ด๋‚˜ ๋ฏธ์ง€์˜ ์˜์—ญ์ธ๋ฐ ์˜์–ด๋กœ ์จ์žˆ๋‹ค๋Š” ์ ์ด ํฐ ๊ฑธ๋ฆผ๋Œ์ด ๋˜์—ˆ๋‹ค.

๋‹คํ–‰ํžˆ ๋‚ด๊ฐ€ ์ฝ์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ๋ช…ํ™•ํ–ˆ๊ณ , ๋จผ์ € ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋ณด์‹  ์„ ๋ฐœ๋Œ€(?) ํŒ€์› ๋ถ„๋“ค์˜ ํ›„๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฝค ๊ดœ์ฐฎ์€ ์ง€์ ์—์„œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฑฑ์ •ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๊ธˆ๋ฐฉ ChatGPT๋ฅผ ์“ฐ๋Š” ๋Š๋‚Œ์ฒ˜๋Ÿผ ๋Œ€ํ™”๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ 1:1 ๋Œ€ํ™”๋งŒ ํ•˜๋Š” ์ฑ—์Œค์„ ์–ด๋–ป๊ฒŒ 1:N, ๊ทธ๋ฆฌ๊ณ  ai๋ผ๋ฆฌ๋„ ๋Œ€ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„์„ ํ• ๊นŒ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ด๋Ÿฐ์ €๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€ OpenAI ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธ€์—์„œ ํžŒํŠธ๋ฅผ ์–ป์—ˆ๋‹ค. ์ฑ—๋ด‡์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๋Š” ์ง€ ์™€๋‹ฟ์ง€ ์•Š์•˜๋Š”๋ฐ, ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ์ฑ—๋ด‡์—๊ฒŒ ๋„ˆ๋Š” ๋ˆ„๊ตฌ๋‹ค ํ•˜๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ๋ฉ”์‹œ์ง€๋ฅผ ํ†ตํ•ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋‹ต์„ ์–ป์–ด๋‚ด๋ฉด ๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค.

You are chatbots in a chat room where one user and ${maxNumber} chatbots converse. Each message is in the format of number: content, where 0 represents the user's message and 1 to n represents the messages of the nth chatbot. You are responsible for assuming the role of all 1 to ${maxNumber} chatbots and participating actively in the conversation. Each chatbot can speak all at once, only a few at a time, or one chatbot can speak multiple times. Please format your response in number: content format, with each message separated by two line breaks.
 
 // ํ•œ๊ธ€
 ๋‹น์‹ ์€ ์œ ์ € ํ•œ ๋ช…๊ณผ ${maxNumber}๊ฐœ์˜ ์ฑ—๋ด‡์ด ๋Œ€ํ™”ํ•˜๋Š” ์ฑ„ํŒ…๋ฐฉ์˜ ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์‹œ์ง€๋Š” number: content ํฌ๋งท์œผ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ 0๋ฒˆ์€ ์œ ์ €์˜ ๋ฉ”์‹œ์ง€๋ฅผ, 1๋ฒˆ๋ถ€ํ„ฐ๋Š” n๋ฒˆ์งธ ์ฑ—๋ด‡์˜ ๋ฉ”์‹œ์ง€์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ 1 ~ ${maxNumber}๋ฒˆ ์ฑ—๋ด‡์˜ ์—ญํ• ์„ ๋ชจ๋‘ ๋งก์•„ ๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฑ—๋ด‡์ด ๋ง์„ ํ•˜๊ฑฐ๋‚˜, ์ผ๋ถ€๋งŒ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ํ•œ ์ฑ—๋ด‡์ด ์—ฌ๋Ÿฌ ๋งˆ๋””๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ์—ญ์‹œ number: content ํฌ๋งท์œผ๋กœ, ๊ฐ ๋ฉ”์‹œ์ง€๋Š” ๋‘ ๋ฒˆ์˜ ์ค„๋ฐ”๊ฟˆ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”.
-

ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์—์„œ ์ฃผ๊ณ ๋ฐ›๋Š” ํ† ํฐ (๋Œ€์ถฉ ๋ฉ”์‹œ์ง€์˜ ๊ธธ์ด) ์ˆ˜์˜ ์ œํ•œ์ด ์žˆ์–ด์„œ, ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋„๋ก ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์—ˆ๋‹ค. ํ•™๋ถ€์ƒ ๋•Œ OpenAI Gym์„ ํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์กฐ๊ธˆ ์˜ค๋ฒ„๋žฉ๋˜๋ฉด์„œ ๋Š๋‚Œ์ด ๋ฌ˜ํ–ˆ๋‹ค. ์–˜์•ผ ์ด๊ฑด ์ด๋ ‡๊ฒŒ ๋‹ตํ•ด์•ผ ํ•œ๋‹จ๋‹ค..
๋ฌธ์ œ๋Š” ์ฑ—์Œค์ด ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋Œ€๋‹ต์„ ์ž˜ ํ•ด์ฃผ๊ธฐ๋„, ๊ธฐ๋ณธ์ ์ธ ์‘๋‹ต ํฌ๋งท๋„ ์ง€ํ‚ค์ง€ ์•Š๋Š” ์ผ๋„ ์žˆ์–ด์„œ ์ด๋Ÿฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๋กœ ์š”๊ตฌํ•˜๋Š” ๋‚ด์šฉ ์ž์ฒด๊ฐ€ ์ค‘์˜์ ์œผ๋กœ ํ•ด์„๋  ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ๋ฐ”๊พธ๋ฉด์„œ ์กฐ์ ˆํ–ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์ง„ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋ฉ”์‹œ์ง€ ํฌ๋งท์€ ์ง€์ผœ์„œ ์ด์•ผ๊ธฐํ•˜๋„๋ก ๋งŒ๋“œ๋Š”๋ฐ๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  API ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ.. ์š”๊ตฌ์‚ฌํ•ญ์—์„œ๋Š” ai๋ผ๋ฆฌ๋„ ๊ณ„์† ์ฑ„ํŒ…์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ผ๊ณ  ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์ง€์†์ ์œผ๋กœ API ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์˜๋ฏธ ์—†๋Š” ๋Œ€ํ™”๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋ญ”๊ฐ€ ์ด์ƒํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  OpenAI์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‚˜ ์‹ถ์€ ๊ฑฑ์ •์— ๊ฐ ๋ด‡์ด ์„œ๋กœ์—๊ฒŒ ํ•  ๋ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œ๋ฒˆ์— ๋Œ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋‚ด๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ข‹์€ ํŒ€!

bug issue

๊ณผ์ •์„ ํ˜ผ์ž๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฟ์ด์„œ ๊ฒช์œผ๋ฉด ๋” ์–ป๋Š” ๊ฒŒ ์žˆ์„ ๊ฑฐ๋ž€ ์ƒ๊ฐ์— ํŒ€์—๋„ ์ฐธ์—ฌํ–ˆ๋‹ค. ๋‚˜์™€ ๋น„์Šทํ•œ ์‹ ์ž… ๋ถ„๋“ค์ด์…จ๊ณ , ์ •๋ง ์šด ์ข‹๊ฒŒ๋„ ์„œ๋กœ ์„ฑ๊ฒฉ์ด ์ž˜ ๋งž์•„์„œ ์ฆ๊ฒ๊ฒŒ ์Šคํฌ๋Ÿผ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ๊ฒน์น˜๋ฉด์„œ ๋ง‰๋ฐ”์ง€์— ๊ฑฐ์˜ ํ•ด์ปคํ†ค ๋งˆ์ธ๋“œ(?)๋กœ ํ•˜๋‹ค๊ฐ€ ์–ด๋–ป๊ฒŒ ์Šคํฌ๋Ÿผ ๋•Œ 1์ฐจ ๋ฐฐํฌ๊นŒ์ง€ ๋งˆ์น˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์—ฌ๋“œ๋ ธ๋Š”๋ฐ, ํ•œ ๋ถ„์ด ๋ฒ„๊ทธ๊นŒ์ง€ ๋ฐœ๊ฒฌํ•ด ์ฃผ๊ธฐ๋„ ํ–ˆ๋‹ค. ์žฌ๋ฐŒ๋Š” ๊ฒฝํ—˜์ด์—ˆ๋‹ค ใ…‹ใ…‹..
๋„ˆ๋ฌด ํ™œ๊ธฐ์ฐจ๊ณ  ์ ๊ทน์ ์œผ๋กœ ํ•จ๊ป˜ ํ•ด ์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ ค์š”!

๋งˆ์น˜๋ฉฐ

์ƒ๊ฐ๋ณด๋‹ค ์ผ์ •์ด ๋นก๋นกํ–ˆ๊ณ , ๊ฑฑ์ •๋ณด๋‹ค๋Š” ํ•  ๋งŒ ํ–ˆ๋˜ ์ฑŒ๋ฆฐ์ง€์˜€๋‹ค. ์•„์‰ฌ์šด ์ ์ด ์žˆ๋‹ค๋ฉด ์ฑ—์Œค๋“ค์ด ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋Œ€ํ™”์— ์†Œ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•œ๋‹ค๋Š” ์ ๊ณผ API ํ…Œ์ŠคํŠธ๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ค ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•„์„œ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ.. ์–ด๋–ป๊ฒŒ ํ–ˆ์–ด์•ผ ํ• ๊นŒ? ๋‚˜์ค‘์— ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์ž˜ ํ•˜์‹  ๋ถ„๋“ค์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ณต๊ฐœ๋œ๋‹ค๋ฉด ํ•œ ๋ฒˆ ๋ณด๊ณ  ์‹ถ๋‹ค.

๋„˜๋ธ”ํ†ก ๋ ˆํฌ์ง€ํ† ๋ฆฌ
๋„˜๋ธ”ํ†ก ๋ฐฐํฌ ๋งํฌ

 ยฉ 2024 PrayinforRain. +

ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์—์„œ ์ฃผ๊ณ ๋ฐ›๋Š” ํ† ํฐ (๋Œ€์ถฉ ๋ฉ”์‹œ์ง€์˜ ๊ธธ์ด) ์ˆ˜์˜ ์ œํ•œ์ด ์žˆ์–ด์„œ, ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋„๋ก ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์—ˆ๋‹ค. ํ•™๋ถ€์ƒ ๋•Œ OpenAI Gym์„ ํ•ด ๋ณธ ๊ฒฝํ—˜์ด ์กฐ๊ธˆ ์˜ค๋ฒ„๋žฉ๋˜๋ฉด์„œ ๋Š๋‚Œ์ด ๋ฌ˜ํ–ˆ๋‹ค. ์–˜์•ผ ์ด๊ฑด ์ด๋ ‡๊ฒŒ ๋‹ตํ•ด์•ผ ํ•œ๋‹จ๋‹ค..
๋ฌธ์ œ๋Š” ์ฑ—์Œค์ด ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋Œ€๋‹ต์„ ์ž˜ ํ•ด์ฃผ๊ธฐ๋„, ๊ธฐ๋ณธ์ ์ธ ์‘๋‹ต ํฌ๋งท๋„ ์ง€ํ‚ค์ง€ ์•Š๋Š” ์ผ๋„ ์žˆ์–ด์„œ ์ด๋Ÿฐ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๋กœ ์š”๊ตฌํ•˜๋Š” ๋‚ด์šฉ ์ž์ฒด๊ฐ€ ์ค‘์˜์ ์œผ๋กœ ํ•ด์„๋  ์†Œ์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์ด๊ฒƒ์ €๊ฒƒ ๋ฐ”๊พธ๋ฉด์„œ ์กฐ์ ˆํ–ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ•ญ์ƒ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์ง„ ์•Š์ง€๋งŒ ์ ์–ด๋„ ๋ฉ”์‹œ์ง€ ํฌ๋งท์€ ์ง€์ผœ์„œ ์ด์•ผ๊ธฐํ•˜๋„๋ก ๋งŒ๋“œ๋Š”๋ฐ๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  API ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ.. ์š”๊ตฌ์‚ฌํ•ญ์—์„œ๋Š” ai๋ผ๋ฆฌ๋„ ๊ณ„์† ์ฑ„ํŒ…์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ผ๊ณ  ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์ง€์†์ ์œผ๋กœ API ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ์˜๋ฏธ ์—†๋Š” ๋Œ€ํ™”๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋ญ”๊ฐ€ ์ด์ƒํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  OpenAI์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ ์‚ฌ์šฉ๋Ÿ‰์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‚˜ ์‹ถ์€ ๊ฑฑ์ •์— ๊ฐ ๋ด‡์ด ์„œ๋กœ์—๊ฒŒ ํ•  ๋ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•œ๋ฒˆ์— ๋Œ€ํ™”๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋‚ด๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

์ข‹์€ ํŒ€!

bug issue

๊ณผ์ •์„ ํ˜ผ์ž๋ณด๋‹ค๋Š” ์—ฌ๋Ÿฟ์ด์„œ ๊ฒช์œผ๋ฉด ๋” ์–ป๋Š” ๊ฒŒ ์žˆ์„ ๊ฑฐ๋ž€ ์ƒ๊ฐ์— ํŒ€์—๋„ ์ฐธ์—ฌํ–ˆ๋‹ค. ๋‚˜์™€ ๋น„์Šทํ•œ ์‹ ์ž… ๋ถ„๋“ค์ด์…จ๊ณ , ์ •๋ง ์šด ์ข‹๊ฒŒ๋„ ์„œ๋กœ ์„ฑ๊ฒฉ์ด ์ž˜ ๋งž์•„์„œ ์ฆ๊ฒ๊ฒŒ ์Šคํฌ๋Ÿผ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ๊ฒน์น˜๋ฉด์„œ ๋ง‰๋ฐ”์ง€์— ๊ฑฐ์˜ ํ•ด์ปคํ†ค ๋งˆ์ธ๋“œ(?)๋กœ ํ•˜๋‹ค๊ฐ€ ์–ด๋–ป๊ฒŒ ์Šคํฌ๋Ÿผ ๋•Œ 1์ฐจ ๋ฐฐํฌ๊นŒ์ง€ ๋งˆ์น˜๊ณ  ๊ฒฐ๊ณผ๋ฌผ์„ ๋ณด์—ฌ๋“œ๋ ธ๋Š”๋ฐ, ํ•œ ๋ถ„์ด ๋ฒ„๊ทธ๊นŒ์ง€ ๋ฐœ๊ฒฌํ•ด ์ฃผ๊ธฐ๋„ ํ–ˆ๋‹ค. ์žฌ๋ฐŒ๋Š” ๊ฒฝํ—˜์ด์—ˆ๋‹ค ใ…‹ใ…‹..
๋„ˆ๋ฌด ํ™œ๊ธฐ์ฐจ๊ณ  ์ ๊ทน์ ์œผ๋กœ ํ•จ๊ป˜ ํ•ด ์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ ค์š”!

๋งˆ์น˜๋ฉฐ

์ƒ๊ฐ๋ณด๋‹ค ์ผ์ •์ด ๋นก๋นกํ–ˆ๊ณ , ๊ฑฑ์ •๋ณด๋‹ค๋Š” ํ•  ๋งŒ ํ–ˆ๋˜ ์ฑŒ๋ฆฐ์ง€์˜€๋‹ค. ์•„์‰ฌ์šด ์ ์ด ์žˆ๋‹ค๋ฉด ์ฑ—์Œค๋“ค์ด ๊ธฐ๋ถ„์— ๋”ฐ๋ผ ๋Œ€ํ™”์— ์†Œ๊ทน์ ์œผ๋กœ ์ฐธ์—ฌํ•œ๋‹ค๋Š” ์ ๊ณผ API ํ…Œ์ŠคํŠธ๋ผ๋Š” ๊ฒƒ์„ ์–ด๋–ค ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ค์ง€ ์•Š์•„์„œ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ.. ์–ด๋–ป๊ฒŒ ํ–ˆ์–ด์•ผ ํ• ๊นŒ? ๋‚˜์ค‘์— ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์ž˜ ํ•˜์‹  ๋ถ„๋“ค์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ณต๊ฐœ๋œ๋‹ค๋ฉด ํ•œ ๋ฒˆ ๋ณด๊ณ  ์‹ถ๋‹ค.

๋„˜๋ธ”ํ†ก ๋ ˆํฌ์ง€ํ† ๋ฆฌ
๋„˜๋ธ”ํ†ก ๋ฐฐํฌ ๋งํฌ

+Hugo.
\ No newline at end of file diff --git a/posts/2023/05/exploring-yarn-berry/index.html b/posts/2023/05/exploring-yarn-berry/index.html index 7f47c00..68ef58e 100644 --- a/posts/2023/05/exploring-yarn-berry/index.html +++ b/posts/2023/05/exploring-yarn-berry/index.html @@ -1,7 +1,7 @@ ์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐ | PrayinForRain.dev -

์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐ

Table of Contents

๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„

cds issue

์ตœ๊ทผ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ Yarn berry๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  node_modules ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” node_modules

ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•„์„œ ํ—ค๋งค๊ธฐ

Node.js์—๋Š” ์‚ฌ์‹ค ํŒจํ‚ค์ง€์˜ ๊ฐœ๋…์ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ๋•Œ์— Node.js๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ ๋‹จ์œ„๋กœ ๋ชจ๋“ˆ์„ ์ฐพ์•„์„œ resolveํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

๊ธฐ์กด npm์˜ ๊ฒฝ์šฐ์—๋Š” ํŒจํ‚ค์ง€์˜ node_modules, npm์ด ์„ค์น˜๋œ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ „์—ญ ํด๋” ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์„ ์ฐจ๋ก€๋กœ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•„ ๋‚˜๊ฐ”๋‹ค.

$ node
 > require.resolve.paths('react-dom')
 [
   'E:\\workspace\\repl\\node_modules',
@@ -17,7 +17,7 @@
 ]
 > require.resolve('react-dom')
 'E:\\workspace\\node_modules\\react-dom\\index.js'
-

์ด๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค. node_modules ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ฐ€๋ฒผ์šด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋งŒ ๊ฐœ ๋‹จ์œ„์˜ ํŒŒ์ผ๋“ค์ด ์žˆ์–ด ํƒ์ƒ‰ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ณ , node_modules ๋””๋ ‰ํ† ๋ฆฌ ๋ง๊ณ ๋„ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ƒ์œ„ ๊ฒฝ๋กœ ๋“ฑ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๋„“๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ์˜์กด์ ์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠนํžˆ ์ด ๊ณผ์ •์€ ๋Ÿฐํƒ€์ž„์—์„œ๋„ ์ˆ˜์‹œ๋กœ ์ง„ํ–‰๋˜์–ด ๋งค์šฐ ํฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

์œ ๋ น ์˜์กด์„ฑ

ํšจ์œจ์ด์•ผ ์–ด๋–ป๊ฒŒ ๋๋“  ์ด๋Ÿฐ ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•œ๋‹ค๊ณ  ์น˜์ž. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋˜ ์žˆ๋‹ค.

dependency hoisting

์ถœ์ฒ˜: node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry - ํ† ์Šค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

์œ„ ์‚ฌ์ง„์—์„œ package-1์€ A, C, D ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์ค‘ A์™€ C๋Š” B(1.0)๋ฅผ ์ง, ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ B(1.0) ํŒจํ‚ค์ง€๋„ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ค‘๋ณต ํŒŒ์ผ์„ ์ค„์—ฌ ์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด B(1.0)์„ ํ˜ธ์ด์ŠคํŒ…ํ•˜์—ฌ node_modules์—๋Š” package-1์ด ์š”๊ตฌํ•˜์ง€ ์•Š์€ B(1.0)์ด ์ถ”๊ฐ€๋กœ ์„ค์น˜๋œ๋‹ค.

์ด ํ›„ Node๋Š” package.json์„ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  node_modules ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ์„ resolveํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ฅ๋„์ƒˆ๋„ ๋ชจ๋ฅด๊ฒŒ package-1์—์„œ๋Š” ์š”๊ตฌํ•˜์ง€ ์•Š์•˜๋˜ B(1.0)์˜ ๋ชจ๋“ˆ์„ ์Šฌ์ฉ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋ถ„๋ช… ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

Yarn berry

Yarn berry์—์„œ ๋‚˜์˜จ PnP ๋ฐฉ์‹์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ๋‹ค. Yarn PnP๋Š” package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ชจ๋“ˆ์„ resolveํ•˜๋Š” ๊ณผ์ •์„ ์ด ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์œ ๋ น ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋‚˜์˜ .zip ์••์ถ• ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ๊ฐœ์ˆ˜์™€ ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ ํš๊ธฐ์ ์ธ ์ ˆ์•ฝ์„ ์ด๋ฃจ์–ด๋‚ธ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

yarn pnp๊ฐ€ ์ƒ์„ฑํ•˜๋Š” .pnp.cjs ํŒŒ์ผ์—๋Š” readFileSync๊ฐ™์€ fs ๋ชจ๋“ˆ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ , ์ด ๋ฉ”์„œ๋“œ๋“ค์€ .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์˜ zip ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค.

class NodeFS extends BasePortableFakeFS {
+

์ด๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค. node_modules ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๊ฐ€๋ฒผ์šด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๋งŒ ๊ฐœ ๋‹จ์œ„์˜ ํŒŒ์ผ๋“ค์ด ์žˆ์–ด ํƒ์ƒ‰ ์†๋„๊ฐ€ ๋Š๋ฆฌ๊ณ , node_modules ๋””๋ ‰ํ† ๋ฆฌ ๋ง๊ณ ๋„ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ ์ƒ์œ„ ๊ฒฝ๋กœ ๋“ฑ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๋„“๊ธฐ ๋•Œ๋ฌธ์— ํ™˜๊ฒฝ ์˜์กด์ ์ธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠนํžˆ ์ด ๊ณผ์ •์€ ๋Ÿฐํƒ€์ž„์—์„œ๋„ ์ˆ˜์‹œ๋กœ ์ง„ํ–‰๋˜์–ด ๋งค์šฐ ํฐ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค.

์œ ๋ น ์˜์กด์„ฑ

ํšจ์œจ์ด์•ผ ์–ด๋–ป๊ฒŒ ๋๋“  ์ด๋Ÿฐ ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•œ๋‹ค๊ณ  ์น˜์ž. ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋˜ ์žˆ๋‹ค.

dependency hoisting

์ถœ์ฒ˜: node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry - ํ† ์Šค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ

์œ„ ์‚ฌ์ง„์—์„œ package-1์€ A, C, D ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์ค‘ A์™€ C๋Š” B(1.0)๋ฅผ ์ง, ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ B(1.0) ํŒจํ‚ค์ง€๋„ ํ•„์š”ํ•œ ์ƒํ™ฉ์ด๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์ค‘๋ณต ํŒŒ์ผ์„ ์ค„์—ฌ ์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด B(1.0)์„ ํ˜ธ์ด์ŠคํŒ…ํ•˜์—ฌ node_modules์—๋Š” package-1์ด ์š”๊ตฌํ•˜์ง€ ์•Š์€ B(1.0)์ด ์ถ”๊ฐ€๋กœ ์„ค์น˜๋œ๋‹ค.

์ด ํ›„ Node๋Š” package.json์„ ์ฒดํฌํ•˜์ง€ ์•Š๊ณ  node_modules ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ๋ชจ๋“ˆ์„ resolveํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ฅ๋„์ƒˆ๋„ ๋ชจ๋ฅด๊ฒŒ package-1์—์„œ๋Š” ์š”๊ตฌํ•˜์ง€ ์•Š์•˜๋˜ B(1.0)์˜ ๋ชจ๋“ˆ์„ ์Šฌ์ฉ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋ถ„๋ช… ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

Yarn berry

Yarn berry์—์„œ ๋‚˜์˜จ PnP ๋ฐฉ์‹์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•œ๋‹ค. Yarn PnP๋Š” package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ช…์‹œ์ ์ธ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ชจ๋“ˆ์„ resolveํ•˜๋Š” ๊ณผ์ •์„ ์ด ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์œ ๋ น ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ๊ฐ๊ฐ์˜ ํŒจํ‚ค์ง€๋ฅผ ํ•˜๋‚˜์˜ .zip ์••์ถ• ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ ๊ฐœ์ˆ˜์™€ ์šฉ๋Ÿ‰ ์ธก๋ฉด์—์„œ ํš๊ธฐ์ ์ธ ์ ˆ์•ฝ์„ ์ด๋ฃจ์–ด๋‚ธ๋‹ค.

์ž‘๋™ ๋ฐฉ์‹

yarn pnp๊ฐ€ ์ƒ์„ฑํ•˜๋Š” .pnp.cjs ํŒŒ์ผ์—๋Š” readFileSync๊ฐ™์€ fs ๋ชจ๋“ˆ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ , ์ด ๋ฉ”์„œ๋“œ๋“ค์€ .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์˜ zip ํŒŒ์ผ๋“ค์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐํ•œ๋‹ค.

class NodeFS extends BasePortableFakeFS {
   // ...
   readFileSync(p, encoding) {
     const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p;
@@ -53,7 +53,7 @@
 

๊ทธ ์ดํ›„ .pnp.cjs๋ฅผ ํ†ตํ•ด ์žฌ์ •์˜๋œ fs.readFileSync๋ฅผ ํ†ตํ•ด ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ index.js ํŒŒ์ผ์„ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ react-dom์„ resolveํ•˜๋ ค๋ฉด ์ด์™€ ๋น„์Šทํ•œ ๊ณผ์ •์„ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

$ yarn node
 > require.resolve('react-dom')
 'E:\\workspace\\.yarn\\__virtual__\\react-dom-virtual-67ee33d872\\0\\cache\\react-dom-npm-18.2.0-dd675bca1c-7d323310be.zip\\node_modules\\react-dom\\index.js'
-

์œ ๋ น ์˜์กด์„ฑ ๊ธˆ์ง€

๋ฐ˜๋ฉด์—, ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ์—๋Š” ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด์„œ react-dom์ด ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค. loose-envify์™€ scheduler ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋„ react-dom์„ ์„ค์น˜ํ•  ๊ฒฝ์šฐ .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ๋‘ ํŒจํ‚ค์ง€๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. npm์˜ node_modules๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋“ค์€ require.resolve()๋ฅผ ํ†ตํ•ด์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๋Š” .pnp.cjs์ƒ์—์„œ ํŒจํ‚ค์ง€์˜ ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฐธ๊ณ ๋กœ .pnp.cjs์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ๊ฒผ๋‹ค.

// .pnp.cjs
+

์œ ๋ น ์˜์กด์„ฑ ๊ธˆ์ง€

๋ฐ˜๋ฉด์—, ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ์—๋Š” ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด์„œ react-dom์ด ์˜์กดํ•˜๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์žˆ๋‹ค. loose-envify์™€ scheduler ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋„ react-dom์„ ์„ค์น˜ํ•  ๊ฒฝ์šฐ .yarn/cache ๋””๋ ‰ํ† ๋ฆฌ์— ๋‘ ํŒจํ‚ค์ง€๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. npm์˜ node_modules๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋“ค์€ require.resolve()๋ฅผ ํ†ตํ•ด์„œ ์ฐพ์„ ์ˆ˜ ์—†๋Š”๋ฐ, ์ด๋Š” .pnp.cjs์ƒ์—์„œ ํŒจํ‚ค์ง€์˜ ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฐธ๊ณ ๋กœ .pnp.cjs์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ๊ฒผ๋‹ค.

// .pnp.cjs
 function $$SETUP_STATE(hydrateRuntimeState, basePath) {
   return hydrateRuntimeState(JSON.parse('{\
     // ...
@@ -90,14 +90,14 @@
         ["virtual:34069774f764f6c076c76cefb79f9c00ee35c2ecc2faeec6f1f046eac9e499da19f7441a38c80f3dc82287abf91ba64b7783b2e2d997751e40d1ad563ff4f78d#npm:18.2.0", {
           "packageLocation": "./.yarn/__virtual__/react-dom-virtual-67ee33d872/0/cache/react-dom-npm-18.2.0-dd675bca1c-7d323310be.zip/node_modules/react-dom/",
     // ...
-

์•ž์—์„œ ์ฒจ๋ถ€ํ–ˆ๋˜ .pnp.cjs ํŒŒ์ผ์˜ ์ผ๋ถ€๋‹ค. ์ด ํŒŒ์ผ์€ package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋ฌผ๋ก  react-dom ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” loose-envify ์—ญ์‹œ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ๋ช…์‹œ๋œ ์˜์กด์„ฑ(react-dom)์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค๊ณผ ๋‹ฌ๋ฆฌ virtual:โ€ฆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€์—ฌ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋Š” resolve๋  ์ˆ˜ ์—†๋‹ค.

์ •ํ™•ํ•œ ๋ช…์นญ์€ ๊ฐ€์ƒ ๋กœ์ผ€์ดํ„ฐ๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ Yarn์˜ PnP Specification ํŽ˜์ด์ง€์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ฐœ์ธ์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์œ ์ถ”ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์ž๋ฉด,

  1. package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ .pnp.cjs์—์„œ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  2. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด Yarn PnP๋Š” ์ด๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ node_modules ํด๋”๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  3. react-dom์„ ๋ถ€์—ฌ๋œ ๊ฐ€์ƒ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. ํ•ด๋‹น ๊ฐ€์ƒ ๊ฒฝ๋กœ์— react-dom์ด ์ฐธ์กฐํ•˜๋Š” ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ๋˜ ์—ฐ๊ฒฐํ•œ๋‹ค(node_modules์ฒ˜๋Ÿผ)
  5. loose-envify์˜ ๊ฒฝ์šฐ react-dom์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์…ˆ์ด๋‹ˆ ๊ฐ€์ƒ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋กœ ๋ถ€์—ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค,

์ด๋ ‡๊ฒŒ loose-envify๋Š” ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ hoist๋˜์ง€ ์•Š์•„ ์œ ๋ น ์˜์กด์„ฑ ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์ฐธ์กฐ๋  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์˜ ๊ฐ€์ƒ ๊ฒฝ๋กœ์— ๊ฐ™์ด ์ฐธ์กฐ์‹œํ‚ค๋ฉด ๋˜๋ฏ€๋กœ ๊ฐ™์€ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ํ•„์š”๋„ ์—†์–ด์ง„๋‹ค. ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ ํ‹€๋ฆฌ์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ์ œ๋ฐœ ํฌ๊ฒŒ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์—†๊ธธ ๋นˆ๋‹ค.

Peer dependency ๋ฌธ์ œ

Peer dependency๋ž€, ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ์ƒํ˜ธ์ž‘์šฉํ•จ์„ ๋ช…์‹œํ•˜๋Š” ์ข…์†์„ฑ ํ•„๋“œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด React ๊ธฐ๋ฐ˜์˜ ๋””์ž์ธ ์‹œ์Šคํ…œ์€ React์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ง€๋งŒ, ํŒจํ‚ค์ง€ ์ž์ฒด์—์„œ React๋ฅผ ํฌํ•จํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ด ๊ฒฝ์šฐ ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ React๋ฅผ Peer dependency๋กœ ์ง€์ •ํ•˜์—ฌ React์˜ ์–ด๋–ค ๋ฒ„์ „์ด ํ•„์š”ํ•จ์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

npm์€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ peer dependency๋กœ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์—ฌํƒœ ๊ฝค ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ์•„๋ฌดํŠผ npm 7.0 ์ดํ›„๋กœ๋Š” ์„ค์น˜ํ•˜๋Š” ์ชฝ์œผ๋กœ ๊ฐ€๋‹ฅ์„ ์žก์€ ๋ชจ์–‘์ด๋‹ค. [์ฐธ๊ณ  ๋งํฌ]

๋ฐ˜๋ฉด์— Yarn PnP์—์„œ๋Š” peer deps๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, react๋ฅผ peer deps๋กœ ๊ฐ€์ง„ @chwh/cds ํŒจํ‚ค์ง€๋ฅผ npm๊ณผ Yarn PnP์—์„œ ๊ฐ๊ฐ ์„ค์น˜ํ•˜๋ฉด npm์—๋Š” react๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š” ๋ฐ˜๋ฉด, Yarn PnP์—์„œ๋Š” cds์™€ cds์˜ dependency์˜ ์ผ๋ฐ˜ ์˜์กด์„ฑ ํŒจํ‚ค์ง€(lodash)๋งŒ์ด ์„ค์น˜๋œ๋‹ค.

๋‹จ, yarn install์„ ํ–ˆ์„ ๋•Œ ํŒจํ‚ค์ง€๊ฐ€ ์š”๊ตฌํ•˜๋Š” peer deps๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋„๋ก ์œ ๋„ํ•œ๋‹ค. ๋˜ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ์˜ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

> yarn
+

์•ž์—์„œ ์ฒจ๋ถ€ํ–ˆ๋˜ .pnp.cjs ํŒŒ์ผ์˜ ์ผ๋ถ€๋‹ค. ์ด ํŒŒ์ผ์€ package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ–๊ณ  ์žˆ๊ณ , ๋ฌผ๋ก  react-dom ํŒจํ‚ค์ง€๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” loose-envify ์—ญ์‹œ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ์— ๋ช…์‹œ๋œ ์˜์กด์„ฑ(react-dom)์€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค๊ณผ ๋‹ฌ๋ฆฌ virtual:โ€ฆ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€์—ฌ๋˜์–ด ์žˆ๋‹ค. ์ด ๊ฐ€์ƒ ๊ฒฝ๋กœ๊ฐ€ ๋ถ€์—ฌ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋Š” resolve๋  ์ˆ˜ ์—†๋‹ค.

์ •ํ™•ํ•œ ๋ช…์นญ์€ ๊ฐ€์ƒ ๋กœ์ผ€์ดํ„ฐ๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ Yarn์˜ PnP Specification ํŽ˜์ด์ง€์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด ๊ณผ์ •์„ ํ†ตํ•ด ๊ฐœ์ธ์ ์ธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์œ ์ถ”ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์ž๋ฉด,

  1. package.json์„ ๊ธฐ๋ฐ˜์œผ๋กœ .pnp.cjs์—์„œ ์˜์กด์„ฑ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  2. ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด Yarn PnP๋Š” ์ด๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ node_modules ํด๋”๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  3. react-dom์„ ๋ถ€์—ฌ๋œ ๊ฐ€์ƒ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. ํ•ด๋‹น ๊ฐ€์ƒ ๊ฒฝ๋กœ์— react-dom์ด ์ฐธ์กฐํ•˜๋Š” ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ๋˜ ์—ฐ๊ฒฐํ•œ๋‹ค(node_modules์ฒ˜๋Ÿผ)
  5. loose-envify์˜ ๊ฒฝ์šฐ react-dom์˜ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์…ˆ์ด๋‹ˆ ๊ฐ€์ƒ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋กœ ๋ถ€์—ฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค,

์ด๋ ‡๊ฒŒ loose-envify๋Š” ์ตœ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ๋กœ hoist๋˜์ง€ ์•Š์•„ ์œ ๋ น ์˜์กด์„ฑ ๋ฌธ์ œ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์ฐธ์กฐ๋  ๊ฒฝ์šฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์˜ ๊ฐ€์ƒ ๊ฒฝ๋กœ์— ๊ฐ™์ด ์ฐธ์กฐ์‹œํ‚ค๋ฉด ๋˜๋ฏ€๋กœ ๊ฐ™์€ ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์งˆ ํ•„์š”๋„ ์—†์–ด์ง„๋‹ค. ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ๋ฉด์„œ ํ‹€๋ฆฌ์ง€ ์•Š๋„๋ก ์ •๋ฆฌํ•˜๋ ค ๋…ธ๋ ฅํ–ˆ๋Š”๋ฐ ์ œ๋ฐœ ํฌ๊ฒŒ ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด ์—†๊ธธ ๋นˆ๋‹ค.

Peer dependency ๋ฌธ์ œ

Peer dependency๋ž€, ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์™€ ์ƒํ˜ธ์ž‘์šฉํ•จ์„ ๋ช…์‹œํ•˜๋Š” ์ข…์†์„ฑ ํ•„๋“œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด React ๊ธฐ๋ฐ˜์˜ ๋””์ž์ธ ์‹œ์Šคํ…œ์€ React์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ง€๋งŒ, ํŒจํ‚ค์ง€ ์ž์ฒด์—์„œ React๋ฅผ ํฌํ•จํ•  ํ•„์š”๋Š” ์—†๋‹ค. ์ด ๊ฒฝ์šฐ ๋””์ž์ธ ์‹œ์Šคํ…œ์—์„œ React๋ฅผ Peer dependency๋กœ ์ง€์ •ํ•˜์—ฌ React์˜ ์–ด๋–ค ๋ฒ„์ „์ด ํ•„์š”ํ•จ์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

npm์€ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ peer dependency๋กœ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋ฅผ ๊ฐ™์ด ์„ค์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. ์—ฌํƒœ ๊ฝค ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ์•„๋ฌดํŠผ npm 7.0 ์ดํ›„๋กœ๋Š” ์„ค์น˜ํ•˜๋Š” ์ชฝ์œผ๋กœ ๊ฐ€๋‹ฅ์„ ์žก์€ ๋ชจ์–‘์ด๋‹ค. [์ฐธ๊ณ  ๋งํฌ]

๋ฐ˜๋ฉด์— Yarn PnP์—์„œ๋Š” peer deps๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, react๋ฅผ peer deps๋กœ ๊ฐ€์ง„ @chwh/cds ํŒจํ‚ค์ง€๋ฅผ npm๊ณผ Yarn PnP์—์„œ ๊ฐ๊ฐ ์„ค์น˜ํ•˜๋ฉด npm์—๋Š” react๊ฐ€ ํ•จ๊ป˜ ์„ค์น˜๋˜๋Š” ๋ฐ˜๋ฉด, Yarn PnP์—์„œ๋Š” cds์™€ cds์˜ dependency์˜ ์ผ๋ฐ˜ ์˜์กด์„ฑ ํŒจํ‚ค์ง€(lodash)๋งŒ์ด ์„ค์น˜๋œ๋‹ค.

๋‹จ, yarn install์„ ํ–ˆ์„ ๋•Œ ํŒจํ‚ค์ง€๊ฐ€ ์š”๊ตฌํ•˜๋Š” peer deps๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์˜์กด์„ฑ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋„๋ก ์œ ๋„ํ•œ๋‹ค. ๋˜ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ์˜ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๊ฐ€ ๋ณต์žกํ•ด์ง€๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

> yarn
 โžค YN0002: โ”‚ berry@workspace:. doesn't provide @emotion/react (p0d53b), requested by @chwh/cds
 โžค YN0002: โ”‚ berry@workspace:. doesn't provide @emotion/styled (pe7b02), requested by @chwh/cds
-

๋ฌผ๋ก  ์˜ˆ์‹œ๋กœ ๋“  cds๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ peer dependency์—๋งŒ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋ฅผ ์˜์กดํ•˜๋ฉด์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ dependency๋กœ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋“ค ์ค‘์— peer dependency๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ dependency๋กœ ๊ฐ–๋Š” ์‹์œผ๋กœ ์˜์กด์„ฑ ํŠธ๋ฆฌ๊ฐ€ ์ฑ„์›Œ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ๋งŒ๋‚˜๋Š” ์ƒํ™ฉ์€ ์•„๋‹ˆ๋‹ค.

๋ถ€๋ก

๋ถ€๋ก1 - yarn dlx์™€ pnpify

Yarn PnP ํ™˜๊ฒฝ์—์„œ npx์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๊ณ , ์ด์— ๋Œ€์‘ํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ yarn dlx์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด yarn dlx storybook init์„ ์‹คํ–‰ํ•˜๋ฉด npx storybook init์„ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ, Yarn์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค. npx ์ž์ฒด๊ฐ€ yarn๊ณผ npm ์ค‘ ์•Œ๋งž์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ์ง€๋งŒ, Yarn PnP๋Š” ๊ทธ ์™ธ์—๋„ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ๋„ ํ•œ๋‹ค. Storybook์— Yarn PnP๋ฅผ ์ ์šฉํ•  ๋•Œ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ธ๋ฐ.. ์ด ๋‚ด์šฉ๋„ ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ธ๊ธ‰ํ•œ ์ ์ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด Yarn์—๋Š” pnpify๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ณดํ†ต package.json์— ์ •์˜๋˜๋Š” ๋ช…๋ น์–ด๋“ค์€(tsc๋‚˜ vite build๊ฐ™์€..) ์—ฌ์ „์ด ๋กœ์ปฌ ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•˜๋ ค ์‹œ๋„ํ•˜๋Š”๋ฐ, ์••์ถ•๋œ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” PnP ํ™˜๊ฒฝ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„์— ๋‚˜์˜จ ๋ฐฉ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•˜๋Š” ๋กœ์ง์„ ๊ต์ฒดํ•ด ์ฃผ๋Š” ๊ฒƒ์ด pnpify์ด๋‹ค.

// original
+

๋ฌผ๋ก  ์˜ˆ์‹œ๋กœ ๋“  cds๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ peer dependency์—๋งŒ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋ฅผ ์˜์กดํ•˜๋ฉด์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ dependency๋กœ ๋ช…์‹œ๋œ ํŒจํ‚ค์ง€๋“ค ์ค‘์— peer dependency๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ dependency๋กœ ๊ฐ–๋Š” ์‹์œผ๋กœ ์˜์กด์„ฑ ํŠธ๋ฆฌ๊ฐ€ ์ฑ„์›Œ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ๋งŒ๋‚˜๋Š” ์ƒํ™ฉ์€ ์•„๋‹ˆ๋‹ค.

๋ถ€๋ก

๋ถ€๋ก1 - yarn dlx์™€ pnpify

Yarn PnP ํ™˜๊ฒฝ์—์„œ npx์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๊ณ , ์ด์— ๋Œ€์‘ํ•˜๋Š” ๋ช…๋ น์–ด๊ฐ€ yarn dlx์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด yarn dlx storybook init์„ ์‹คํ–‰ํ•˜๋ฉด npx storybook init์„ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ, Yarn์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค. npx ์ž์ฒด๊ฐ€ yarn๊ณผ npm ์ค‘ ์•Œ๋งž์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ์ง€๋งŒ, Yarn PnP๋Š” ๊ทธ ์™ธ์—๋„ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ๋„ ํ•œ๋‹ค. Storybook์— Yarn PnP๋ฅผ ์ ์šฉํ•  ๋•Œ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ธ๋ฐ.. ์ด ๋‚ด์šฉ๋„ ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ธ๊ธ‰ํ•œ ์ ์ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด Yarn์—๋Š” pnpify๋ผ๋Š” ํŒจํ‚ค์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ณดํ†ต package.json์— ์ •์˜๋˜๋Š” ๋ช…๋ น์–ด๋“ค์€(tsc๋‚˜ vite build๊ฐ™์€..) ์—ฌ์ „์ด ๋กœ์ปฌ ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•˜๋ ค ์‹œ๋„ํ•˜๋Š”๋ฐ, ์••์ถ•๋œ ํŒจํ‚ค์ง€๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” PnP ํ™˜๊ฒฝ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์œ„์— ๋‚˜์˜จ ๋ฐฉ์‹์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ resolveํ•˜๋Š” ๋กœ์ง์„ ๊ต์ฒดํ•ด ์ฃผ๋Š” ๊ฒƒ์ด pnpify์ด๋‹ค.

// original
 "build": "tsc -p tsconfig.publish.json && vite build --config vite.publish.config.ts"
 // with pnp
 "build": "yarn pnpify tsc -p tsconfig.publish.json && yarn pnpify vite build --config vite.publish.config.ts"
-

dlx์™€ pnpify๋Š” ๋‘˜ ๋‹ค PnP ํ™˜๊ฒฝ์— ๋งž๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค. ๋‹ค๋งŒ dlx๋Š” ํ”„๋กœ์ ํŠธ์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ณ , pnpify๋Š” PnP ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ƒํ™ฉ์— ๋งž๋„๋ก ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”๋ฅผ dlx๋กœ ํ•œ๋‹ค๋˜๊ฐ€..

๋ถ€๋ก2 - ์‚ฌ์‹ค ๋ชจ๋“  ๊ฒƒ์ด PnP์˜ ์ž˜๋ชป์€ ์•„๋‹™๋‹ˆ๋‹ค

Yarn berry์—์„œ์˜ storybook ์„ธํŒ…์—์„œ, ํŠน์ • ํŒจํ‚ค์ง€๊ฐ€ resolve๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์•ž์—์„œ ๋งํฌํ•œ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ ์ด ๊ฒƒ์ด Yarn PnP์˜ resolve ๊ธฐ์ค€์˜ ์ž˜๋ชป์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋Š”๋ฐ, ์‚ฌ์‹ค ์ด๊ฒŒ ์œ ์ผํ•œ ์ด์œ ๋Š” ์•„๋‹ˆ์—ˆ๋‹ค.

cds๋Š” @storybook/builder-vite ํŒจํ‚ค์ง€์˜ 0.4.2 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ๋งˆ์น˜๊ณ  ์Šคํ† ๋ฆฌ๋ถ์„ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰์—ˆ๋‹ค.

์˜คํ›„ 10:13:52 [vite] Internal server error: Failed to resolve import "@storybook/preview-web" from "..\..\virtual:\@storybook\builder-vite\vite-app.js". Does the file exist?
+

dlx์™€ pnpify๋Š” ๋‘˜ ๋‹ค PnP ํ™˜๊ฒฝ์— ๋งž๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค. ๋‹ค๋งŒ dlx๋Š” ํ”„๋กœ์ ํŠธ์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‹คํ–‰ํ•˜๊ณ , pnpify๋Š” PnP ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๊ธฐ์กด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ƒํ™ฉ์— ๋งž๋„๋ก ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”๋ฅผ dlx๋กœ ํ•œ๋‹ค๋˜๊ฐ€..

๋ถ€๋ก2 - ์‚ฌ์‹ค ๋ชจ๋“  ๊ฒƒ์ด PnP์˜ ์ž˜๋ชป์€ ์•„๋‹™๋‹ˆ๋‹ค

Yarn berry์—์„œ์˜ storybook ์„ธํŒ…์—์„œ, ํŠน์ • ํŒจํ‚ค์ง€๊ฐ€ resolve๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์•ž์—์„œ ๋งํฌํ•œ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ ์ด ๊ฒƒ์ด Yarn PnP์˜ resolve ๊ธฐ์ค€์˜ ์ž˜๋ชป์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ผ๋Š”๋ฐ, ์‚ฌ์‹ค ์ด๊ฒŒ ์œ ์ผํ•œ ์ด์œ ๋Š” ์•„๋‹ˆ์—ˆ๋‹ค.

cds๋Š” @storybook/builder-vite ํŒจํ‚ค์ง€์˜ 0.4.2 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ๋งˆ์น˜๊ณ  ์Šคํ† ๋ฆฌ๋ถ์„ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ฑ‰์—ˆ๋‹ค.

์˜คํ›„ 10:13:52 [vite] Internal server error: Failed to resolve import "@storybook/preview-web" from "..\..\virtual:\@storybook\builder-vite\vite-app.js". Does the file exist?
   Plugin: vite:import-analysis
   File: /virtual:/@storybook/builder-vite/vite-app.js:1:45
   1  |  import { composeConfigs, PreviewWeb } from '@storybook/preview-web';
@@ -110,10 +110,10 @@
   "@storybook/preview-web",
   // ...
 ];
-

optimizeDeps.js๋ผ๋Š” ํŒŒ์ผ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ๋“ค์„ ๋”ฐ๋กœ ์ ์–ด ๋‘๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์•„๋งˆ ์ด ํŒŒ์ผ์€ vite์˜ ๋””ํŽœ๋˜์‹œ ์ตœ์ ํ™” ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ๋กœ ๋ณด์ธ๋‹ค.

์Šคํ† ๋ฆฌ๋ถ์€ ๋ฆฌ์•กํŠธ๋ฅผ CRA๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ์„ค์ •์„ ํ•˜๋“ฏ์ด ํ†ต์ƒ npx storybook init์„ ํ†ตํ•ด ์ดˆ๊ธฐ ์„ค์ •์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— package.json์— ์˜์กด์„ฑ์ด ์ œ๋Œ€๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋“ฏ ํ•˜๋‹ค. ์–ด์ฐŒ ๋ณด๋ฉด ์œ ๋ น ์˜์กด์„ฑ ํ˜„์ƒ์„ ์ด์šฉํ•˜๋Š” ์…ˆ์ด๋‹ค.

์ด๊ฒŒ @storybook/builder-vite@0.4.2 ๋ฒ„์ „์˜ ์ฝ”๋“œ์ธ๋ฐ, Storybook 7์˜ ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„๋กœ builder ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ์Šคํ† ๋ฆฌ๋ถ ๋ฉ”์ธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋ชจ๋…ธ๋ ˆํฌ ํ˜•ํƒœ๋กœ ํ†ตํ•ฉ๋˜๋˜ ์‹œ๊ธฐ ๊ทผ์ฒ˜๋กœ ์˜์กด์„ฑ ์—ญ์‹œ ์ œ๋Œ€๋กœ ๋ช…์‹œ๋˜์—ˆ๋‹ค. [๊ด€๋ จ ์ปค๋ฐ‹] ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ์ด์Šˆ์ด๋ฉฐ, ๋นŒ๋”์˜ ๋ฒ„์ „ ์—ญ์‹œ ๋‹ค๋ฅธ addon๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ† ๋ฆฌ๋ถ์˜ ๋ฒ„์ „๊ณผ ํ†ต์ผ๋˜์—ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ..

cds issue

์‚ฌ์‹ค ์กฐ๊ธˆ ๋œฌ๊ธˆ์—†์ด ์ค€๋น„ํ•œ ๋ฐœํ‘œ ์ž๋ฃŒ์ธ๋ฐ, ๊ฐ€๋ณ๊ฒŒ๋งŒ ํ•ด์•ผ์ง€.. ํ•˜๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค๊ฐ€ ์–ด๋ ดํ’‹์ด ์˜ˆ์ƒํ–ˆ๋˜ ๋‚ด์šฉ์ด ํ‹€๋ฆฌ๊ณ  ํ‹€๋ฆฌ๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฒ€์ฆ์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ธ€์ด ํƒœ์‚ฐ์œผ๋กœ ๊ฐ€๋ฒ„๋ ธ๋‹ค. ๋งˆ์ง€๋ง‰์—๋Š” ๋‚ด๊ฐ€ ์™œ ์ด๊ฑธ ๋ณด๊ณ  ์žˆ์—ˆ๋Š”์ง€๋ฅผ ๊นŒ๋จน์–ด์„œ ์†์„ ๋†“๊ณ  ๋‹ค์‹œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์Œ.. ๋งค๋„๋Ÿฌ์šด ๊ธ€์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด์šฉ ์—†์ด ์ฃผ์ œ๋งŒ ์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•œ ๊ธ€์ด๋ผ ๊ทธ๋Ÿฐ๊ฐ€..

์ด ๊ธ€์„ ๋์œผ๋กœ ๋” ์ด์ƒ ์–€๋ฒ ๋ฆฌ๋ฅผ ๋ถ™๋“ค๊ณ  ์”จ๋ฆ„ํ•˜๋Š” ์ผ์€ ์—†์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์•„๋งˆ ๊ทธ๋ ‡์ง„ ๋ชปํ•  ๊ฒƒ ๊ฐ™๊ณ .. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ pnpm์„ ์จ ๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋‹ค. CDS๋ฅผ ํ•˜๋ฉด์„œ pnpm์„ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ฝค ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ณ , Yarn์—์„œ๋„ pnpm ๋ง์ปค๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ pnpm๋„ ๊ทธ๋งŒ์˜ ์žฅ์ ์ด ์žˆ๊ฒ ๊ตฌ๋‚˜ ํ•˜๋Š” ๋ง‰์—ฐํ•œ ์ƒ๊ฐ ์ค‘.

Refs.

GitHub - yarnpkg/berry: ๐Ÿ“ฆ๐Ÿˆ Active development trunk for Yarn โš’
Plug’n’Play
(๋ฒˆ์—ญ) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Import Map์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ
package.json์— ์Œ“์—ฌ์žˆ๋Š” ๊ฐœ๋ฐœ ๋ถ€์ฑ„
node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry
npm 7 is now generally available!
Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐ | PrayinForRain.dev
Vite
Yarn PnP ์˜์กด์„ฑ ์—๋Ÿฌ ํ•ด๊ฒฐ๊ธฐ
GitHub - nodejs/node: Node.js JavaScript runtime
Modules: ECMAScript modules | Node.js v20.2.0 Documentation

 ยฉ 2024 PrayinforRain. +

optimizeDeps.js๋ผ๋Š” ํŒŒ์ผ์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ๋“ค์„ ๋”ฐ๋กœ ์ ์–ด ๋‘๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค. ์•„๋งˆ ์ด ํŒŒ์ผ์€ vite์˜ ๋””ํŽœ๋˜์‹œ ์ตœ์ ํ™” ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ํŒŒ์ผ๋กœ ๋ณด์ธ๋‹ค.

์Šคํ† ๋ฆฌ๋ถ์€ ๋ฆฌ์•กํŠธ๋ฅผ CRA๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ ์„ค์ •์„ ํ•˜๋“ฏ์ด ํ†ต์ƒ npx storybook init์„ ํ†ตํ•ด ์ดˆ๊ธฐ ์„ค์ •์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— package.json์— ์˜์กด์„ฑ์ด ์ œ๋Œ€๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋“ฏ ํ•˜๋‹ค. ์–ด์ฐŒ ๋ณด๋ฉด ์œ ๋ น ์˜์กด์„ฑ ํ˜„์ƒ์„ ์ด์šฉํ•˜๋Š” ์…ˆ์ด๋‹ค.

์ด๊ฒŒ @storybook/builder-vite@0.4.2 ๋ฒ„์ „์˜ ์ฝ”๋“œ์ธ๋ฐ, Storybook 7์˜ ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„๋กœ builder ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ์Šคํ† ๋ฆฌ๋ถ ๋ฉ”์ธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋ชจ๋…ธ๋ ˆํฌ ํ˜•ํƒœ๋กœ ํ†ตํ•ฉ๋˜๋˜ ์‹œ๊ธฐ ๊ทผ์ฒ˜๋กœ ์˜์กด์„ฑ ์—ญ์‹œ ์ œ๋Œ€๋กœ ๋ช…์‹œ๋˜์—ˆ๋‹ค. [๊ด€๋ จ ์ปค๋ฐ‹] ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ์ด์Šˆ์ด๋ฉฐ, ๋นŒ๋”์˜ ๋ฒ„์ „ ์—ญ์‹œ ๋‹ค๋ฅธ addon๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ† ๋ฆฌ๋ถ์˜ ๋ฒ„์ „๊ณผ ํ†ต์ผ๋˜์—ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ..

cds issue

์‚ฌ์‹ค ์กฐ๊ธˆ ๋œฌ๊ธˆ์—†์ด ์ค€๋น„ํ•œ ๋ฐœํ‘œ ์ž๋ฃŒ์ธ๋ฐ, ๊ฐ€๋ณ๊ฒŒ๋งŒ ํ•ด์•ผ์ง€.. ํ•˜๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค๊ฐ€ ์–ด๋ ดํ’‹์ด ์˜ˆ์ƒํ–ˆ๋˜ ๋‚ด์šฉ์ด ํ‹€๋ฆฌ๊ณ  ํ‹€๋ฆฌ๊ณ ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๊ฒ€์ฆ์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๊ธ€์ด ํƒœ์‚ฐ์œผ๋กœ ๊ฐ€๋ฒ„๋ ธ๋‹ค. ๋งˆ์ง€๋ง‰์—๋Š” ๋‚ด๊ฐ€ ์™œ ์ด๊ฑธ ๋ณด๊ณ  ์žˆ์—ˆ๋Š”์ง€๋ฅผ ๊นŒ๋จน์–ด์„œ ์†์„ ๋†“๊ณ  ๋‹ค์‹œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์Œ.. ๋งค๋„๋Ÿฌ์šด ๊ธ€์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‚ด์šฉ ์—†์ด ์ฃผ์ œ๋งŒ ์ •ํ•˜๊ณ  ์‹œ์ž‘ํ•œ ๊ธ€์ด๋ผ ๊ทธ๋Ÿฐ๊ฐ€..

์ด ๊ธ€์„ ๋์œผ๋กœ ๋” ์ด์ƒ ์–€๋ฒ ๋ฆฌ๋ฅผ ๋ถ™๋“ค๊ณ  ์”จ๋ฆ„ํ•˜๋Š” ์ผ์€ ์—†์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์•„๋งˆ ๊ทธ๋ ‡์ง„ ๋ชปํ•  ๊ฒƒ ๊ฐ™๊ณ .. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ pnpm์„ ์จ ๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜๊ณ  ์žˆ๋‹ค. CDS๋ฅผ ํ•˜๋ฉด์„œ pnpm์„ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ฝค ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ณ , Yarn์—์„œ๋„ pnpm ๋ง์ปค๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ pnpm๋„ ๊ทธ๋งŒ์˜ ์žฅ์ ์ด ์žˆ๊ฒ ๊ตฌ๋‚˜ ํ•˜๋Š” ๋ง‰์—ฐํ•œ ์ƒ๊ฐ ์ค‘.

Refs.

GitHub - yarnpkg/berry: ๐Ÿ“ฆ๐Ÿˆ Active development trunk for Yarn โš’
Plug’n’Play
(๋ฒˆ์—ญ) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Import Map์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ
package.json์— ์Œ“์—ฌ์žˆ๋Š” ๊ฐœ๋ฐœ ๋ถ€์ฑ„
node_modules๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋ฅผ ๊ตฌ์›ํ•ด ์ค„ Yarn Berry
npm 7 is now generally available!
Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐ | PrayinForRain.dev
Vite
Yarn PnP ์˜์กด์„ฑ ์—๋Ÿฌ ํ•ด๊ฒฐ๊ธฐ
GitHub - nodejs/node: Node.js JavaScript runtime
Modules: ECMAScript modules | Node.js v20.2.0 Documentation

+Hugo.
\ No newline at end of file diff --git a/posts/2023/06/cds-retrospect/index.html b/posts/2023/06/cds-retrospect/index.html index 5900413..08b2d5c 100644 --- a/posts/2023/06/cds-retrospect/index.html +++ b/posts/2023/06/cds-retrospect/index.html @@ -1,11 +1,11 @@ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ  | PrayinForRain.dev -

์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ 

Table of Contents

๐Ÿฅถ ์ฐจ๊ฐ€์šด ์Šคํ„ฐ๋””

cold meeting
๋„ค์ด๋ฒ„ ์ปค๋„ฅํŠธ์žฌ๋‹จ ๋ถ€์ŠคํŠธ์บ ํ”„๋ฅผ ์ˆ˜๋ฃŒํ•˜๊ณ , ์ด๋Ÿฐ์ €๋Ÿฐ ๊ตฌ๊ตฌ์ ˆ์ ˆํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ฐจ๊ฐ€์šด ์Šคํ„ฐ๋””๋ผ๋Š” ์Šคํ„ฐ๋”” ๊ทธ๋ฃน์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์œ„ ์‚ฌ์ง„์€ ์ฐจ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉฐ ์ฐ์—ˆ๋˜ ์‚ฌ์ง„์ธ๋ฐ, ์‚ฌ์‹ค ๋‚˜๋Š” ์ € ์ž๋ฆฌ์— ์—†์—ˆ๊ณ  ์ € ์ž๋ฆฌ์— ๊ณ„์‹  ๋‘ ๋ถ„์ด ๋ง˜๋Œ€๋กœ ๋งŒ๋“ค์–ด์„œ ๋‚˜๋ฅผ ํŒ€์žฅ์œผ๋กœ ์”Œ์›Œ๋ฒ„๋ ธ๋‹ค. ์–ด์จŒ๋“  ๋‚˜๋„ ๊ณต๋ถ€๋ฅผ ํ•ด์•ผํ–ˆ๊ณ  ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด๋‹ˆ ํฐ ๋ถˆ๋งŒ ์—†์ด(?) ์ฐธ์—ฌํ–ˆ๋‹ค.

๐ŸงŠ CDS

๋‚˜๋ฆ„ ๋‹ค์–‘ํ•œ ์ฃผ์ œ๋กœ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ ์‹ถ๋‹ค๋Š” ๊ณตํ†ต๋œ ์ƒ๊ฐ์ด ๋ชจ์—ฌ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋ณด๊ธฐ๋กœ ์ •ํ–ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ์›์ธ์€ ๋ถ€์บ ์„ ํ•˜๋ฉฐ ๊ธฐํš์ด๋‚˜ ๋””์ž์ด๋„ˆ๊ฐ€ ์•„์˜ˆ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๊ณผ์ •์—์„œ ๊ฒช์—ˆ๋˜ ๊ณ ์ถฉ์œผ๋กœ ์ธํ•œ ๋ฐœ์ƒ์ด์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ตํ•œ๋‹ค. ์‚ฌ์‹ค ์›Œ๋‚™ ๋†๋‹ด๋”ฐ๋จน๊ธฐ ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋˜ ๊ธฐํš์ด๋ผ ์„ธ์„ธํ•œ ๊ณผ์ •์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

image

์ •๋ง ์‚ฐ๋งŒํ•œ ๊ธฐํš

์•„๋ฌดํŠผ ๊ทธ๋ ‡๊ฒŒ 2๋‹ฌ ์ •๋„ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋ฅผ ์•ผ๊ธˆ์•ผ๊ธˆ ์ง„ํ–‰ํ•ด์„œ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ์ฒซ ๋ฒ„์ „์„ ๋ฆด๋ฆฌ์ฆˆํ•˜์˜€๋‹ค. ์›๋ž˜ ๊ณ„ํš์ด๋ผ๋ฉด ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ CDS๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœํ•ด๋ณด๊ณ , ์ž์ฒด ํ”ผ๋“œ๋ฐฑ์„ ํ•ด ๋ณด๋Š” ๊ณผ์ •๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ง€๊ธˆ ์ฐจ๊ฐ€์šด ์Šคํ„ฐ๋””์˜ ์ƒˆ ์ปจํ…์ธ  ์ค€๋น„์™€ ์ผ๋ถ€ ํŒ€์›๋“ค์˜ ํ˜„์ƒ ์ด์Šˆ๊ฐ€ ๊ฒน์ณ ์กฐ๊ธˆ ์‰ฌ์–ด๊ฐ€๊ณ  ์žˆ์–ด์„œ.. ๋ฏธ๋ฆฌ ํšŒ๊ณ ๋ฅผ ์จ ๋ณด๊ณ ์ž ํ•œ๋‹ค.

๊ณ ๋ คํ•œ ์š”์†Œ๋“ค

์ ‘๊ทผ์„ฑ

์ ‘๊ทผ์„ฑ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ์ด ์›น ์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ ์žฅ์• ์ธ๋งŒ์„ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋‚˜ ๋Š๋ฆฐ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค ๋“ฑ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ๋„ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
- What is accessibility? - MDN

a11y option icon in mac
์ง€๊ธˆ์€ ์‹œ๊ฐ„์ด ๋งŽ์ด ํ˜๋Ÿฌ์„œ(๋‚ด๊ฐ€ ํšŒ๊ณ  ์“ฐ๊ธฐ๋ฅผ ๋ฌด์‹œ๋ฌด์‹œํ•˜๊ฒŒ ๋ฏธ๋ค˜๊ธฐ ๋•Œ๋ฌธ์—) ์ •ํ™•ํ•œ ๊ธฐ์–ต์€ ๋‚˜์ง€ ์•Š์ง€๋งŒ.. ๋‚˜์—๊ฒŒ ์ ‘๊ทผ์„ฑ์ด๋ผ๊ณ  ํ•˜๋Š” ๋‹จ์–ด์— ๋Œ€ํ•œ ์ธ์‹์€ ๋”ฑ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์•˜๋‹ค. ์•‰์•„์žˆ๋“  ์„œ์žˆ๋“  ๋ญ”๊ฐ€ ์‚ฌ๋žŒ์˜ ํ˜•ํƒœ๋ฅผ ํ•œ ํ”ฝํ† ๊ทธ๋žจ์—.. ๋‹๋ณด๊ธฐ๊ฐ™์€ ๋‚˜์—๊ฒ ํ•„์š” ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜๋Š”? ์š”์ƒˆ๋Š” ํ•„์š”ํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค

์•„๋ฌดํŠผ ๋„ˆ๋ฌด ๋ง‰์—ฐํ•˜๊ณ  ๋จผ ์ด๋ฏธ์ง€๋กœ๋งŒ ๋Š๊ปด์กŒ๊ธฐ ๋•Œ๋ฌธ์—, ํŒ€์›์ด ์ด๊ฑธ ๊ณ ๋ คํ•˜์ž! ๋ผ๊ณ  ์ฒ˜์Œ ๋งํ–ˆ์„ ๋•Œ์—๋Š” ์ „ํ˜€ ์™€๋‹ฟ๋Š” ๊ฒƒ์ด ์—†์—ˆ๋‹ค. ์™œ? ์–ด๋–ป๊ฒŒ? ๋ฌด์—‡์„? ๋ชจ๋‘ ๋ฌผ์Œํ‘œ ํˆฌ์„ฑ์ด์˜€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒ€์›๋“ค์ด ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์กฐ๊ธˆ์”ฉ ํ‰๋‚ด๋‚ด๋‹ค๋ณด๋‹ˆ ์ ‘๊ทผ์„ฑ์ด ๋ฌด์—‡์ด๊ณ , ์™œ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด ์กฐ๊ธˆ์”ฉ ๋ฐฐ์›Œ๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๋‚ด๊ฐ€ ๋…ธ์…˜์ด๋‚˜ VS Code์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ๋‹จ์ถ•ํ‚ค๋“ค๋„ ์ ‘๊ทผ์„ฑ์„ ๊ณ ๋ คํ•œ ๊ธฐ๋Šฅ์˜ ํ•˜๋‚˜์˜€๊ณ , ํƒญ, ESC, ๋ฐฉํ–ฅํ‚ค ๋“ฑ ๋งˆ์šฐ์Šค๊ฐ€ ํ•  ์ผ์„ ํ‚ค๋ณด๋“œ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ ‘๊ทผ์„ฑ์ด์˜€๋‹ค. ์ ‘๊ทผ์„ฑ์€ ๋ชธ์ด ๋ถˆํŽธํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ ๋ฟ ์•„๋‹ˆ๋ผ, ๋‹จ๋ฝ ๋งจ ์œ„์˜ ์ธ์šฉ์ฒ˜๋Ÿผ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์•ฑ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด์—ˆ๋‹ค. ํ‰์†Œ์— ๋‚˜๋Š” ๋‹จ์ถ•ํ‚ค๋ฅผ ๊ฝค๋‚˜ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด์–ด์„œ ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ•˜๋‹ค๋ณด๋ฉด ๋ˆ„๊ตฐ๊ฐ€ ๊ฐ€๋” ๋†€๋ผ๊ณค ํ–ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ๋‚ด๊ฐ€ ์ ‘๊ทผ์„ฑ์„ ๋‚จ์˜ ์ผ์ฒ˜๋Ÿผ ์ƒ๊ฐํ–ˆ๋‹ค๋Š”๊ฒŒ ์•„์ด๋Ÿฌ๋‹ˆํ•˜๋‹ค.

์•„๋ฌดํŠผ ์–ด๋–ป๊ฒŒ ๊ณ ๋ คํ–ˆ๋ƒ ํ•œ๋‹ค๋ฉด ๊ทธ ๋‹ต์€ ๋„ˆ๋ฌด ๋‹จ์ˆœํ–ˆ๋‹ค. ์‹œ๋งจํ‹ฑํ•œ ํƒœ๊ทธ ์‚ฌ์šฉ์—์„œ ์ถœ๋ฐœํ–ˆ๋‹ค. ๋ชฉ์ ์— ๋งž๋Š” HTML ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 70%๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์ ‘๊ทผ์„ฑ ํˆด์ด ์•Œ์•„์„œ ๊ตฌํ˜„ํ•ด ์ฃผ๊ณ , ๋‚˜๋จธ์ง€ 30%๋งŒ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์‹ค 7:3๋„ ๋„ˆ๋ฌด ์†Œ์‹ฌํ•˜๊ฒŒ ๋‚˜๋ˆด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ.. ํ•œ 9:1?
์ด ์›์น™์„ ๊ฑธ์–ด ๋†“๊ณ  ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋‹ˆ ์›น ํ‘œ์ค€์— ๋Œ€ํ•ด์„œ๋„ ๋” ๊ณต๋ถ€ํ•˜๊ฒŒ ๋˜๊ณ , ํ‰์†Œ์— ๋ชฐ๋ž๋˜ HTML ์š”์†Œ์˜ ์†์„ฑ๋„ ์•Œ๊ฒŒ ๋˜๊ณ , ๊ฝค๋‚˜ ๊นŠ์€ ๊ณต๋ถ€๊ฐ€ ๋˜์—ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด์ฃผ์ง€ ์•Š๋Š” ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ธฐ๋Œ€๋˜๋Š” ๋™์ž‘์ด ๋ฌด์—‡์ด๊ณ , ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ์˜ ์ƒ๊ฐ์ด ๊ฐ๊ฐ ๋‹ฌ๋ผ ํ† ๋ก ํ•˜๋Š” ๊ณผ์ •๋„ ๋„ˆ๋ฌด ์œ ์ตํ•˜๊ณ  ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค.

DX(Developer Experiment)

์ผ์ „์— ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋ง‰์—ฐํžˆ ํŽธํ•˜๋‹ค๋”๋ผ~ ํ•˜๋Š” ์–˜๊ธฐ๋งŒ ๋“ฃ๊ณ  ์žˆ๋‹ค๊ฐ€ ์–ด๋”˜๊ฐ€์˜ ๊ณผ์ œ๋ฅผ ํ•  ๋•Œ ํ•œ ๋ฒˆ ์จ ๋ณด์ž ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ณผ๋Š” ์ฒ˜์ฐธํ–ˆ๋‹ค. ๋ฌผ๋ก  ๋ฌธ์„œ๋„ ์ œ๋Œ€๋กœ ์ฝ์ง€ ์•Š์•˜๊ณ  ๋ฌด์—‡์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒŒ์•…์„ ์ œ๋Œ€๋กœ ๋ชปํ–ˆ๋˜ ๊ฒƒ์ด ์›์ธ์ด์—ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ์›์ธ์€ ์ด ๋งŒํผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์›ํ•ด ์ค˜๋„ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ• ์ง€ ์ •ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๋ฏธ์  ๊ฐ๊ฐ์ด๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ์•„๋ฌดํŠผ ์ง์ ‘ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ถˆํŽธํ–ˆ๋‹ค.

code reviews

์•ž์œผ๋กœ ์‚ด๋ฉด์„œ ์ดํ† ๋ก ๋œจ๊ฑฐ์šด ๋ฆฌ๋ทฐ๊ฐ€ ๋˜ ์žˆ์„๊นŒ..


์ง€๊ฐ€ ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ์“ฐ๊ณ  DX๊ฐ€ ์–ด์ฉŒ๊ณ  ์–˜๊ธฐํ•˜๋Š” ๊ฒƒ๋„ ์›ƒ๊ธด ์ผ์ด์ง€๋งŒ… ์–ด์จŒ๋“  ๋””์ž์ธ ์‹œ์Šคํ…œ ์ž์ฒด๊ฐ€ ๊ฐœ๋ฐœ์ž์˜ ํŽธ์˜๋ผ๋Š” ๋งฅ๋ฝ์—์„œ ์ถœ๋ฐœํ•œ ์š”์†Œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํŽธํ• ์ง€์— ์ œ์ผ ๊ด€์‹ฌ์ด ๋งŽ์•˜๋‹ค.
์–ด๋–ป๊ฒŒ DX๋ฅผ ๊ณ ๋ คํ–ˆ๋ƒ๊ณ ? ๋‚˜์—๊ฒŒ ๋งž์ท„๋‹ค. 100% ๋‚˜ ์—๊ฒŒ ๋งž์ถ”์ง„ ์•Š์•˜์ง€๋งŒ, ์šฐ์„  ๊ฐ์ž๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๊ฐ์ž์˜ ์ƒ๊ฐ๊ณผ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•˜๋ฉด ์ฝ”๋“œ๋ฆฌ๋ทฐ๋กœ ํ† ๋ก ์„ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ง€๊ธˆ ๋ณด๋‹ˆ ์กฐ๊ธˆ ์ง‘์š”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์„œ ํŒ€์›๋“คํ•œํ…Œ ๋ฏธ์•ˆํ•ด์ง€๋Š”๋ฐ.. ๋‚ด๊ฐ€ ์ด ๊ณผ์ •์—์„œ ์–ป์€ ๋งŒํผ ์šฐ๋ฆฌ ํŒ€์›๋“ค๋„ ์–ป์–ด ๊ฐ€์‹  ๊ฒŒ ์žˆ๊ธธ ๊ธฐ๋„ํ•ด๋ณธ๋‹ค ใ…Žใ…Ž..

์ž˜ ๋œ ๊ฒƒ๋“ค

์„ฑ๊ณต์ ์ธ ํ˜‘์—…

coldstudy gather town

์•ฝ์† ์‹œ๊ฐ„ ์ „์— ํ•˜๋‚˜๋‘˜ ๋ชจ์—ฌ์„œ ์žก๋‹ดํ•˜๋‹ค๊ฐ€ ๊ทธ์ž๋ฆฌ์—์„œ ํšŒ์˜๋ฅผ ์‹œ์ž‘ํ•œ ์ƒํ™ฉ

์šฐ๋ฆฌ ์Šคํ„ฐ๋””๋ฅผ ํ•œ ๋งˆ๋””๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ์กฐ๋ณ„๊ณผ์ œ ํฌ๋งํŽธ์ด์—ˆ๋‹ค. ๋‚ด ๋Œ€ํ•™์ƒํ™œ์€ ๊ฑธ์–ด๋‹ค๋‹ˆ๋Š” ์ ˆ๋ง์— ๊ฐ€๊น๊ธด ํ–ˆ๋Š”๋ฐ.. ์•„๋ฌดํŠผ ๊ฐ์ž ์—ด์ •๊ณผ ์š•์‹ฌ์ด ๊ฐ€๋“ํ•œ ์‚ฌ๋žŒ๋“ค์ด ๋ชจ์—ฌ์„œ ๊ฐ์ž ์›ํ•˜๋Š” ๊ฒƒ๋“ค์„ ํ–ˆ๋‹ค. ๋ถ„์—…๋„ ์›ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ๊ฐ€๋‹ˆ ๋‚จ๋Š” ๊ฒŒ ์—†์—ˆ๊ณ , ๊ณต์œ ๋„ ์ž˜ ๋˜์—ˆ๊ณ , ๊ณต์œ ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋ ๋งŒํผ ๋‚จ์˜ ์ฝ”๋“œ์— ๊ด€์‹ฌ๋„ ๋งŽ์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจํ—ค์œฐ ํšŒ๊ณ ๋•Œ ๊ฐ€์žฅ ํฐ ์•„์‰ฌ์›€์ด์˜€๋˜ ๊ธฐ๋ก์ด ๋‚จ์ง€ ์•Š๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ๊ฐ€์žฅ ๊ฒฝ๊ณ„ํ–ˆ๋‹ค. ์Šฌ๋ž™๊ณผ ๊ฒŒ๋”ํƒ€์šด ์Œ์„ฑ ํšŒ์˜๋ฅผ ์ž์ฃผ ํ–ˆ์ง€๋งŒ, ์ตœ๋Œ€ํ•œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๊ธฐ๋กํ–ˆ๊ณ  ๊ทธ ๋•๋ถ„์— ์ค‘๊ฐ„๋ถ€ํ„ฐ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๋Š” ํŒ€์›๋„, ์ฃผ๋ง๋™์•ˆ ๋‡Œ๋ฅผ ๋น„์šฐ๊ณ  ์˜จ ๋‚˜๋„ ๊ทธ ๋งฅ๋ฝ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์‚ฌ์‹ค +๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์œผ๋กœ๋ถ€ํ„ฐ 3๋‹ฌ์ด๋‚˜ ์ง€๋‚œ ์‹œ์ ์— ํšŒ๊ณ ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๋น„๊ฒฐ๋„ ์ด ๊ทœ์น™์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ด ๊ทœ์น™์„ ์˜์‹ํ•˜๋‹ค๋ณด๋‹ˆ ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ๋‚จ๊ธฐ๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ํญ๋ฐœ์ ์œผ๋กœ ๋Š˜์—ˆ๋‹ค. ์ด๋ฅผ ๊ตฌ์ง ๊ณผ์ •์—์„œ ์–ดํ•„ํ•˜๊ธฐ๋„ ์ข‹์•˜๊ณ , ์ทจ์—…ํ•œ ์ดํ›„์—๋„ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์‚ฌ๋‚ด์—์„œ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ํ™œ์šฉํ•˜๋Š” ์ผ๋„ ์žˆ์–ด ๋‘๊ณ ๋‘๊ณ  ์œ ์šฉํ–ˆ๋‹ค. ํŠนํžˆ ํ•™์Šต์„ ๋ชฉ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜์‹œ๋Š” ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ €์žฅ ๊ฐ•๋ฐ•์ฆ ํ™˜์ž(?)๊ฐ€ ๋˜์‹œ๊ธธ ๊ฐ•๋ ฅํžˆ ๊ถŒํ•˜๊ณ  ์‹ถ๋‹ค.

์•„์‰ฌ์šด ๊ฒƒ๋“ค

๋””์ž์ธ ์‹œ์Šคํ…œ์€ ์™œ ํ•„์š”ํ•œ๊ฐ€?

CDS๋ฅผ ๋งŒ๋“ค๋ฉฐ ๊ฐ€์žฅ ํž˜๋“ค์—ˆ๋˜ ๋ถ€๋ถ„์€ ๋””์ž์ธ ์‹œ์Šคํ…œ์€ ์–ด๋””๊นŒ์ง€ ํ•ด์ค˜์•ผ ํ•˜๋Š”๊ฐ€? ์˜€๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ๋””์ž์ธ๊นŒ์ง€๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•ด ์ค„ ์ˆ˜๋„ ์žˆ๊ณ , ๋””์ž์ธ์„ ์ œ์™ธํ•œ ์ปดํฌ๋„ŒํŠธ์˜ business logic๋งŒ์„ ์ œ๊ณตํ•˜๋Š” Headless ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์กด์žฌํ•œ๋‹ค. ๋””์ž์ธ ์—†๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ ์•„๋ฌดํŠผ ์ปค์Šคํ…€์˜ ์ž์œ ์™€ ๋””์ž์ธ์˜ ์ผ๊ด€์„ฑ ์‚ฌ์ด์˜ ์ค„๋‹ค๋ฆฌ๊ธฐ๋Š” ์ธํ„ฐ๋„ท์—์„œ๋„ ๋๋‚˜์ง€ ์•Š๋Š” ๊ณ ๋ฏผ๋“ค์ด ์ด์–ด์ ธ ์™”๊ณ , ์šฐ๋ฆฌ ํŒ€ ๋‚ด๋ถ€์—์„œ๋„ ๊ทธ ๊ธฐ์ค€์ด ์ œ๋Œ€๋กœ ์‹ฑํฌ๊ฐ€ ๋งž์ง€ ์•Š์•„ ์ž‘์—…์ด ๋”๋ŽŒ์กŒ๋˜ ์ผ์ด ๋“œ๋ฌธ๋“œ๋ฌธ ์žˆ์—ˆ๋‹ค. ์‚ฌ์‹ค ๋Œ€๋ถ€๋ถ„ ๋‚˜์˜ ์ง€๋‚˜์นœ ์ƒ์ƒ(?)์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ์˜€๋˜ ๊ฒƒ ๊ฐ™์ง€๋งŒ..
์ด ๋ถ€๋ถ„์€ ์‚ฌ์‹ค ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ฏธ๋ฆฌ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๋””์ž์ธ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๊นŠ์ด ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•˜๋˜ ๋‚˜๋Š” ๊ทธ๊ฑธ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์œผํ—คํ—ค ๋ชฐ๋ผ ์žฌ๋ฐŒ๋‹น ํ•˜๋ฉฐ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ผ€๋ฐ”์ผ€๋กœ ํ† ๋ก ํšŒ๋ฅผ ์†Œ์ง‘ํ–ˆ๋‹ค. ์žฌ๋ฏธ๋Š” ์žˆ์—ˆ๋Š”๋ฐ ํšจ์œจ์ ์ด์ง„ ์•Š์•˜๋‹ค ใ…‹..

๋””์ž์ธ ์‹œ์Šคํ…œ์€ ์™œ ํ•„์š”ํ• ๊นŒ? ์‚ฌ์‹ค ์ด ๊ทผ๋ณธ์ ์ธ ๋ฌผ์Œ์—๋Š” ์•„์ง๋„ ๋‹ตํ•˜๊ธฐ ์–ด๋ ต๋‹ค. CDS์˜ ๊ฒฝ์šฐ์—๋Š” ํ•™์Šต์„ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๊ณ , ๊ธฐ์—…์˜ ์ž…์žฅ์—์„œ๋Š” ๊ฒฐ๊ณผ๋ฌผ์€ ๊ทธ๋Œ€๋กœ์ด๋ฉด์„œ ๊ณต์ˆ˜๋งŒ ๋งŽ์ด ๋“ค์–ด๊ฐ€๋Š” ์•„์ฃผ ๋น„ํšจ์œจ์ ์ธ ์ž‘์—…์ด๋‹ค. ํ–ฅํ›„ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ์˜ ์žฅ์ ์ด ์žˆ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ, ์‹ค์ž‘์—…์ž๊ฐ€ ์•„๋‹Œ ๊ธฐ์—…์˜ ์˜์‚ฌ๊ฒฐ์ •๊ถŒ์ž๋Š” ๊ณต๊ฐํ•˜๊ธฐ๋„ ํž˜๋“ค๊ณ , ์‹ค์ œ๋กœ ์ €์šธ์งˆ์„ ํ•ด ๋ณด๋ฉด ์—ฌ์ „ํžˆ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋น„์šฉ์ด ๋” ํฐ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ตฌ์ง ํ™œ๋™ ์ค‘ ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์งˆ๋ฌธ์„ ๋ช‡ ๋ฒˆ ๋ฐ›์•˜๋Š”๋ฐ, ์‹œ์›ํ•˜๊ฒŒ ๋Œ€๋‹ตํ•˜์ง„ ๋ชปํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์œ ๋ฅผ ๋Œ€๋ผ๋ฉด ๋Œˆ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋” ๊นŠ์€ ๊ณ ๋ฏผ๊ณผ ์ฒ ํ•™์ด ์žˆ์–ด์•ผ ์ฑ„์›Œ์งˆ ๊ฒƒ ๊ฐ™์€ ์–ด๋”˜๊ฐ€์˜ ๋นˆ ๊ณต๊ฐ„์ด ์ž๊พธ ๋‚จ๋”๋ผ.

์Šค์ฟผ์‹œ ๋จธ์ง€

CDS๋Š” ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์œผ๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์Šค์ฟผ์‹œ ๋จธ์ง€๋กœ ๋ณ‘ํ•ฉํ•  ๊ฒƒ ์ด๋ผ๋Š” ๊ทœ์น™์ด ์žˆ์—ˆ๋‹ค. ํ•œ ํŒ€์› ๋ถ„์ด ์ด์ „ ํ˜‘์—…์—์„œ ์•„์ฃผ ๊ธ์ •์ ์ธ ๊ฒฝํ—˜์„ ํ•˜์…”์„œ ์ œ์•ˆํ•ด ์ฃผ์…จ๊ณ , ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ์ฒดํ—˜์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ™ํ™ ์กฐ์™€์šฉ~~ ํ•˜๊ณ  ํ†ต๊ณผ๋˜์—ˆ๋‹ค. ํ™•์‹คํžˆ ๊นƒ์— ๋กœ๊ทธ๊ฐ€ ๊น”๋”ํ•˜๊ฒŒ ๋‚จ๋Š” ๊ฒƒ์€ ํŽธํ•œ๋ฐ.. ๋‹ค์Œ์—๋„ ์Šค์ฟผ์‹œ ๋จธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ƒ? ํ•˜๋ฉด ๋‚˜๋Š” ์กฐ๊ธˆ ๊ณ ๋ฏผ์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ์„  CDS ์ž์ฒด๋Š” ๋””์ž์ธ์‹œ์Šคํ…œ์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ž‘์—…์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋จธ์ง€๋˜๊ณ  ๋‚˜๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฐ–๊ณ  ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ๋ณ„๋กœ ์—†๋‹ค. ๋”ฐ๋ผ์„œ feat: ooo ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ๋งŒ ๋‚จ์•„๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์Šค์ฟผ์‹œ ๋จธ์ง€๋กœ ์ธํ•ด git graph๊ฐ€ ์—„์ฒญ ๊น”๋”ํ•˜๊ณ  ์ง๊ด€์ ์ด์—ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ๋‚˜์ค‘์— ๋‚ด๊ฐ€ ์ž‘์—…ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋ญ”๊ฐ€ ์•„์‰ฌ์šด ์ ์ด๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ผ์ด ์ƒ๊ธฐ๋ฉด, ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” line์˜ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ๋งฅ๋ฝ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์งœ์—ฌ์กŒ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ค ํ•„์š”์— ์˜ํ•ด ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ˜„๋˜์—ˆ๋˜ ์ฝ”๋“œ๋ผ๋ฉด? ๋‚ด๊ฐ€ ๊ทธ ๋งฅ๋ฝ์„ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋˜‘๊ฐ™์€ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค. ๋˜๋Š” ์ด๋ฒˆ์— ์ˆ˜์ •ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ตœ์ดˆ ์ž‘์—…์ž์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด?
์•„๋ฌดํŠผ ์œ„์— ๋‚ด๊ฐ€ ์ €์žฅ ๊ฐ•๋ฐ•์ฆ์ด ์–ด์ฉŒ๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ทธ ๋‚ด์šฉ๊ณผ ์•ฝ๊ฐ„ ๋Œ€์น˜ํ•˜๋Š” ๊ทœ์น™์ด๊ธฐ๋„ ํ•ด์„œ, ์ž˜ ๊ณ ๋ฏผํ•ด ๋ณด๊ณ  ์„ ํƒํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๊ฒฐ์ • ์ž์ฒด๋ฅผ ํ›„ํšŒํ•˜๊ฑฐ๋‚˜ ํ•˜์ง„ ์•Š๋Š”๋‹ค. ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ํ–ˆ๊ณ , ์–ธ๊ธ‰ํ–ˆ๋“ฏ ํ”„๋กœ์ ํŠธ ํŠน์„ฑ๊ณผ๋„ ์ ๋‹นํžˆ ๋“ค์–ด๋งž๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

๋งบ๋Š” ๋ง

cds v1.0 release

๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ๊นƒํ—ˆ๋ธŒ ํ”ผ๋“œ์— ๋œจ๋Š” ๊ฑธ ๋ชฐ๋ž๋Š”๋ฐ ๋ฌด์ฒ™ ๊ฐ์‚ฌํ•œ ์‘์›์„ ๋ฐ›์•˜๋‹ค.

์‚ฌ์‹ค ํŒ€์›๋“ค์ด CDS๋ฅผ ํ•˜๋ฉด์„œ ๊ฐ์ž ๋ธ”๋กœ๊ทธ์— ๊ธ€ ํ•˜๋‚˜ ์”ฉ์€ ์”์‹œ๋‹ค! ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ๋‚˜๋งŒ ์•ˆ ์ผ๋‹ค ใ…‹ใ…‹.. ๋‹ค๋“ค ๋ญ”๊ฐ€ ๊นŠ์ด ๊ณ ๋ฏผํ•œ ํ…Œ๋งˆ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ๋ฌธ๋“ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‚˜๋Š” ์ด๊ฒƒ์ €๊ฒƒ ๋‹ค์–‘ํ•˜๊ฒŒ ์ ๋‹นํžˆ ํ•œ ๋Š๋‚Œ? ์ข€ ๋” ํ…Œ๋งˆ๋ฅผ ์ •ํ•˜๊ณ  ์ง‘์ค‘ํ•ด์„œ ํ•  ๊ฑธ ํ•˜๋Š” ์ƒ๊ฐ๋„ ๋“ค๊ณ  ํ ..

์ด์ „์— ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋“ค์€ ์ •๋ง ์•„์‰ฌ์›€์ด ๊ฐ•๋ ฌํ•˜๊ฒŒ ๋‚จ์•˜๋Š”๋ฐ, ๊ทธ๋™์•ˆ์˜ ์•„์‰ฌ์›€์„ ๋ชจ์•„์„œ ๋ฒผ๋ฅด๊ณ  ์žˆ์—ˆ์–ด์„œ + ๋ถ€์บ  ๋•Œ๋ถ€ํ„ฐ ๋‚ด๊ฐ€ ๋„ˆ๋ฌด ์ข‹์•„ํ•˜๋˜ ์‚ฌ๋žŒ๋“ค๊ณผ ํ˜‘์—…์„ ํ•˜๊ฒŒ ๋˜์–ด์„œ ๋ฟŒ๋“ฏํ•˜๊ณ  ํ–‰๋ณตํ•œ ํ˜‘์—…์ด์—ˆ๋‹ค. ์ฐจ์Šค๋Š” ์ง€๊ธˆ๋„ ๊พธ์ค€ํžˆ ์Šคํ„ฐ๋””๋ฅผ ์ด์–ด๊ฐ€๊ณ  ์žˆ๋Š”๋ฐ, ์ด ์‚ฌ๋žŒ๋“ค์ด ์•„์ง ๋„๋ง์น˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฑด ๋‚˜๋„ ๊ทธ๋“ค์—๊ฒŒ ๋‚˜๋ฆ„ ๊ดœ์ฐฎ์€ ๋™๋ฃŒ์˜€๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ?(๋‚ด ์ƒ๊ฐ) ๊ทธ๋Ÿฌ๋‹ˆ 1.2 ๋ฒ„์ „ ํ•ฉ์‹œ๋‹ค ^^

์ง€๊ธˆ ์“ฐ๋Š” ๋ธ”๋กœ๊ทธ ํ…Œ๋งˆ์—๋Š” ์ˆ˜์ •์ผ ํ‘œ์‹œ๊ฐ€ ์•ˆ๋˜๋Š”๋ฐ.. ์ด ๊ธ€์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ•œ๊ฒŒ 6์›” 18์ผ์ด๊ณ  ์ง€๊ธˆ์ด 8์›” 14์ผ์ด๋‹ค. ๋ญ” ํšŒ๊ณ  ์“ฐ๋Š” ๋ฐ ๋‘ ๋‹ฌ์ด๋‚˜ ๊ฑธ๋ ธ๋Š”์ง€ ํ•˜ํ•˜ ์ฐธ ์•Œ ์ˆ˜๊ฐ€ ์—†๋Š” ์ˆ˜์ค€์˜ ๊ฒŒ์œผ๋ฆ„์ด๋‹ค. ๋ญ ๋ˆ„๊ฐ€ ๋ณด๋Š” ๋ธ”๋กœ๊ทธ๋Š” ์•„๋‹ˆ๊ธด ํ•œ๋ฐ ๊ทธ๋ž˜๋„ ๊ฐ€๋”์€ ๊ธ€์„ ์“ฐ๋ ค๊ณ  ํ•˜์ž ^ใ…^

+Hugo. \ No newline at end of file diff --git a/posts/2023/11/cell-refactoring/index.html b/posts/2023/11/cell-refactoring/index.html index e1e30e0..61988b5 100644 --- a/posts/2023/11/cell-refactoring/index.html +++ b/posts/2023/11/cell-refactoring/index.html @@ -1,7 +1,7 @@ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์ž | PrayinForRain.dev -

์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์ž

Table of Contents

์„ฑ๋Šฅ์„ ์–ธ์  ๊ฐ€๋Š” ๊ณ ๋ คํ•ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ?

์ผ๋‹จ ์„ฑ๋Šฅ์€ ๋”ฐ๋กœ ๊ณ ๋ คํ•˜์ง€ ๋ง๊ณ  ์ผ๋‹จ ๋งŒ๋“œ์„ธ์š”. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๊ทธ ๋•Œ ๊ณ ๋ฏผํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์›น ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ค์—ˆ๋˜ ๋ง์ด๋‹ค. ์‹ค์ œ๋กœ ์š”์ฆ˜์€ ์œ ์ € ๊ธฐ๊ธฐ ์„ฑ๋Šฅ์ด ๋งŽ์ด ์˜ฌ๋ผ์™”๊ณ , ์–ด์ง€๊ฐ„ํ•œ ๋ถ€๋ถ„์€ ํŒจํ‚ค์ง€๋‚˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•Œ์•„์„œ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋‹น์žฅ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ณ ๋ ค๋ฅผ ํ•  ํ•„์š”๋Š” ์—†์–ด์กŒ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํšŒ์‚ฌ์—์„œ ๊ฐœ๋ฐœ์„ ํ•˜๋˜ ์ค‘ ์ง„์งœ๋กœ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ์ฐพ์•„์™”๋‹ค. ๊ฝค ์˜ค๋ž˜๋œ ์ผ์ธ๋ฐ, ํšŒ๊ณ  ๊ธ€์„ ๋ช‡ ๋ฒˆ ์”ฉ ์ผ๋‹ค ์ง€์› ๋‹ค ํ•˜๋‹ค๊ฐ€ ์ด์ œ๋ผ๋„ ์ •๋ฆฌํ•ด ๋ณธ๋‹ค.

๋ ˆ์–ด๋ฐ์ดํ„ฐ ์†Œ๊ฐœ

๋„ˆ๋ฌด ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜๊ณผ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์คฌ๋˜ ๋‚ด ์ฒซ ํ”„๋กœ์ ํŠธ

๋‚ด๊ฐ€ ์ฐธ์—ฌํ•˜๋˜ ํ”„๋กœ์ ํŠธ๋Š” ์ผ์ข…์˜ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ์™€ ๋น„์Šทํ•œ ์†”๋ฃจ์…˜์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ •์˜ํ•˜๋“ฏ ์—ด์— ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์…€์€ ํ•ด๋‹น ํƒ€์ž…์— ๋งž๋Š” ์ž…๋ ฅ UI๋ฅผ ํŒ์˜ค๋ฒ„๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์‹์ด๋‹ค. Tanstack Table๊ณผ Tanstack Virtual์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ๋ฐ ๊ฐ€์ƒํ™”๋ฅผ ์ ์šฉํ•˜์˜€๊ณ , ๊ฐ ์…€์€ ํƒ€์ž…๋ณ„ ์ž…๋ ฅ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ prop์œผ๋กœ ์ง€์ •๋œ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋งํ•ด ์ฃผ๋„๋ก ๋˜์–ด ์žˆ์—ˆ๋‹ค.

ํ–‰๊ณผ ์—ด์— ๋ชจ๋‘ ๊ฐ€์ƒํ™”๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์œผ๋‹ˆ ๊ดœ์ฐฎ์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ž…๋ ฅ์€ ์ปค๋…• ํƒ์ƒ‰๋„ ์–ด๋ ค์›Œ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ผ๋‹จ ๊ทธ ์ž„๊ณ„์ ์ด ์ง€๊ธˆ ์‚ฌ์šฉ์ž๋“ค์˜ ์ƒํ™ฉ๊ณผ๋Š” ๋ฉ€์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์žˆ์—ˆ์œผ๋‚˜ ์ œํ’ˆ์ด ์ ์  ํ™•์žฅ๋˜๋ฉด์„œ ๋” ์ด์ƒ์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์™ธ๋ฉดํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ๋‹ค.

์›์ธ์„ ํŒŒ์•…ํ•ด ๋ณด์ž

์„ฑ๋Šฅ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด React Developer Tools์™€ ๊ตฌ๊ธ€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

React Devtool

๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ๋ Œ๋”๋ง ํ•˜์ด๋ผ์ดํŠธ

์ฒดํฌํ•˜๋ฉด ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋น›๋‚œ๋‹ค.

๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์˜ต์…˜์—๋Š” ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํ…Œ๋‘๋ฆฌ๊ฐ€ ๋ฐ˜์ง์ด๊ฒŒ ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ๋‹ค. ์ด ์˜ต์…˜์„ ์ผœ๊ณ  ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์‹œํŠธ๋ฅผ ํƒ์ƒ‰ํ•ด ๋ณด์•˜๊ณ , Tanstack์ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์‹œ์™€ ๋น„๊ตํ•ด์„œ ๋ฆฌ๋ Œ๋”๋ง์— ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์•˜๋‹ค. ์šฐ์„  Tanstack ์˜ˆ์‹œ๋Š” ์Šคํฌ๋กค ๋  ๋•Œ ๋งˆ๋‹ค ์Šคํฌ๋กค ์˜์—ญ์˜ Container ๋ถ€๋ถ„๋งŒ์ด ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๋ฐ˜๋ฉด, ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ๋งค ์Šคํฌ๋กค๋งˆ๋‹ค ๋ชจ๋“  ์…€์ด ๊ฐ๊ฐ ๋ฆฌ๋ Œ๋”๋ง๋˜์—ˆ๋‹ค.

Tanstack Virtual ์˜ˆ์‹œ

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ”„๋กœํŒŒ์ผ๋ง

๋˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Performance ํƒญ์—์„œ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง๋„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…)๋Š” ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๋ถˆ๊ทœ์น™ํ•˜๊ฒŒ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•„์ฃผ ์ •ํ™•ํ•œ ์ง€ํ‘œ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๋…ธ๋“œ ๊ฐœ์ˆ˜, ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ ๋“ฑ์˜ ์ถ”์„ธ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ณ‘๋ชฉ ์ง€์ ์„ ํ™•์ธํ•˜๋Š” ๋ฐ์—๋Š” ๋„์›€์ด ๋œ๋‹ค.
์ด ๋ณด๊ณ ์„œ์—์„œ ๋‚ด๊ฐ€ ์–ป์€ ์ธ์‚ฌ์ดํŠธ๋Š” ๋…ธ๋“œ ๊ฐœ์ˆ˜์™€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ˆ˜๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋„ ๋งค์šฐ ๋†’์•˜์ง€๋งŒ ๋‹น์žฅ ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋Š” React์™€ Emotion์ด ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์„œ ๋” ์‹ฌ๊ฐํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์œผ๋กœ, ๋‹น์žฅ์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ค„์ด๊ธฐ

๋‚ด๊ฐ€ ๊ฐ€์žฅ ๋ˆˆ์—ฌ๊ฒจ ๋ณธ ๋ถ€๋ถ„์€ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜€๋‹ค. ๋‹น์‹œ ๊ฐ ์…€์€ ์œ ์ €๊ฐ€ ํฌ์ปค์Šค๋ฅผ ์ฃผ๋ฉด ์ž๊ธฐ ํƒ€์ž…์— ๋งž๋Š” UI๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ๋˜์–ด ์žˆ์—ˆ๋‹ค. ์ฆ‰, focused ์ƒํƒœ์— ํ•ด์•ผ ํ•  ์ผ์„ ์…€์ด ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ ์ €๋Š” ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์…€๋งŒ์„ ํฌ์ปค์Šคํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ชจ๋“  ์…€์€ ์ž๊ธฐ๊ฐ€ ํฌ์ปค์Šค ๋˜์—ˆ์„ ๋•Œ ํ•ด์•ผ ํ•  ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋˜ ์…ˆ์ด๋‹ค.

์ผ๋ฐ˜ ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ๋ผ๋ฉด ์—ฌ๋Ÿฌ ์…€์„ ํฌ์ปค์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ ํ”„๋กœ๋•ํŠธ๋Š” ๋„๋ฉ”์ธ ํŠน์„ฑ์ƒ ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ผ์ด ์—†์—ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๋ถ€๋ถ„์— ์ฐฉ์•ˆํ•ด์„œ ๋ชจ๋“  ์…€์ด ๊ฐ’๋งŒ์„ ํ‘œ์‹œํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๊ณ  ์œ ์ €์˜ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปค์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜๋งŒ ๋‘์–ด ์ด๋ฒคํŠธ ์ˆ˜๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋…ธ๋“œ ๊ฐœ์ˆ˜ ์ค„์ด๊ธฐ

์œ„์˜ ์กฐ์น˜๋กœ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ธด ํ–ˆ์ง€๋งŒ ์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋Š” ์ง€์†์ ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€์™€ ๊ฐœ์„ ์œผ๋กœ ๋ถˆํ•„์š”ํ•œ div๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์•˜๋‹ค. ์…€ ํ•˜๋‚˜ ๋‹น 7~8๊ฐœ์˜ div์š”์†Œ๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์…€ ์ž์ฒด๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค๋ฉด์„œ ์ด ๋ถ€๋ถ„๋„ ์‹ ๊ฒฝ์จ์„œ ๋ชจ๋‘ ์ œ๊ฑฐํ–ˆ๋‹ค.

์ถ”๊ฐ€๋กœ CSS-in-JS์ธ Emotion๋„ ์ œ๊ฑฐํ•˜์˜€๋‹ค. ๋…ธ๋“œ ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค์—ˆ์–ด๋„ ํ…Œ์ด๋ธ” ํŠน์„ฑ์ƒ ๋งค์šฐ ๋งŽ์€ HTML ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š”๋ฐ, CSS-in-JS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์Šคํƒ€์ผ๋ง์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. Emotion์˜ Best Practice ๋ฌธ์„œ์—์„œ๋„ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” styled component ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, ๋ชจ๋“  HTML ์š”์†Œ๋ฅผ ๊ฐ๊ฐ์˜ styled component๋กœ ์ •์˜ํ•˜๊ธฐ๋ณด๋‹ค css selector๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ตํ•ฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ” ๋‚ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ตœ์ƒ์œ„ table ์š”์†Œ์— ๋ชฐ์•„ ๋„ฃ๊ณ , ์ž์‹ ์š”์†Œ๋“ค์€ ๋ชจ๋‘ native HTML element๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

const Table = styled('table')({
   // ...
   ['& > thead']: {
     // ...
@@ -26,11 +26,11 @@
     </Table>
   )
 }
-

์ฒ˜์Œ์—๋Š” ๋งˆํฌ์—…์ด ์ง๊ด€์„ฑ ์—†๊ฒŒ ๋ณด์ผ๊นŒ๋ด ๊ฑฑ์ •์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ, ํ…Œ์ด๋ธ” ๋‚ด์˜ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋กœ์ง์ธ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ์ปค์„œ ๋ ˆ์ด์–ด๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง์„ค์ž„ ์—†์ด ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ์กฐ์น˜๋กœ ์ธํ•ด ์ด๋ชจ์…˜์ด ์ˆ˜ ๋งŽ์€ ์š”์†Œ๋“ค์˜ ์Šคํƒ€์ผ์„ CSS string์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ์ƒ๋žต๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋„ ํ•จ๊ป˜ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ง„์งœ๋กœ ์ข‹์•„์กŒ๋‚˜์š”?

๋ฆฌํŒฉํ† ๋ง ํ›„ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ”„๋กœํŒŒ์ผ๋ง

์ž‘์—… ํ›„ ๋‹ค์‹œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋Œ€์ถฉ ๋ด๋„ ๊ฝค ๋งŽ์ด ์ค„์–ด๋“ค์—ˆ๊ณ , ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ์—์„œ๋„ ๋ฐ˜์‘์ด ์ข‹์•˜๋‹ค. ์šฐ์„  ์ž…๋ ฅ์ด ์•„์˜ˆ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ธ ์‹œํŠธ์—์„œ๋„ ์ž์œ ๋กญ๊ฒŒ ํƒ์ƒ‰๊ณผ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์ธก์ •ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

Profiler API์˜ BaseDuration ๋น„๊ต

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ด์˜๊ฒŒ ์ฐ์„ ์ˆ˜ ์žˆ์—ˆ์„๊นŒ..

๋ฆฌ์•กํŠธ์˜ Profiler API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์ธก์ •์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์—ฌ๋Ÿฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, actualDuration๊ณผ baseDuration์ค‘ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํฌํ•จํ•œ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์ „์ž, ์ œ์™ธํ•œ ์‹œ๊ฐ„์ด ํ›„์ž์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ตœ๋Œ€ํ•œ ์ œ๊ฑฐํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— BaseDuration์„ ์ฝ˜์†”์— ์ฐ์–ด ํ™•์ธํ–ˆ๋‹ค. -์‚ฌ์ง„์˜ ์™ผ์ชฝ์ด ๋น„ํฌ, ์˜ค๋ฅธ์ชฝ์ด ์• ํ”„ํ„ฐ์ด๋‹ค. ๋น„๊ตํ•ด ๋ณด๋‹ˆ ๋ฆฌํŒฉํ† ๋ง ํ›„ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์•ฝ 78%์ •๋„ ์ค„์–ด๋“ค์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ปฅ ์ข€ ๋ณดํƒœ์„œ 5๋ฐฐ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ!?

๋งˆ์น˜๋ฉฐ

์•ž์„œ ๋งํ–ˆ๋“ฏ ๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ์„ฑ๋Šฅ๋ณด๋‹จ ๊ฐœ๋ฐœ ๊ฒฝํ—˜๊ณผ ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ์—๋งŒ ์ง‘์ค‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ์ค„์€ ์ƒ๊ฐ๋„ ๋ชปํ–ˆ๋‹ค. ์•„๋ฌดํŠผ ์‹ ์ž… ๊ฐœ๋ฐœ์ž์˜ ๋งˆ์ธ๋“œ(๋‹น์‹œ 4๋‹ฌ์ฐจ)๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋งˆ๊ตฌ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๋ฆฌ์„œ์น˜๋ถ€ํ„ฐ ๊ฐœ์„  ๋ฐฉ์•ˆ๊นŒ์ง€ ์—ด์‹ฌํžˆ ์ค€๋น„ํ•ด์„œ ํŒ€์›๋“ค์—๊ฒŒ ๊ณต์œ ํ–ˆ๊ณ , ํŒ€์›๋“ค๋„ ๋„ˆ๋ฌด ๊ธ์ •์ ์œผ๋กœ ํ•จ๊ป˜ ํ•ด ์ฃผ์–ด์„œ ๋„ˆ๋ฌด ๊ท€์ค‘ํ•œ ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Refs.

 ยฉ 2024 PrayinforRain. +

์ฒ˜์Œ์—๋Š” ๋งˆํฌ์—…์ด ์ง๊ด€์„ฑ ์—†๊ฒŒ ๋ณด์ผ๊นŒ๋ด ๊ฑฑ์ •์„ ๋งŽ์ด ํ–ˆ๋Š”๋ฐ, ํ…Œ์ด๋ธ” ๋‚ด์˜ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋กœ์ง์ธ ์‚ฌ์šฉ์ž์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด ์ปค์„œ ๋ ˆ์ด์–ด๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ง์„ค์ž„ ์—†์ด ์Šคํƒ€์ผ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด ์กฐ์น˜๋กœ ์ธํ•ด ์ด๋ชจ์…˜์ด ์ˆ˜ ๋งŽ์€ ์š”์†Œ๋“ค์˜ ์Šคํƒ€์ผ์„ CSS string์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ์ƒ๋žต๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋„ ํ•จ๊ป˜ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ง„์งœ๋กœ ์ข‹์•„์กŒ๋‚˜์š”?

๋ฆฌํŒฉํ† ๋ง ํ›„ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ”„๋กœํŒŒ์ผ๋ง

์ž‘์—… ํ›„ ๋‹ค์‹œ ํ”„๋กœํŒŒ์ผ๋ง์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๋Œ€์ถฉ ๋ด๋„ ๊ฝค ๋งŽ์ด ์ค„์–ด๋“ค์—ˆ๊ณ , ๋‚ด๋ถ€ ํ…Œ์ŠคํŠธ์—์„œ๋„ ๋ฐ˜์‘์ด ์ข‹์•˜๋‹ค. ์šฐ์„  ์ž…๋ ฅ์ด ์•„์˜ˆ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ธ ์‹œํŠธ์—์„œ๋„ ์ž์œ ๋กญ๊ฒŒ ํƒ์ƒ‰๊ณผ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์ธก์ •ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?

Profiler API์˜ BaseDuration ๋น„๊ต

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ์ด์˜๊ฒŒ ์ฐ์„ ์ˆ˜ ์žˆ์—ˆ์„๊นŒ..

๋ฆฌ์•กํŠธ์˜ Profiler API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ์ธก์ •์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ์—ฌ๋Ÿฌ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, actualDuration๊ณผ baseDuration์ค‘ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ํฌํ•จํ•œ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์ „์ž, ์ œ์™ธํ•œ ์‹œ๊ฐ„์ด ํ›„์ž์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ ์ž‘์—…์„ ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ตœ๋Œ€ํ•œ ์ œ๊ฑฐํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— BaseDuration์„ ์ฝ˜์†”์— ์ฐ์–ด ํ™•์ธํ–ˆ๋‹ค. +์‚ฌ์ง„์˜ ์™ผ์ชฝ์ด ๋น„ํฌ, ์˜ค๋ฅธ์ชฝ์ด ์• ํ”„ํ„ฐ์ด๋‹ค. ๋น„๊ตํ•ด ๋ณด๋‹ˆ ๋ฆฌํŒฉํ† ๋ง ํ›„ ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ์•ฝ 78%์ •๋„ ์ค„์–ด๋“ค์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ปฅ ์ข€ ๋ณดํƒœ์„œ 5๋ฐฐ ๋นจ๋ผ์กŒ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ!?

๋งˆ์น˜๋ฉฐ

์•ž์„œ ๋งํ–ˆ๋“ฏ ๋‚˜๋Š” ๊ณ„์†ํ•ด์„œ ์„ฑ๋Šฅ๋ณด๋‹จ ๊ฐœ๋ฐœ ๊ฒฝํ—˜๊ณผ ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ์—๋งŒ ์ง‘์ค‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚  ์ค„์€ ์ƒ๊ฐ๋„ ๋ชปํ–ˆ๋‹ค. ์•„๋ฌดํŠผ ์‹ ์ž… ๊ฐœ๋ฐœ์ž์˜ ๋งˆ์ธ๋“œ(๋‹น์‹œ 4๋‹ฌ์ฐจ)๋กœ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๋งˆ๊ตฌ ์‹œ๋„ํ•˜๊ณ  ์‹ถ์€ ๋งˆ์Œ์— ๋ฆฌ์„œ์น˜๋ถ€ํ„ฐ ๊ฐœ์„  ๋ฐฉ์•ˆ๊นŒ์ง€ ์—ด์‹ฌํžˆ ์ค€๋น„ํ•ด์„œ ํŒ€์›๋“ค์—๊ฒŒ ๊ณต์œ ํ–ˆ๊ณ , ํŒ€์›๋“ค๋„ ๋„ˆ๋ฌด ๊ธ์ •์ ์œผ๋กœ ํ•จ๊ป˜ ํ•ด ์ฃผ์–ด์„œ ๋„ˆ๋ฌด ๊ท€์ค‘ํ•œ ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

Refs.

+Hugo.
\ No newline at end of file diff --git a/posts/2024/07/site-optimization/index.html b/posts/2024/07/site-optimization/index.html new file mode 100644 index 0000000..446fbe8 --- /dev/null +++ b/posts/2024/07/site-optimization/index.html @@ -0,0 +1,32 @@ +Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ | PrayinForRain.dev +

Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐ

Table of Contents

Next.js๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ ์ฃผ์–ด์ง€๋Š” React๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋œ ์ฐจ์ด์ ์€ ๋ผ์šฐํŒ…์ด๋‚˜, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋“ฑ์˜ ์บก์Šํ™”๋„ ์žˆ๊ณ , ๋งํฌ, ์ด๋ฏธ์ง€ ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๋“ค์— ๋Œ€ํ•œ ์ตœ์ ํ™”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๊ฐ€๋” ์—ฌ๊ธฐ ํฌํ•จ๋œ ๋กœ์ง์„ ์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ํšŒ์‚ฌ์—์„œ ์žˆ์—ˆ๋˜ ์ผ์ธ๋ฐ, ์ด ๊ณผ์ •์—์„œ Next.js์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด์„œ ๊ฝค ์†Œ์ค‘ํ•œ ๊ฒฝํ—˜์„ ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ธฐ๋ก์œผ๋กœ ๋‚จ๊ฒจ๋†“๋Š”๋‹ค.

Next.js๋Š” ๋‚ด๋ถ€ ๋งํฌ์— ๊ธฐ๋ณธ anchor ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” next/link๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๋งํฌ๋กœ ๋‚ด๋ถ€ ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ์ด๋™์‹œ ๋งˆ๋‹ค ์ „์ฒด ์•ฑ์„ ์ƒˆ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ ์™ธ์—๋„ ์ด๋Ÿฐ์ €๋Ÿฐ ์ตœ์ ํ™”๋ฅผ ํ•ด ์ฃผ๊ธด ํ•˜๋Š”๋ฐ, ๊ทธ๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค. ์ด ๋™์ž‘์€ next/router์˜ router.push ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ƒฅ router.push ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๋Š”๊ฑธ๊นŒ?

์š” ๋ฌธ์ œ๋Š” SEO์™€ ์—ฐ๊ฒฐ๋˜๋Š”๋ฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒ€์ƒ‰ ์—”์ง„์€ ํŽ˜์ด์ง€์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ anchor tag์˜ href ์†์„ฑ์„ ํ†ตํ•ด ํŒŒ์•…ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ onClick ํ•ธ๋“ค๋Ÿฌ์— router.push๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๊ฒ€์ƒ‰ ์—”์ง„์€ ๋‘ ํŽ˜์ด์ง€์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ next/link๊ฐ€ ํ•ด์ฃผ๋Š” ์ผ์€ ํ•˜๋‚˜ ๋” ์žˆ๋‹ค. next/link ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€ ๋งํฌ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŽ˜์ด์ง€์˜ props๋ฅผ ๋ฏธ๋ฆฌ prefetchํ•ด์˜จ๋‹ค. ์ด ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๋™์ž‘ํ•œ๋‹ค.

  • ๋งํฌ ์š”์†Œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € viewport์— ๋ณด์ผ ๋•Œ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ ์š”์†Œ์— hoverํ–ˆ์„ ๋•Œ

next/link์—์„œ๋Š” prefetch prop์„ ํ†ตํ•ด ์ด ๋™์ž‘์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์ง€๋งŒ, hover์‹œ prefetch๋Š” ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฌธ์„œ์—์„œ๋Š” ์ด ๋ถ€๋ถ„๊นŒ์ง€ ์ œ์–ดํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง์ ‘ ๊ตฌํ˜„, ํ˜น์€ App router๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ฐพ๊ธฐ ์–ด๋ ค์› ๋Š”๋ฐ, ํŠธ๋ž˜ํ”ฝ์„ ๋Š˜๋ ค Vercel์˜ ์„œ๋ฒ„ ํ˜ธ์ŠคํŒ… ์ˆ˜์ต์„ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•จ์ด๋ผ๋Š” ์ถ”์ธก์ด ๊ฐ€์žฅ ์ธ์ƒ๊นŠ์—ˆ๋‹ค. (ํŒฉํŠธ๋ผ๋Š” ์–˜๊ธฐ๋Š” ์•„๋‹˜)

์ด prefetch ๋™์ž‘์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด, ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜์ง€ ์•Š์€ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋“œ๋ฅด๋ฅด๋ฅต ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์—ˆ๊ณ , ๋ฌด์—‡๋ณด๋‹ค prefetch์˜ ๊ธฐ๋ณธ๊ฐ’์ด true์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ด ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ์ด ์ž‘์—…ํ•˜๋ฉด ํŽ˜์ด์ง€์— ๋งํฌ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ(์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด๋‚˜ ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ) ๋ถˆํ•„์š”ํ•œ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ž˜์„œ! ๋งํฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๋งํฌ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋Šฅ๋“ค์„ ๋‚˜์—ดํ–ˆ๋‹ค.

  • router.push๋ฅผ ํ†ตํ•ด ์ตœ์ ํ™”๋œ ํŽ˜์ด์ง€ ์ด๋™์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•จ
  • ์ปค๋งจ๋“œ ํด๋ฆญ, ํœ  ํด๋ฆญ(์ƒˆ ํƒญ์—์„œ ์—ด๊ธฐ) ๋“ฑ์— ๋Œ€ํ•œ ๋™์ž‘์„ native์ฒ˜๋Ÿผ ์ง€์›ํ•ด์•ผ ํ•จ
  • ์™ธ๋ถ€ ๋งํฌ์˜ ๊ฒฝ์šฐ target="_blank"๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ
  • as prop์„ ์ง€์›ํ•ด์•ผ ํ•จ; ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • ๊ตฌํ˜„ํ•œ ๋งํฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ next/link์˜ ์‚ฌ์šฉ์„ ๊ฒฝ๊ณ  ๋˜๋Š” ์—๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ฐฉ์ง€ํ•ด์•ผ ํ•จ
  • ๊ธฐ์กด next/link ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋Œ€์ฒดํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์—†์–ด์•ผ ํ•จ(๋ณ„๋„์˜ wrapper๋‚˜ a tag๋ฅผ ์ถ”๊ฐ€ ๋˜๋Š” ์ œ๊ฑฐํ•  ํ•„์š”๊ฐ€ ์—†์–ด์•ผ ํ•จ)

๊ทธ ์ดํ›„์—๋Š” ๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž์ถฐ์„œ ๊ตฌํ˜„์„ ํ–ˆ๋‹ค. next/link ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ฐธ๊ณ ํ–ˆ๋‹ค. href prop์œผ๋กœ ์ œ๊ณต๋œ ์ฃผ์†Œ๊ฐ€ ๋‚ด๋ถ€ ๋งํฌ์ธ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ฑฐ๋‚˜, ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๋“ฑ์˜ ์™ธ๋ถ€ ๋กœ์ง๋“ค์ด ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ฑฐ๋‚˜ ํ™œ์šฉํ•˜๊ธฐ ๋งค์šฐ ํŽธํ–ˆ๋‹ค.

์•„๋ฌดํŠผ ์ด๋ฏธ์ง€๋ฅผ ์ตœ์ ํ™”ํ•˜์ž

๊ทธ ๋‹ค์Œ ์ฐจ๋ก€๋Š” next/image๋‹ค. next/image๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉ์ฒ˜์— ๋งž๋Š” ํฌ๊ธฐ๋กœ ์ตœ์ ํ™”ํ•˜์—ฌ ์ œ๊ณตํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๊ฝค ์ž˜ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด ๋™์ž‘์„ ์œ„ํ•ด ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ์ •๋œ ์ˆซ์ž๋กœ ์š”๊ตฌํ•˜๋Š”๋ฐ, ์ด ๊ฒƒ์ด ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋‚˜ ๋””์ž์ด๋„ˆ๊ฐ€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ œ์•ฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ตœ์ ํ™”๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์šฐ๋ฆฌ ํ”„๋กœ๋•ํŠธ์˜ ๊ฒฝ์šฐ์—๋„ ๋ฐ˜์‘ํ˜• ๋ ˆ์ด์•„์›ƒ์„ ์œ„ํ•ด ๋„ˆ๋น„๋‚˜ ๋†’์ด๋ฅผ [64, 128]๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋„ฃ์œผ๋ฉด ์ „์—ญ์œผ๋กœ ์ •์˜ํ•ด๋‘” breakpoint ๊ธฐ์ค€์œผ๋กœ ์•Œ์•„์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š”๋ฐ, ์ด ๋ฌธ์ œ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.
์ด๋ฏธ์ง€ ํ”„๋ก์‹œ ์™ธ์— next/image๊ฐ€ ์ง„ํ–‰ํ•˜๋Š” ์ตœ์ ํ™”๋Š” lazy loading๊ณผ mdn์˜ ๋ฐ˜์‘ํ˜• ์ด๋ฏธ์ง€ ์ž์Šต์„œ์— ๋‚˜์™€ ์žˆ๋Š” ๊ฒƒ๋“ค์ธ๋ฐ, next/image ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด๊ธฐ๋ณด๋‹ค ์ด๊ฑธ ๋จผ์ € ์ฝ์œผ๋ฉด ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค.

์‚ฌ์‹ค ์ด๋ฏธ์ง€๋Š” ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด์— ๋ถˆ๋งŒ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์•„์ดํฐ์—์„œ ํŽธ์ง‘๋œ ์‚ฌ์ง„(.heic) ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๊ณตํ†ตํ™”ํ•  ํ•„์š”๋„ ์žˆ์—ˆ๊ณ , alt ์†์„ฑ ๊ธฐ๋ณธ๊ฐ’ ์ง€์ •์ด๋‚˜ ํ”„๋ก์‹œ๋ฅผ ํƒœ์šธ ์ˆ˜ ์—†๋Š” ์™ธ๋ถ€ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋“ฑ๋“ฑ.. ์„ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ชฝ๋„ ์ˆ˜์ •ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ˆ˜์ •์€ ์•„๋‹ˆ๊ณ , next/image ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ์ˆ˜์ •๊ณผ ํ•จ๊ป˜ wrappingํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด ๋งž๊ฒ ๋‹ค.

์ด๋ฏธ์ง€๋„ ๋งํฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •๋ฆฌํ–ˆ๋‹ค.

  • alt ์†์„ฑ์˜ ๊ธฐ๋ณธ๊ฐ’์„ ""๋กœ ์ œ๊ณตํ•ด์•ผ ํ•จ
  • ํ”„๋ก์‹œ๋ฅผ ํƒœ์šธ ์ˆ˜ ์—†๋Š” ์ด๋ฏธ์ง€์— ๋Œ€ํ•ด ์—๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ์›๋ณธ URL๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•จ
  • heic ํฌ๋งท์˜ ์‚ฌ์ง„์ธ ๊ฒฝ์šฐ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ณด์—ฌ์ค˜์•ผ ํ•จ
  • styled-system์œผ๋กœ ๊ตฌํ˜„๋œ ์Šคํƒ€์ผ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ˜์‘ํ˜• width, height prop์„ ์ง€์›ํ•ด์•ผ ํ•จ (์ˆซ์ž ๋ฐฐ์—ด)

์—ฌ๊ธฐ์„œ ํ”„๋ก์‹œ๋ฅผ ํƒœ์šธ ์ˆ˜ ์—†๋Š” ์ด๋ฏธ์ง€๋ž€, next.config.js์—์„œ ์ง€์ •ํ•˜์ง€ ์•Š์€ URL์ด ์ œ๊ณตํ•˜๋Š” ์™ธ๋ถ€ ์ด๋ฏธ์ง€๋ฅผ ๋œปํ•œ๋‹ค. ๋ชจ๋“  URL์„ ํ—ˆ์šฉํ•˜๋„๋ก ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ, ์œ„ํ—˜ํ•œ URL์ด ํ—ˆ์šฉ๋˜๊ฑฐ๋‚˜ ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์บ์‹œ ์ž์›์„ ์‚ฌ์šฉํ•  ์šฐ๋ ค๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค.
์•„๋ฌดํŠผ next.config.js์—์„œ ํ—ˆ์šฉํ•œ ๋„๋ฉ”์ธ์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” src๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒฝ์šฐ, unoptimized prop์— true๋ฅผ ์ฃผ๋ฉด ์ตœ์ ํ™” ๋กœ์ง์„ ํŒจ์Šคํ•˜๊ณ  ์ด๋ฏธ์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋…€์„๋“ค๋งŒ ๊ณจ๋ผ์„œ ํ”„๋ก์‹œ๋ฅผ ํƒœ์šธ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฏธ์ง€ ์ž‘์—…์„ ํ•˜๋ฉด์„œ next/image ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์— ๋Œ€ํ•ด ์•„์ฃผ ์ž˜ ์ •๋ฆฌํ•œ ์˜ฌ๋ฆฌ๋ธŒ์˜ ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ์•„์ฃผ ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์˜ฌ๋ฆฌ๋ธŒ์˜์— ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ๊ฐ€ ์ž˜ ์šด์˜๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋„, Next.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋„ ์˜์™ธ์˜€๋Š”๋ฐ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ์ข‹์•„์„œ ๊ธฐ์–ต์— ๋‚จ์•˜์Œ..

์–ผ๋งˆ๋‚˜ ๋ณ€ํ–ˆ์„๊นŒ?

๋งํฌ์™€ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์›๋ž˜๋ณด๋‹ค ๋” ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋งˆ์Œ์ด ๋งŽ์ด ์•„ํ”Œ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ผ๋งˆ๋‚˜ ๋ณ€ํ–ˆ๋Š”์ง€ ํ•œ๋ฒˆ ์ธก์ •ํ•ด ๋ณด์•˜๋‹ค. ์ธก์ • ๋ฐฉ๋ฒ•์€ ํŽ˜์ด์ง€๋ฅผ ๊ฐ•๋ ฅ ์ƒˆ๋กœ๊ณ ์นจ ํ›„, ๋„คํŠธ์›Œํฌ ํƒญ์— ์ฐํžˆ๋Š” transferred ์šฉ๋Ÿ‰์„ ํ™•์ธํ•˜์˜€๋‹ค.

payload ํฌ๊ธฐ ๋น„๊ต

์™ผ์ชฝ์ด ์ตœ์ ํ™” ์ „, ์˜ค๋ฅธ์ชฝ์ด ์ตœ์ ํ™” ํ›„ payload์ด๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ๋•ํŠธ์˜ ์ฝ˜ํ…์ธ  ํ•˜๋‚˜์— ๋Œ€ํ•œ ๋น„ํฌ/์• ํ”„ํ„ฐ๋ฅผ ์ธก์ •ํ•ด ๋ณด์•˜๋‹ค. ์šฐ์„  ๋งํฌ์˜ preload ๊ธฐ๋Šฅ์„ ๋น„ํ™œ์„ฑํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๋Ÿฌ์˜ค๋Š” page props ์ž์ฒด๋„ ๋งŽ์ด ์ค„์—ˆ๊ณ (์‚ฌ์‹ค ์ด ์šฉ๋Ÿ‰ ์ž์ฒด๊ฐ€ ํฐ ๊ฒƒ๋„ ๋ฌธ์ œ์ง€๋งŒ), ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉ์ฒ˜ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ตœ์ ํ™”ํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰ ์ž์ฒด๋„ ํ™• ์ค„์—ˆ๋‹ค. ์ „๋ฐ˜์ ์ธ payload ํฌ๊ธฐ ๋น„๊ต ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

ํŽ˜์ด์ง€beforeafter๋ณ€ํ™”
์ฝ˜ํ…์ธ  ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€3.7MB689KB-81%
์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€ 12.0MB878KB-57%
์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€ 22.2MB873KB-61%

๋งํฌ์™€ ์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐ€๋Š” ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ๊ฐ€์žฅ ํฐ ์šฉ๋Ÿ‰ ์ฐจ์ด๋ฅผ ๋ณด์˜€๊ณ , ์ถ”๊ฐ€๋กœ lighthouse ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ 100์ ์ด ๋‚˜์˜ค๋Š” ๋ถ€์ˆ˜์ ์ธ ๊ฒฝ์‚ฌ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ์ฝ˜์†”์—์„œ๋„ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๋“ค์€ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ๋Š”๋ฐ(์ „์ฒด ํŽ˜์ด์ง€์˜ ์•ฝ 1/3), ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์ง„ ํ›„ 2๋‹ฌ๊ฐ„ ์ด๋Ÿฐ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ๋„ ํ–ˆ๋‹ค. ์ด์ •๋„๋ฉด ์œ ์˜๋ฏธํ•œ ๊ฐœ์„ ์ด์—ˆ๋‹ค๊ณ  ๋ด๋„ ๋  ๊ฒƒ ๊ฐ™์•„ ์•ˆ์‹ฌํ–ˆ๋‹ค.

lighthouse ์„ฑ๋Šฅ ์ง€ํ‘œ

๋ฐ˜๋…„ ์ „์—” ์ €๊ฒŒ 58์ ์ด์—ˆ๋Š”๋ฐ…

๋งŒ๋“  ๊ฒƒ์„ ์“ฐ๋„๋ก ๊ฐ•์ œํ•˜์ž

๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž๋ถ„์ด ์˜ค์…”์„œ ์ž‘์—…์„ ํ•˜์‹œ๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ž‘์€ ๊ทœ๋ชจ๋Š” ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฏธ์ง€์™€ ๋งํฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๋Œ€๋กœ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด Next.js์—์„œ ์ œ๊ณตํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜์‚ฌ์ ์œผ๋กœ ์‚ฌ์šฉํ• ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ๋ฐฉ์ฑ…์„ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ESLint ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. no-restricted-imports ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

// .eslintrc
+
+// ...
+    "no-restricted-imports": [
+      "warn",
+      {
+        "paths": [
+          {
+            "name": "next/image",
+            "importNames": ["default"],
+            "message": "@/atoms/Image ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”."
+          },
+          {
+            "name": "next/link",
+            "importNames": ["default"],
+            "message": "@/atoms/Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”."
+          },
+        ]
+      }
+    ]
+// ...
+

๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ warn์ด ์•„๋‹ˆ๋ผ error๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ์•„๋‹Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, layout="fill"์„ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ๋ ˆ๊ฑฐ์‹œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์–ด์„œ ๊ฒฝ๊ณ ๋กœ๋งŒ ์ •์˜ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์•„์˜ˆ ๊ฐ•์ œํ•˜๋Š”๊ฒŒ ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ŠคํŽ™์ด ์–ด๋””์—๋„ ๋‚จ์•„์žˆ์ง€ ์•Š๊ณ , “์ด๋Ÿฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค!” ๋ผ๊ณ ๋งŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

์—„์ฒญ ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ์‚ฌ์ดํŠธ

ํŽ˜์ด์ง€์˜ ์šฉ๋Ÿ‰์ด ์ค„์–ด๋“ค๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์„๊นŒ? ์šฐ์„  ํŠธ๋ž˜ํ”ฝ์ด ๊ฐ์†Œํ•˜๋‹ˆ ๋น„์šฉ ์ธก๋ฉด์—์„œ๋„ ์ด๋“์ผํ…Œ๊ณ , ์šฉ๋Ÿ‰์ด ์ž‘์€ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด ๋‹น์—ฐํžˆ ๋ธŒ๋ผ์šฐ์ง• ๊ฒฝํ—˜๋„ ์ข‹์•„์งˆํ…Œ๊ณ , ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํœด๋Œ€ํฐ ์š”๊ธˆ์ œ๋ฅผ ์ž‘์€๊ฑธ ์“ฐ๊ณ  ์žˆ์–ด์„œ(!) ์šฐ๋ฆฌ ํ”„๋กœ๋•ํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฝ˜ํ…์ธ ์— ๋น„ํ•ด ๋„ˆ๋ฌด ๋ฌด๊ฒ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ณ„์† ๊ฐ–๊ณ  ์žˆ์—ˆ๋‹ค.

์—„์ฒญ ์‚ฌ์†Œํ•˜๊ณ  ๊ฐœ์ธ์ ์ธ ๋™๊ธฐ๋กœ ์‹œ์ž‘ํ•œ ์ตœ์ ํ™”๊ธด ํ•˜์ง€๋งŒ, ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ SEO์—์„œ์˜ ์ด์ ์ด๋‹ค. ๊ตฌ๊ธ€์—์„œ๋Š” ์‚ฌ์ดํŠธ ํƒ์ƒ‰ ๊ฒฝํ—˜์ด ์ข‹์€ ์‚ฌ์ดํŠธ์— ๊ฒ€์ƒ‰ ๋…ธ์ถœ์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„ ๋ณด์ƒ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ํ•ด์˜ค๊ณ  ์žˆ๋‹ค. ๋ฌผ๋ก  ์ตœ๊ทผ ๋ฐํ˜€์ง€๋Š” ์‹คํ—˜๊ณผ ๋ฌธ์„œ๋“ค์—์„œ ๋‹ค๋ฅธ ํฐ ์š”์ธ๋“ค์ด ๋Œ€๋‘๋˜๊ณ  ์žˆ๊ธด ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•˜๋ฉด์„œ๋„ ์œ ์ž… ์œ ์ € ์ˆ˜์—๋„ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ฐ€์žฅ ์˜๋ฏธ๊ฐ€ ํฐ ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์„ ํ•ด๋ณธ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž‘์—… ๊ณผ์ •์—์„œ Next.js์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ฝ์–ด๋ณธ ๊ฒฝํ—˜์ด ๋œป๊นŠ์—ˆ๋‹ค. ์ด ์ •๋„ ๊ทœ๋ชจ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋‚ด๊ฐ€ ์ฝ๋Š”๋‹ค๊ณ  ๋ญ๊ฐ€ ๋˜๋‚˜..? ํ•˜๋Š” ๋งˆ์Œ์œผ๋กœ ์‹œ์ž‘ํ–ˆ๋Š”๋ฐ, ๋‚ด ๊ฑฑ์ •๋ณด๋‹ค ํ›จ์”ฌ ์‰ฌ์› ๊ณ , ๋งŽ์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. +๋ฌผ๋ก  ๊ธฐ์กด ๋™์ž‘์— ๋Œ€ํ•ด ์–ด๋Š์ •๋„ ์•Œ๊ณ  ์žˆ๊ณ  - ์ด ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์ง€ํ–ฅ์ (์›น ํ‘œ์ค€, ์ตœ์ ํ™” ๋“ฑ)์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•œ ์ƒํƒœ์—์„œ ์ฝ”๋“œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ Next.js์˜ ์ฝ”๋“œ ์ž์ฒด๋„ ์ฝ๊ธฐ ํŽธํ•˜๊ฒŒ ์ž‘์„ฑ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ–ˆ๋˜ ์ผ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์Šคํ„ฐ๋””์—์„œ ์ฝ์—ˆ๋˜ ํด๋ฆฐ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ๋“ค์ด ์˜ค๋ฒ„๋žฉ๋˜๋ฉด์„œ ์ด๋Ÿฐ ์‹์œผ๋กœ ์‹ค์ œ ์ฝ”๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ตฌ๋‚˜ ๋Š๋ผ๋ฉด์„œ ์ฆ๊ฑฐ์šด ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋‹ค.

์ž‘์„ฑํ•œ ๋งํฌ / ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ์˜ ์ฝ”๋“œ๋Š” ์ง€๊ธˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ์—ฎ์—ฌ ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ์ •๋ฆฌํ•ด์„œ gist๊ฐ™์€ ๊ณณ์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

Refs.

+ \ No newline at end of file diff --git a/posts/index.html b/posts/index.html index ca9cf03..efe5297 100644 --- a/posts/index.html +++ b/posts/index.html @@ -1,10 +1,10 @@ Posts | PrayinForRain.dev -

Posts

2024

2023

2022

+Hugo. \ No newline at end of file diff --git a/posts/index.xml b/posts/index.xml index dfc70b5..d42d10f 100644 --- a/posts/index.xml +++ b/posts/index.xml @@ -1,41 +1,156 @@ -Posts on PrayinForRain.devhttps://prayinforrain.github.io/posts/Recent content in Posts on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„ ์ตœ๊ทผ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ Yarn berry๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  node_modules ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค. -ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค.๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค. -๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค.๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค.VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this.Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. -๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. -์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout) ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint) ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ .๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. [์›๋ณธ ๋งํฌ] -๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค.. -๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” ๋ชจํ—ค์œฐ์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. [์—ฌ๊ธฐ]์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/๋ชจํ—ค์œฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ Next.js๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” NestJS๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, SSR์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”. -๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ memoization์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ Next.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. GFM(GitHub Flavored Markdown)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ? -๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค. -๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค.Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Posts on PrayinForRain.devhttps://prayinforrain.github.io/posts/Recent content in Posts on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐhttps://prayinforrain.github.io/posts/2024/07/site-optimization/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/posts/2024/07/site-optimization/์ตœ๋Œ€ํ•œ ๊ฐ€๋ฒผ์šด ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/<h2 id="๋‚ด-๋ ˆํฌ์˜-์œ„ํ—˜ํ•œ-๋…€์„">๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/05/exploring-yarn-berry/01.png" alt="cds issue"></p> +<p>์ตœ๊ทผ <a href="https://github.com/c-h-w-h/cds">์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)</a>์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ <strong>Yarn berry</strong>๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  <code>node_modules</code> ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— <code>node_modules</code>์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค.</p> +<p>ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/<h2 id="์‹œ์ž‘ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/04/numble-talk/01.png" alt="ui design"></p> +<p>3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.</p> +<p>๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..</p>๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p>VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p>Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p>Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p>Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/<p>์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</p> +<h2 id="๋ธ”๋กœ๊ทธ๋ฅผ-์ด์ „ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><figure><img src="https://prayinforrain.github.io/images/posts/2023/01/migrating-to-hugo/01.png" + alt="image"><figcaption> + <p>์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..</p>Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p>CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/<h2 id="๋ธŒ๋ผ์šฐ์ €-๋ Œ๋”๋ง">๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง</h2> +<p>์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/browser-rendering-performance/01.png" alt="Untitled"></p> +<ul> +<li>์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</li> +<li>Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)</li> +<li>๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)</li> +<li>์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด <code>Reflow</code>๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +<ul> +<li>Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ <strong>๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +<li>๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)</li> +<li>๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ <strong>Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<iframe width="560" height="315" src="https://www.youtube.com/embed/TZz9VHjJzMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> +<p>์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ <code>will-change</code>๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p>๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/<blockquote> +<p>ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. <a href="https://prayinforrain.tistory.com/80">[์›๋ณธ ๋งํฌ]</a></p> +</blockquote> +<figure><img src="https://prayinforrain.github.io/images/posts/2022/12/finishing-moheyum/moheyum_01.png" + alt="image"><figcaption> + <p>๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค..</p> + </figcaption> +</figure> + +<p>๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” <strong>๋ชจํ—ค์œฐ</strong>์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. <a href="https://youtu.be/9mVinynuUTw">[์—ฌ๊ธฐ]</a>์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.</p>์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ <code>Next.js</code>๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” <code>NestJS</code>๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, <code>SSR</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”.</p> +<p>๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ <code>memoization</code>์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ <a href="https://www.notion.so/next-js-13-app-dir-11191a66a5564a25ba882c8a835afd13">Next.js 13์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ–ˆ๋˜</a> ์•„ํ”ˆ ์ƒ์ฒ˜๋ฅผ ์ž๊ทนํ•˜๊ณ  ์žˆ์–ด์„œ ๋ชจํ—ค์œฐ์—๋„ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-์–ด๋–ป๊ฒŒ-ํ• ๊นŒ์š”">๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?</h2> +<p>์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. <a href="https://github.github.com/gfm/">GFM(GitHub Flavored Markdown)</a>์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•„๋ฌด ์ด์Šˆ๋‚˜ ๋“ค์–ด๊ฐ€์„œ ๋Œ“๊ธ€ ์ฐฝ์— ์‹คํ—˜์„ ํ•˜๋ฉด์„œ์š”.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ?</p> +<blockquote> +<p>๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” <code>๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›</code>์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.</p> +<p>๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.</p>Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p>Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index fb8897e..f3fc156 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://prayinforrain.github.io/categories/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/posts/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/project/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/react/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/categories/web/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/posts/2023/11/cell-refactoring/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/cds/2023-08-14T00:54:02+09:00https://prayinforrain.github.io/posts/2023/06/cds-retrospect/2023-08-14T00:54:02+09:00https://prayinforrain.github.io/categories/node.js/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/tags/yarn/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/tags/nextjs/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/tags/pnp/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/tags/storybook/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/categories/life/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/tags/numble/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/posts/2023/04/numble-talk/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/tags/algorithm/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/categories/algorithm/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/baekjoon/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/javascript/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/nodejs/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/ps/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/categories/ide/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/macos/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/npm/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/nvm/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/vscode/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/firebase/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/categories/typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/web/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/generic/2023-02-01T02:01:15+09:00https://prayinforrain.github.io/posts/2023/02/typescript-generic/2023-02-01T02:01:15+09:00https://prayinforrain.github.io/tags/blog/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/tags/hugo/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/categories/javascript/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/posts/2023/01/tree-shaking/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/tags/tree-shaking/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/tags/ecmascript/2023-01-25T16:35:01+09:00https://prayinforrain.github.io/posts/2023/01/ecmascript/2023-01-25T16:35:01+09:00https://prayinforrain.github.io/tags/browser/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/tags/css/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/categories/css/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/css-display/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/size-units-in-css/2023-01-13T23:39:15+09:00https://prayinforrain.github.io/about/2023-05-04T01:48:16+09:00https://prayinforrain.github.io/tags/moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/categories/moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/2022-12-06T02:11:55+09:00https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/2022-12-05T13:18:55+09:00https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/2022-11-24T00:53:55+09:00https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/2022-11-22T20:36:55+09:00https://prayinforrain.github.io/tags/css-in-js/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/emotion/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/emotion/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/pnpm/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/categories/react/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/recoil/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/redux/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/2022-11-18T16:42:55+09:00 \ No newline at end of file +https://prayinforrain.github.io/categories/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/posts/2024/07/site-optimization/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/tags/nextjs/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/posts/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/tags/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/categories/web/2024-07-18T12:34:32+09:00https://prayinforrain.github.io/tags/project/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/react/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/posts/2023/11/cell-refactoring/2024-04-15T16:43:32+09:00https://prayinforrain.github.io/tags/cds/2023-08-14T00:54:02+09:00https://prayinforrain.github.io/posts/2023/06/cds-retrospect/2023-08-14T00:54:02+09:00https://prayinforrain.github.io/categories/node.js/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/tags/yarn/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/2023-05-30T02:27:49+09:00https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/tags/pnp/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/tags/storybook/2023-04-27T15:32:50+09:00https://prayinforrain.github.io/categories/life/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/tags/numble/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/posts/2023/04/numble-talk/2023-04-23T04:05:58+09:00https://prayinforrain.github.io/tags/algorithm/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/categories/algorithm/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/baekjoon/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/javascript/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/nodejs/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/tags/ps/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/2023-03-30T15:17:00+09:00https://prayinforrain.github.io/categories/ide/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/macos/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/npm/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/nvm/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/vscode/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/2023-03-29T15:17:00+09:00https://prayinforrain.github.io/tags/firebase/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/categories/typescript/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/web/2023-02-15T15:17:00+09:00https://prayinforrain.github.io/tags/generic/2023-02-01T02:01:15+09:00https://prayinforrain.github.io/posts/2023/02/typescript-generic/2023-02-01T02:01:15+09:00https://prayinforrain.github.io/tags/blog/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/tags/hugo/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/2023-01-30T19:17:55+09:00https://prayinforrain.github.io/categories/javascript/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/posts/2023/01/tree-shaking/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/tags/tree-shaking/2023-01-25T17:17:15+09:00https://prayinforrain.github.io/tags/ecmascript/2023-01-25T16:35:01+09:00https://prayinforrain.github.io/posts/2023/01/ecmascript/2023-01-25T16:35:01+09:00https://prayinforrain.github.io/tags/browser/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/tags/css/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/categories/css/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/css-display/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/2023-01-16T16:38:15+09:00https://prayinforrain.github.io/posts/2023/01/size-units-in-css/2023-01-13T23:39:15+09:00https://prayinforrain.github.io/about/2023-05-04T01:48:16+09:00https://prayinforrain.github.io/tags/moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/categories/moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/2022-12-21T03:30:25+09:00https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/2022-12-06T02:11:55+09:00https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/2022-12-05T13:18:55+09:00https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/2022-11-24T00:53:55+09:00https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/2022-11-22T20:36:55+09:00https://prayinforrain.github.io/tags/css-in-js/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/emotion/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/emotion/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/pnpm/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/categories/react/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/recoil/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/tags/redux/2022-11-18T16:42:55+09:00https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/2022-11-18T16:42:55+09:00 \ No newline at end of file diff --git a/tags/algorithm/index.html b/tags/algorithm/index.html index 060e1b7..9d7b48d 100644 --- a/tags/algorithm/index.html +++ b/tags/algorithm/index.html @@ -1,10 +1,10 @@ Algorithm | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/algorithm/index.xml b/tags/algorithm/index.xml index f6e9801..a7b471a 100644 --- a/tags/algorithm/index.xml +++ b/tags/algorithm/index.xml @@ -1,3 +1,5 @@ -Algorithm on PrayinForRain.devhttps://prayinforrain.github.io/tags/algorithm/Recent content in Algorithm on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. \ No newline at end of file +Algorithm on PrayinForRain.devhttps://prayinforrain.github.io/tags/algorithm/Recent content in Algorithm on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/baekjoon/index.html b/tags/baekjoon/index.html index e958109..e8cc674 100644 --- a/tags/baekjoon/index.html +++ b/tags/baekjoon/index.html @@ -1,10 +1,10 @@ Baekjoon | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/baekjoon/index.xml b/tags/baekjoon/index.xml index 0ae0ac9..5767120 100644 --- a/tags/baekjoon/index.xml +++ b/tags/baekjoon/index.xml @@ -1,3 +1,5 @@ -Baekjoon on PrayinForRain.devhttps://prayinforrain.github.io/tags/baekjoon/Recent content in Baekjoon on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. \ No newline at end of file +Baekjoon on PrayinForRain.devhttps://prayinforrain.github.io/tags/baekjoon/Recent content in Baekjoon on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/blog/index.html b/tags/blog/index.html index 9ba7156..732ec50 100644 --- a/tags/blog/index.html +++ b/tags/blog/index.html @@ -1,10 +1,10 @@ Blog | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/blog/index.xml b/tags/blog/index.xml index d1fd79f..f3d23d7 100644 --- a/tags/blog/index.xml +++ b/tags/blog/index.xml @@ -1,2 +1,6 @@ -Blog on PrayinForRain.devhttps://prayinforrain.github.io/tags/blog/Recent content in Blog on PrayinForRain.devHugo -- gohugo.iokoMon, 30 Jan 2023 19:17:55 +0900Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. -๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Blog on PrayinForRain.devhttps://prayinforrain.github.io/tags/blog/Recent content in Blog on PrayinForRain.devHugokoMon, 30 Jan 2023 19:17:55 +0900Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/<p>์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</p> +<h2 id="๋ธ”๋กœ๊ทธ๋ฅผ-์ด์ „ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><figure><img src="https://prayinforrain.github.io/images/posts/2023/01/migrating-to-hugo/01.png" + alt="image"><figcaption> + <p>์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..</p> \ No newline at end of file diff --git a/tags/browser/index.html b/tags/browser/index.html index 60be398..60949fb 100644 --- a/tags/browser/index.html +++ b/tags/browser/index.html @@ -1,10 +1,10 @@ Browser | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/browser/index.xml b/tags/browser/index.xml index d650da3..771fe22 100644 --- a/tags/browser/index.xml +++ b/tags/browser/index.xml @@ -1,2 +1,17 @@ -Browser on PrayinForRain.devhttps://prayinforrain.github.io/tags/browser/Recent content in Browser on PrayinForRain.devHugo -- gohugo.iokoMon, 16 Jan 2023 16:38:15 +0900๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. -์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout) ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint) ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. \ No newline at end of file +Browser on PrayinForRain.devhttps://prayinforrain.github.io/tags/browser/Recent content in Browser on PrayinForRain.devHugokoMon, 16 Jan 2023 16:38:15 +0900๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/<h2 id="๋ธŒ๋ผ์šฐ์ €-๋ Œ๋”๋ง">๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง</h2> +<p>์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/browser-rendering-performance/01.png" alt="Untitled"></p> +<ul> +<li>์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</li> +<li>Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)</li> +<li>๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)</li> +<li>์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด <code>Reflow</code>๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +<ul> +<li>Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ <strong>๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +<li>๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)</li> +<li>๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ <strong>Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<iframe width="560" height="315" src="https://www.youtube.com/embed/TZz9VHjJzMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> +<p>์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ <code>will-change</code>๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!</p> \ No newline at end of file diff --git a/tags/cds/index.html b/tags/cds/index.html index a6453e3..9a51a91 100644 --- a/tags/cds/index.html +++ b/tags/cds/index.html @@ -1,10 +1,10 @@ Cds | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/cds/index.xml b/tags/cds/index.xml index 28dbaaa..dc24259 100644 --- a/tags/cds/index.xml +++ b/tags/cds/index.xml @@ -1 +1 @@ -Cds on PrayinForRain.devhttps://prayinforrain.github.io/tags/cds/Recent content in Cds on PrayinForRain.devHugo -- gohugo.iokoMon, 14 Aug 2023 00:54:02 +0900์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค \ No newline at end of file +Cds on PrayinForRain.devhttps://prayinforrain.github.io/tags/cds/Recent content in Cds on PrayinForRain.devHugokoMon, 14 Aug 2023 00:54:02 +0900์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค \ No newline at end of file diff --git a/tags/css-in-js/index.html b/tags/css-in-js/index.html index 294816e..50733bc 100644 --- a/tags/css-in-js/index.html +++ b/tags/css-in-js/index.html @@ -1,10 +1,10 @@ CSS-in-JS | PrayinForRain.dev -

CSS-in-JS

2022

+Hugo. \ No newline at end of file diff --git a/tags/css-in-js/index.xml b/tags/css-in-js/index.xml index 07dbe45..2264855 100644 --- a/tags/css-in-js/index.xml +++ b/tags/css-in-js/index.xml @@ -1,2 +1,10 @@ -CSS-in-JS on PrayinForRain.devhttps://prayinforrain.github.io/tags/css-in-js/Recent content in CSS-in-JS on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. \ No newline at end of file +CSS-in-JS on PrayinForRain.devhttps://prayinforrain.github.io/tags/css-in-js/Recent content in CSS-in-JS on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p> \ No newline at end of file diff --git a/tags/css/index.html b/tags/css/index.html index 4af9fdb..714ccd1 100644 --- a/tags/css/index.html +++ b/tags/css/index.html @@ -1,10 +1,10 @@ CSS | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/css/index.xml b/tags/css/index.xml index 5e92cfe..bf2c09a 100644 --- a/tags/css/index.xml +++ b/tags/css/index.xml @@ -1,3 +1,21 @@ -CSS on PrayinForRain.devhttps://prayinforrain.github.io/tags/css/Recent content in CSS on PrayinForRain.devHugo -- gohugo.iokoMon, 16 Jan 2023 16:38:15 +0900CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . \ No newline at end of file +CSS on PrayinForRain.devhttps://prayinforrain.github.io/tags/css/Recent content in CSS on PrayinForRain.devHugokoMon, 16 Jan 2023 16:38:15 +0900CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/ecmascript/index.html b/tags/ecmascript/index.html index aaad39b..c1fa5d4 100644 --- a/tags/ecmascript/index.html +++ b/tags/ecmascript/index.html @@ -1,10 +1,10 @@ ECMAScript | PrayinForRain.dev -

ECMAScript

2023

+Hugo. \ No newline at end of file diff --git a/tags/ecmascript/index.xml b/tags/ecmascript/index.xml index da6a481..7e446ef 100644 --- a/tags/ecmascript/index.xml +++ b/tags/ecmascript/index.xml @@ -1,3 +1,8 @@ -ECMAScript on PrayinForRain.devhttps://prayinforrain.github.io/tags/ecmascript/Recent content in ECMAScript on PrayinForRain.devHugo -- gohugo.iokoWed, 25 Jan 2023 16:35:01 +0900ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. \ No newline at end of file +ECMAScript on PrayinForRain.devhttps://prayinforrain.github.io/tags/ecmascript/Recent content in ECMAScript on PrayinForRain.devHugokoWed, 25 Jan 2023 16:35:01 +0900ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/emotion/index.html b/tags/emotion/index.html index e89dde8..7b7946c 100644 --- a/tags/emotion/index.html +++ b/tags/emotion/index.html @@ -1,10 +1,10 @@ Emotion | PrayinForRain.dev -

Emotion

2022

+Hugo. \ No newline at end of file diff --git a/tags/emotion/index.xml b/tags/emotion/index.xml index 15e6c41..87a7edc 100644 --- a/tags/emotion/index.xml +++ b/tags/emotion/index.xml @@ -1,2 +1,10 @@ -Emotion on PrayinForRain.devhttps://prayinforrain.github.io/tags/emotion/Recent content in Emotion on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. \ No newline at end of file +Emotion on PrayinForRain.devhttps://prayinforrain.github.io/tags/emotion/Recent content in Emotion on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p> \ No newline at end of file diff --git a/tags/firebase/index.html b/tags/firebase/index.html index a3ef303..8b25f3c 100644 --- a/tags/firebase/index.html +++ b/tags/firebase/index.html @@ -1,10 +1,10 @@ Firebase | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/firebase/index.xml b/tags/firebase/index.xml index d9f378f..0a2f31f 100644 --- a/tags/firebase/index.xml +++ b/tags/firebase/index.xml @@ -1,4 +1,10 @@ -Firebase on PrayinForRain.devhttps://prayinforrain.github.io/tags/firebase/Recent content in Firebase on PrayinForRain.devHugo -- gohugo.iokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค. \ No newline at end of file +Firebase on PrayinForRain.devhttps://prayinforrain.github.io/tags/firebase/Recent content in Firebase on PrayinForRain.devHugokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/generic/index.html b/tags/generic/index.html index a5f5db3..6351ef3 100644 --- a/tags/generic/index.html +++ b/tags/generic/index.html @@ -1,10 +1,10 @@ Generic | PrayinForRain.dev -

Generic

2023

+Hugo. \ No newline at end of file diff --git a/tags/generic/index.xml b/tags/generic/index.xml index fab4402..edcd7f8 100644 --- a/tags/generic/index.xml +++ b/tags/generic/index.xml @@ -1,4 +1,23 @@ -Generic on PrayinForRain.devhttps://prayinforrain.github.io/tags/generic/Recent content in Generic on PrayinForRain.devHugo -- gohugo.iokoWed, 01 Feb 2023 02:01:15 +0900Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this. \ No newline at end of file +Generic on PrayinForRain.devhttps://prayinforrain.github.io/tags/generic/Recent content in Generic on PrayinForRain.devHugokoWed, 01 Feb 2023 02:01:15 +0900Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p> \ No newline at end of file diff --git a/tags/hugo/index.html b/tags/hugo/index.html index 88e3709..c323e2b 100644 --- a/tags/hugo/index.html +++ b/tags/hugo/index.html @@ -1,10 +1,10 @@ Hugo | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/hugo/index.xml b/tags/hugo/index.xml index 06a4abe..899d3c2 100644 --- a/tags/hugo/index.xml +++ b/tags/hugo/index.xml @@ -1,2 +1,6 @@ -Hugo on PrayinForRain.devhttps://prayinforrain.github.io/tags/hugo/Recent content in Hugo on PrayinForRain.devHugo -- gohugo.iokoMon, 30 Jan 2023 19:17:55 +0900Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. -๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ ์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Hugo on PrayinForRain.devhttps://prayinforrain.github.io/tags/hugo/Recent content in Hugo on PrayinForRain.devHugokoMon, 30 Jan 2023 19:17:55 +0900Hugo๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ธฐ์žhttps://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/posts/2023/01/migrating-to-hugo/<p>์•Œ์Œ์•Œ์Œ ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋กœ ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ ์ด ๊ณณ์œผ๋กœ ๋ธ”๋กœ๊ทธ๋ฅผ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค. ํ‹ฐ์Šคํ† ๋ฆฌ์— ์žˆ๋˜ ์ปจํ…์ธ  ๋Œ€๋ถ€๋ถ„์€ ์˜ฎ๊ธฐ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ณ„ ์˜๋ฏธ๋„ ์—†๊ณ  ๋„ˆ๋ฌด ์‚ฌ์ ์ธ ๋‚ด์šฉ์ด ๋งŽ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ ํ‹ฐ์Šคํ† ๋ฆฌ๋งŒ์˜ ๊ฐ์„ฑ์ด๋ผ๊ณ  ํ•ด์•ผ ํ•˜๋‚˜.. ์•ฝ๊ฐ„ ๊ทธ ๊ณณ์— ๋” ๋งž๋Š” ํฌ์ธํŠธ๋“ค์ด ์žˆ์–ด์„œ ์•„์นด์ด๋ธŒ๊ฐ™์€ ๋Š๋‚Œ์œผ๋กœ ๊ทธ๋ƒฅ ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋‘๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณณ๊ณณ์— ํ‹ฐ์Šคํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์‹œ๊ฐ„์„ ํšจ์œจ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ณ  ์‹ถ์€ ๋ถ„์ด ์žˆ๋‹ค๋ฉด ์ฝ์–ด์ฃผ์…”๋„ ๊ฐ์‚ฌํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. +์•„๋ฌดํŠผ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ปจํ…์ธ ๋„ ์—†์œผ๋ฉด์„œ ์ •๋ง ์˜ค๋žœ ๊ธฐ๊ฐ„ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.</p> +<h2 id="๋ธ”๋กœ๊ทธ๋ฅผ-์ด์ „ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">๋ธ”๋กœ๊ทธ๋ฅผ ์ด์ „ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><figure><img src="https://prayinforrain.github.io/images/posts/2023/01/migrating-to-hugo/01.png" + alt="image"><figcaption> + <p>์•„์ง๋„ ์ € Main Page๋ผ๋Š” ๊ธ€์ž์˜ ์˜๋ฏธ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค..</p> \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 997ed96..1870c43 100644 --- a/tags/index.html +++ b/tags/index.html @@ -1,10 +1,10 @@ Tags | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml index 24fea25..0cd8a0d 100644 --- a/tags/index.xml +++ b/tags/index.xml @@ -1 +1 @@ -Tags on PrayinForRain.devhttps://prayinforrain.github.io/tags/Recent content in Tags on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900Projecthttps://prayinforrain.github.io/tags/project/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/tags/project/Reacthttps://prayinforrain.github.io/tags/react/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/tags/react/Cdshttps://prayinforrain.github.io/tags/cds/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/tags/cds/Yarnhttps://prayinforrain.github.io/tags/yarn/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/tags/yarn/Nextjshttps://prayinforrain.github.io/tags/nextjs/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/tags/nextjs/Pnphttps://prayinforrain.github.io/tags/pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/tags/pnp/Storybookhttps://prayinforrain.github.io/tags/storybook/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/tags/storybook/Numblehttps://prayinforrain.github.io/tags/numble/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/tags/numble/Algorithmhttps://prayinforrain.github.io/tags/algorithm/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/algorithm/Baekjoonhttps://prayinforrain.github.io/tags/baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/baekjoon/Javascripthttps://prayinforrain.github.io/tags/javascript/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/javascript/Nodejshttps://prayinforrain.github.io/tags/nodejs/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/nodejs/Pshttps://prayinforrain.github.io/tags/ps/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/ps/MacOShttps://prayinforrain.github.io/tags/macos/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/macos/Npmhttps://prayinforrain.github.io/tags/npm/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/npm/Nvmhttps://prayinforrain.github.io/tags/nvm/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/nvm/Vscodehttps://prayinforrain.github.io/tags/vscode/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/vscode/Firebasehttps://prayinforrain.github.io/tags/firebase/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/firebase/TypeScripthttps://prayinforrain.github.io/tags/typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/typescript/Webhttps://prayinforrain.github.io/tags/web/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/web/Generichttps://prayinforrain.github.io/tags/generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/tags/generic/Bloghttps://prayinforrain.github.io/tags/blog/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/tags/blog/Hugohttps://prayinforrain.github.io/tags/hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/tags/hugo/Tree-Shakinghttps://prayinforrain.github.io/tags/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/tags/tree-shaking/ECMAScripthttps://prayinforrain.github.io/tags/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/tags/ecmascript/Browserhttps://prayinforrain.github.io/tags/browser/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/tags/browser/CSShttps://prayinforrain.github.io/tags/css/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/tags/css/Moheyumhttps://prayinforrain.github.io/tags/moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/tags/moheyum/CSS-in-JShttps://prayinforrain.github.io/tags/css-in-js/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/css-in-js/Emotionhttps://prayinforrain.github.io/tags/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/emotion/Pnpmhttps://prayinforrain.github.io/tags/pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/pnpm/Recoilhttps://prayinforrain.github.io/tags/recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/recoil/Reduxhttps://prayinforrain.github.io/tags/redux/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/redux/ \ No newline at end of file +Tags on PrayinForRain.devhttps://prayinforrain.github.io/tags/Recent content in Tags on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Nextjshttps://prayinforrain.github.io/tags/nextjs/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/tags/nextjs/Projecthttps://prayinforrain.github.io/tags/project/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/tags/project/Reacthttps://prayinforrain.github.io/tags/react/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/tags/react/Cdshttps://prayinforrain.github.io/tags/cds/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/tags/cds/Yarnhttps://prayinforrain.github.io/tags/yarn/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/tags/yarn/Pnphttps://prayinforrain.github.io/tags/pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/tags/pnp/Storybookhttps://prayinforrain.github.io/tags/storybook/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/tags/storybook/Numblehttps://prayinforrain.github.io/tags/numble/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/tags/numble/Algorithmhttps://prayinforrain.github.io/tags/algorithm/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/algorithm/Baekjoonhttps://prayinforrain.github.io/tags/baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/baekjoon/Javascripthttps://prayinforrain.github.io/tags/javascript/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/javascript/Nodejshttps://prayinforrain.github.io/tags/nodejs/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/nodejs/Pshttps://prayinforrain.github.io/tags/ps/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/ps/MacOShttps://prayinforrain.github.io/tags/macos/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/macos/Npmhttps://prayinforrain.github.io/tags/npm/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/npm/Nvmhttps://prayinforrain.github.io/tags/nvm/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/nvm/Vscodehttps://prayinforrain.github.io/tags/vscode/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/tags/vscode/Firebasehttps://prayinforrain.github.io/tags/firebase/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/firebase/TypeScripthttps://prayinforrain.github.io/tags/typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/typescript/Webhttps://prayinforrain.github.io/tags/web/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/tags/web/Generichttps://prayinforrain.github.io/tags/generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/tags/generic/Bloghttps://prayinforrain.github.io/tags/blog/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/tags/blog/Hugohttps://prayinforrain.github.io/tags/hugo/Mon, 30 Jan 2023 19:17:55 +0900https://prayinforrain.github.io/tags/hugo/Tree-Shakinghttps://prayinforrain.github.io/tags/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/tags/tree-shaking/ECMAScripthttps://prayinforrain.github.io/tags/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/tags/ecmascript/Browserhttps://prayinforrain.github.io/tags/browser/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/tags/browser/CSShttps://prayinforrain.github.io/tags/css/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/tags/css/Moheyumhttps://prayinforrain.github.io/tags/moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/tags/moheyum/CSS-in-JShttps://prayinforrain.github.io/tags/css-in-js/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/css-in-js/Emotionhttps://prayinforrain.github.io/tags/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/emotion/Pnpmhttps://prayinforrain.github.io/tags/pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/pnpm/Recoilhttps://prayinforrain.github.io/tags/recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/recoil/Reduxhttps://prayinforrain.github.io/tags/redux/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/tags/redux/ \ No newline at end of file diff --git a/tags/javascript/index.html b/tags/javascript/index.html index c9ac2dc..d2a647a 100644 --- a/tags/javascript/index.html +++ b/tags/javascript/index.html @@ -1,10 +1,10 @@ Javascript | PrayinForRain.dev -

Javascript

2023

+Hugo. \ No newline at end of file diff --git a/tags/javascript/index.xml b/tags/javascript/index.xml index c7c3e1d..09908b0 100644 --- a/tags/javascript/index.xml +++ b/tags/javascript/index.xml @@ -1,6 +1,15 @@ -Javascript on PrayinForRain.devhttps://prayinforrain.github.io/tags/javascript/Recent content in Javascript on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค.Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Javascript on PrayinForRain.devhttps://prayinforrain.github.io/tags/javascript/Recent content in Javascript on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p>Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/macos/index.html b/tags/macos/index.html index 26b21e8..1d8ced1 100644 --- a/tags/macos/index.html +++ b/tags/macos/index.html @@ -1,10 +1,10 @@ MacOS | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/macos/index.xml b/tags/macos/index.xml index 5305980..9b7a7a6 100644 --- a/tags/macos/index.xml +++ b/tags/macos/index.xml @@ -1,3 +1,8 @@ -MacOS on PrayinForRain.devhttps://prayinforrain.github.io/tags/macos/Recent content in MacOS on PrayinForRain.devHugo -- gohugo.iokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. \ No newline at end of file +MacOS on PrayinForRain.devhttps://prayinforrain.github.io/tags/macos/Recent content in MacOS on PrayinForRain.devHugokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p> \ No newline at end of file diff --git a/tags/moheyum/index.html b/tags/moheyum/index.html index d481720..d2033ff 100644 --- a/tags/moheyum/index.html +++ b/tags/moheyum/index.html @@ -1,10 +1,10 @@ Moheyum | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/moheyum/index.xml b/tags/moheyum/index.xml index 9184143..505cefc 100644 --- a/tags/moheyum/index.xml +++ b/tags/moheyum/index.xml @@ -1,21 +1,55 @@ -Moheyum on PrayinForRain.devhttps://prayinforrain.github.io/tags/moheyum/Recent content in Moheyum on PrayinForRain.devHugo -- gohugo.iokoWed, 21 Dec 2022 03:30:25 +0900๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. [์›๋ณธ ๋งํฌ] -๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค.. -๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” ๋ชจํ—ค์œฐ์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. [์—ฌ๊ธฐ]์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/๋ชจํ—ค์œฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ Next.js๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” NestJS๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, SSR์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”. -๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ memoization์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ Next.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. GFM(GitHub Flavored Markdown)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ? -๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/๋ชจํ—ค์œฐ์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3] -์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3] -๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค. -๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/๐ŸคทTL;DR CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค. emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž. ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž. CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž. ๐ŸŽจCSS-in-JS CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. -์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค.Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Moheyum on PrayinForRain.devhttps://prayinforrain.github.io/tags/moheyum/Recent content in Moheyum on PrayinForRain.devHugokoWed, 21 Dec 2022 03:30:25 +0900๋ชจํ—ค์œฐ mo:heyum - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/Wed, 21 Dec 2022 03:30:25 +0900https://prayinforrain.github.io/posts/2022/12/finishing-moheyum/<blockquote> +<p>ํ‹ฐ์Šคํ† ๋ฆฌ ๋ธ”๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ๋˜ ๋ถ€์ŠคํŠธ์บ ํ”„ ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ํšŒ๊ณ  ๊ธ€์ด๋‹ค. <a href="https://prayinforrain.tistory.com/80">[์›๋ณธ ๋งํฌ]</a></p> +</blockquote> +<figure><img src="https://prayinforrain.github.io/images/posts/2022/12/finishing-moheyum/moheyum_01.png" + alt="image"><figcaption> + <p>๋‚ด๊ฐ€ ํŒ€์›๋“คํ•œํ…Œ ์ด ์–˜๊ธธ ํ–ˆ๋‚˜ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ.. ์ด ํŽ˜์ด์ง€ ์ข€ ์ด์˜๋‹ค. ์ž˜๋งŒ๋“œ์…จ๋‹ค..</p> + </figcaption> +</figure> + +<p>๋ถ€์ŠคํŠธ์บ ํ”„์˜ ์ตœ์ข… ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ๋‚˜๋Š” <strong>๋ชจํ—ค์œฐ</strong>์ด๋ผ๋Š” SNS๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฌผ์€ ๊ฝค ๊ดœ์ฐฎ๋‹ค. <a href="https://youtu.be/9mVinynuUTw">[์—ฌ๊ธฐ]</a>์— ๊ฐ„๋‹จํ•œ ์‹œ์—ฐ ์˜์ƒ์ด ์žˆ๋‹ค. ์‚ฌ์‹ค ํŒ€ ๊ตฌ์ธ์„ ํ•˜๋˜ ๋•Œ๋ถ€ํ„ฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€๋Š” ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌํƒœ๊นŒ์ง€์˜ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋กœ ์ด๋ฏธ ๊ฐœ๋ฐœ์ด๋ผ๋Š” ๊ณผ์ •์€ ์–ด๋Š์ •๋„ ๊ฐ์„ ์ตํ˜”๊ณ , ๋‚ด๊ฐ€ ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ๋งŒ ์กฐ๊ธˆ์”ฉ ๋ณ€ํ™”ํ•  ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ํฌ์ธํŠธ๋Š” ํ˜‘์—…์ด์—ˆ๋‹ค.</p>์‚ฌ์ด๋“œ๋ฐ”์•ผ ๊ทธ๋งŒ ๊นœ๋นก์—ฌ๋ผhttps://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/Tue, 06 Dec 2022 02:11:55 +0900https://prayinforrain.github.io/posts/2022/12/prevent-sidebar-blinking/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ํ”„๋ก ํŠธ์—”๋“œ ์•ฑ์€ <code>Next.js</code>๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์› ๊ทธ ๋ˆ„๊ตฌ๋„ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Œ์—๋„ ๊ตณ์ด ์„ ํƒํ•œ ์ด์œ ๋Š” <code>NestJS</code>๋ฅผ ์จ ๋ณด๋‹ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค„ ๊ฒƒ์ด๋ผ๋Š” ๋ง‰์—ฐํ•œ ๊ธฐ๋Œ€์™€, <code>SSR</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๊ณ  ์‹ถ์€ ํ•™์Šต์ ์ธ ์š•์‹ฌ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋Œ์•„๋ณด๋‹ˆ โ€˜๋„ˆ์™€ ํ•จ๊ป˜ ํ•˜๊ธธ ์ž˜ ํ–ˆ์–ด!โ€™ ํ•˜๋Š” ๊ฐ์ƒ์€ ์—†๋„ค์š”.</p> +<p>๊ธฐ์™• SSR์„ ์ฒดํ—˜ํ•œ๋‹ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ ๋งŒํผ, ์„ฑ๋Šฅ์— ์‹ ๊ฒฝ์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ด๋–ค ํŒ€์˜ ๋…ธ์…˜์—์„œ <code>memoization</code>์„ ํ†ตํ•œ ์ปดํฌ๋„ŒํŠธ ์ค‘๋ณต ๋ Œ๋”๋ง ๋ฐฉ์ง€์— ๋Œ€ํ•œ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ถ€๋ถ„์ด ๋•Œ ๋งˆ์นจ <a href="https://www.notion.so/next-js-13-app-dir-11191a66a5564a25ba882c8a835afd13">Next.js 13์„ ์ ์šฉํ•˜์ง€ ๋ชปํ•ด ํฌ๊ธฐํ•ด์•ผ๋งŒ ํ–ˆ๋˜</a> ์•„ํ”ˆ ์ƒ์ฒ˜๋ฅผ ์ž๊ทนํ•˜๊ณ  ์žˆ์–ด์„œ ๋ชจํ—ค์œฐ์—๋„ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - Markdown [3/3]https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/Mon, 05 Dec 2022 13:18:55 +0900https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋งˆ์ง€๋ง‰์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•˜๊ณ , ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ๋‚จ์€ ์ผ์€ ์„œ์‹์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋งˆํฌ๋‹ค์šด ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์–ด๋–ป๊ฒŒ ์„œ์‹์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-์–ด๋–ป๊ฒŒ-ํ• ๊นŒ์š”">๐Ÿคท ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?</h2> +<p>์ •๋ง์ด์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒ์š”? ์šฐ์„  ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐ€์žฅ ์‚ฌ์šฉ์„ฑ์ด ์ข‹์€ ๋งˆํฌ๋‹ค์šด์€ ๊นƒํ—ˆ๋ธŒ์˜ ๊ทธ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค. <a href="https://github.github.com/gfm/">GFM(GitHub Flavored Markdown)</a>์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ŠคํŽ™์ด ์žˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ๋ถ€๋ฅด๋Š” ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์กฐ์ฐจ ๋ชจ๋ฅด๊ณ  ๋ง‰๋ฌด๊ฐ€๋‚ด๋กœ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ๋งˆ์ธ๋“œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•„๋ฌด ์ด์Šˆ๋‚˜ ๋“ค์–ด๊ฐ€์„œ ๋Œ“๊ธ€ ์ฐฝ์— ์‹คํ—˜์„ ํ•˜๋ฉด์„œ์š”.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - getSelection [2/3]https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/Thu, 24 Nov 2022 00:53:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>์•„๋‹ˆ???????? ๋‘ ๋ฒˆ์งธ ๊ธ€์ด ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ์˜€๋„ค์š”. ์ €๋Š” ์‚ฌ์‹ค ์ด ๊ธ€์ด 2๋ถ€์ž‘์ด๊ธธ ๊ฐ„์ ˆํžˆ ๋ฐ”๋žฌ๋Š”๋ฐ, 1ํŽธ์—์„œ ๋งŒ๋“  ์—๋””ํ„ฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์–ด์„œ ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑธ๋กœ 3์‹œ๊ฐ„์„ ์”จ๋ฆ„ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋ชจํ—ค์œฐ์˜ TIL ๋ฌธ์„œ๊ฐ€ ํ’์„ฑํ•ด์ง€๊ณ  ์žˆ์œผ๋‹ˆ ๊ธ์ •์ ์ด๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ์ฃ ?</p> +<blockquote> +<p>๐Ÿ’ก ์ด ๊ธ€์€ Window 10, Chrome 107.0.5304.107 ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>๋งˆํฌ๋‹ค์šด ๋งŒ๋“ค๊ธฐ - contentEditable [1/3]https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/Tue, 22 Nov 2022 20:36:55 +0900https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/<p><strong>๋ชจํ—ค์œฐ</strong>์˜ ์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ ์‹œ๋ฆฌ์ฆˆ ๋ชจ์•„๋ณด๊ธฐ<br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-contenteditable/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - ContentEditable [1/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/11/making-editor-getselection/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - getSelection [2/3]</a><br> +<a href="https://prayinforrain.github.io/posts/2022/12/making-editor-markdown/">์—๋””ํ„ฐ ๋งŒ๋“ค๊ธฐ - Markdown [3/3]</a></p> +<hr> +<p>๋ชจํ—ค์œฐ์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” <code>๋งˆํฌ๋‹ค์šด ์„œ์‹ ์ง€์›</code>์ž…๋‹ˆ๋‹ค. ์™œ SNS์— ๋งˆํฌ๋‹ค์šด์„ ๋ผ์–น์„ ์ƒ๊ฐ์„ ํ–ˆ๋‚˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ตœ์ดˆ ๊ธฐํš๋ถ€ํ„ฐ ์žˆ๋‹ค๊ฐ€ ๊ธฐ๋Šฅ ๋‹ค์ด์–ดํŠธ๋ฅผ ํ•œ ํ›„ ์‚ด์•„๋‚จ์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์•„๋ฌดํŠผ ๋“œ๋””์–ด ๋•Œ๊ฐ€ ์™”์Šต๋‹ˆ๋‹ค.</p> +<p>๋‚ด๋ถ€์ ์œผ๋กœ ์—๋””ํ„ฐ๋ฅผ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ์š”, ๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ์ง€๋งŒ ๊ทธ ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋ฉ‹์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ์‚ฌ์ดํŠธ ๋‘ ๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.</p>Emotionhttps://prayinforrain.github.io/posts/2022/11/emotion/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/emotion/<h2 id="tldr">๐ŸคทTL;DR</h2> +<ul> +<li>CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.</li> +<li>emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.</li> +<li>์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.</li> +<li>CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.</li> +</ul> +<h2 id="css-in-js">๐ŸŽจCSS-in-JS</h2> +<p>CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/emotion/emotion_01.png" alt="Untitled"></p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p>Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/nextjs/index.html b/tags/nextjs/index.html index e923677..a8de796 100644 --- a/tags/nextjs/index.html +++ b/tags/nextjs/index.html @@ -1,10 +1,10 @@ Nextjs | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/nextjs/index.xml b/tags/nextjs/index.xml index e8e4128..29aa6d3 100644 --- a/tags/nextjs/index.xml +++ b/tags/nextjs/index.xml @@ -1,2 +1,3 @@ -Nextjs on PrayinForRain.devhttps://prayinforrain.github.io/tags/nextjs/Recent content in Nextjs on PrayinForRain.devHugo -- gohugo.iokoThu, 27 Apr 2023 15:32:50 +0900Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. \ No newline at end of file +Nextjs on PrayinForRain.devhttps://prayinforrain.github.io/tags/nextjs/Recent content in Nextjs on PrayinForRain.devHugokoThu, 18 Jul 2024 12:34:32 +0900Next.js ์„ฑ๋Šฅ ๊ฐœ์„ ๊ธฐhttps://prayinforrain.github.io/posts/2024/07/site-optimization/Thu, 18 Jul 2024 12:34:32 +0900https://prayinforrain.github.io/posts/2024/07/site-optimization/์ตœ๋Œ€ํ•œ ๊ฐ€๋ฒผ์šด ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์žNext.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/nodejs/index.html b/tags/nodejs/index.html index 810113e..d20fde3 100644 --- a/tags/nodejs/index.html +++ b/tags/nodejs/index.html @@ -1,10 +1,10 @@ Nodejs | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/nodejs/index.xml b/tags/nodejs/index.xml index d5744a6..8485c77 100644 --- a/tags/nodejs/index.xml +++ b/tags/nodejs/index.xml @@ -1,3 +1,5 @@ -Nodejs on PrayinForRain.devhttps://prayinforrain.github.io/tags/nodejs/Recent content in Nodejs on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. \ No newline at end of file +Nodejs on PrayinForRain.devhttps://prayinforrain.github.io/tags/nodejs/Recent content in Nodejs on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/npm/index.html b/tags/npm/index.html index c91bfff..cda883d 100644 --- a/tags/npm/index.html +++ b/tags/npm/index.html @@ -1,10 +1,10 @@ Npm | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/npm/index.xml b/tags/npm/index.xml index 3379b0d..cec80d0 100644 --- a/tags/npm/index.xml +++ b/tags/npm/index.xml @@ -1,4 +1,16 @@ -Npm on PrayinForRain.devhttps://prayinforrain.github.io/tags/npm/Recent content in Npm on PrayinForRain.devHugo -- gohugo.iokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. \ No newline at end of file +Npm on PrayinForRain.devhttps://prayinforrain.github.io/tags/npm/Recent content in Npm on PrayinForRain.devHugokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p> \ No newline at end of file diff --git a/tags/numble/index.html b/tags/numble/index.html index fcfb8b4..d88d2e6 100644 --- a/tags/numble/index.html +++ b/tags/numble/index.html @@ -1,10 +1,10 @@ Numble | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/numble/index.xml b/tags/numble/index.xml index ef8941f..22b11a6 100644 --- a/tags/numble/index.xml +++ b/tags/numble/index.xml @@ -1,2 +1,4 @@ -Numble on PrayinForRain.devhttps://prayinforrain.github.io/tags/numble/Recent content in Numble on PrayinForRain.devHugo -- gohugo.iokoSun, 23 Apr 2023 04:05:58 +0900๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค. -๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. \ No newline at end of file +Numble on PrayinForRain.devhttps://prayinforrain.github.io/tags/numble/Recent content in Numble on PrayinForRain.devHugokoSun, 23 Apr 2023 04:05:58 +0900๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/<h2 id="์‹œ์ž‘ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/04/numble-talk/01.png" alt="ui design"></p> +<p>3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.</p> +<p>๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..</p> \ No newline at end of file diff --git a/tags/nvm/index.html b/tags/nvm/index.html index 8281b3d..223292b 100644 --- a/tags/nvm/index.html +++ b/tags/nvm/index.html @@ -1,10 +1,10 @@ Nvm | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/nvm/index.xml b/tags/nvm/index.xml index ad5c339..4257b57 100644 --- a/tags/nvm/index.xml +++ b/tags/nvm/index.xml @@ -1,3 +1,8 @@ -Nvm on PrayinForRain.devhttps://prayinforrain.github.io/tags/nvm/Recent content in Nvm on PrayinForRain.devHugo -- gohugo.iokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. \ No newline at end of file +Nvm on PrayinForRain.devhttps://prayinforrain.github.io/tags/nvm/Recent content in Nvm on PrayinForRain.devHugokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p> \ No newline at end of file diff --git a/tags/pnp/index.html b/tags/pnp/index.html index 300cae4..a18211d 100644 --- a/tags/pnp/index.html +++ b/tags/pnp/index.html @@ -1,10 +1,10 @@ Pnp | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/pnp/index.xml b/tags/pnp/index.xml index f96cf4d..0578d15 100644 --- a/tags/pnp/index.xml +++ b/tags/pnp/index.xml @@ -1,2 +1,3 @@ -Pnp on PrayinForRain.devhttps://prayinforrain.github.io/tags/pnp/Recent content in Pnp on PrayinForRain.devHugo -- gohugo.iokoThu, 27 Apr 2023 15:32:50 +0900Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. \ No newline at end of file +Pnp on PrayinForRain.devhttps://prayinforrain.github.io/tags/pnp/Recent content in Pnp on PrayinForRain.devHugokoThu, 27 Apr 2023 15:32:50 +0900Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/pnpm/index.html b/tags/pnpm/index.html index 8ef355b..b21e818 100644 --- a/tags/pnpm/index.html +++ b/tags/pnpm/index.html @@ -1,10 +1,10 @@ Pnpm | PrayinForRain.dev -

Pnpm

2022

+Hugo. \ No newline at end of file diff --git a/tags/pnpm/index.xml b/tags/pnpm/index.xml index 5714557..85014e8 100644 --- a/tags/pnpm/index.xml +++ b/tags/pnpm/index.xml @@ -1,2 +1,9 @@ -Pnpm on PrayinForRain.devhttps://prayinforrain.github.io/tags/pnpm/Recent content in Pnpm on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. \ No newline at end of file +Pnpm on PrayinForRain.devhttps://prayinforrain.github.io/tags/pnpm/Recent content in Pnpm on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p> \ No newline at end of file diff --git a/tags/project/index.html b/tags/project/index.html index 06e7998..9e10608 100644 --- a/tags/project/index.html +++ b/tags/project/index.html @@ -1,10 +1,10 @@ Project | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/project/index.xml b/tags/project/index.xml index 77152ad..5dd5183 100644 --- a/tags/project/index.xml +++ b/tags/project/index.xml @@ -1,2 +1,4 @@ -Project on PrayinForRain.devhttps://prayinforrain.github.io/tags/project/Recent content in Project on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ 3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค. -๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. \ No newline at end of file +Project on PrayinForRain.devhttps://prayinforrain.github.io/tags/project/Recent content in Project on PrayinForRain.devHugokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS) ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/06/cds-retrospect/Sun, 18 Jun 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/06/cds-retrospect/์šฐ๋ฆฌ v1.2 ํ•ฉ์‹œ๋‹ค๋„˜๋ธ” OpenAI ๋‹จํ†ก๋ฐฉ ์ฑŒ๋ฆฐ์ง€ - ํ”„๋กœ์ ํŠธ ํšŒ๊ณ https://prayinforrain.github.io/posts/2023/04/numble-talk/Sun, 23 Apr 2023 04:05:58 +0900https://prayinforrain.github.io/posts/2023/04/numble-talk/<h2 id="์‹œ์ž‘ํ•˜๊ฒŒ-๋œ-๊ณ„๊ธฐ">์‹œ์ž‘ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/04/numble-talk/01.png" alt="ui design"></p> +<p>3์›”์— ์ •๋ง ๋งŽ์€ ์ผ๋“ค์ด ์žˆ์—ˆ๋‹ค. ์•„์ง ๋ญ”๊ฐ€ ์„ฑ๊ณผ๋ผ๊ณ  ๋‚ด์„ธ์šธ ๊ฒฐ๊ณผ๋ฌผ์ด ์—†๊ธด ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋ฌด์˜๋ฏธํ•˜์ง„ ์•Š์•˜๋‹ค(?)๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋Ÿฐ ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ ์  ์ผ์ด ์ •๋ฆฌ๊ฐ€ ๋˜๊ณ  ์—ฌ์œ ๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋ฒˆ์•„์›ƒ์ด ์˜จ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ํ‘น ๋Š˜์–ด์ง€๋Š” ๋Š๋‚Œ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ ์™€์ค‘์— ๋ˆ„๊ฐ€ ๋„˜๋ธ”์„ ์†Œ๊ฐœํ•ด ์ฃผ์…จ๋‹ค.</p> +<p>๋Œ€์ถฉ.. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ์™€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ฃผ๊ณ  ๊ตฌํ˜„์„ ํ•ด ๋ณด๋Š”? ํ”„๋กœ์„ธ์Šค์˜ ํ™œ๋™์œผ๋กœ ์ดํ•ดํ–ˆ๋‹ค. ๊ธฐ๊ฐ„์ด ์งง์•„ ํ™• ๋ชฐ์ž…ํ•˜๊ธฐ ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด์„œ ํ•œ ๋ฒˆ ๋ง›๋งŒ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. OpenAI API๋ฅผ ํ™œ์šฉํ•ด ๋ณด๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์ด ๊ด€์‹ฌ์„ ๋Œ๊ธฐ๋„ ํ–ˆ๋‹ค. ์š”์ƒˆ ์ฑ—์Œคํ•œํ…Œ ์ด๋Ÿฐ์ €๋Ÿฐ ๋„์›€๋„ ๋ฐ›์•˜๊ณ  ๊ด€๋ จ ์•„ํ‹ฐํด๋„ ๋งŽ์ด ๋ณด์ด๊ณ ..</p> \ No newline at end of file diff --git a/tags/ps/index.html b/tags/ps/index.html index bdef754..2fab078 100644 --- a/tags/ps/index.html +++ b/tags/ps/index.html @@ -1,10 +1,10 @@ Ps | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/ps/index.xml b/tags/ps/index.xml index b21ddb5..2d7818d 100644 --- a/tags/ps/index.xml +++ b/tags/ps/index.xml @@ -1,3 +1,5 @@ -Ps on PrayinForRain.devhttps://prayinforrain.github.io/tags/ps/Recent content in Ps on PrayinForRain.devHugo -- gohugo.iokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด ๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. -๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. \ No newline at end of file +Ps on PrayinForRain.devhttps://prayinforrain.github.io/tags/ps/Recent content in Ps on PrayinForRain.devHugokoThu, 30 Mar 2023 15:17:00 +0900๋ฐฑ์ค€์„ ์œ„ํ•œ node.jshttps://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/Thu, 30 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/nodejs-for-baekjoon/<h2 id="js๋ผ๋„-๋ฐฑ์ค€์ด-ํ•˜๊ณ ์‹ถ์–ด">JS๋ผ๋„ ๋ฐฑ์ค€์ด ํ•˜๊ณ ์‹ถ์–ด</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/03/nodejs-for-baekjoon/01.png" alt="Programmers IDE"></p> +<p>๊ณต์ฑ„ ์‹œ์ฆŒ์ด๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ •๋ง์ •๋ง ์ž์‹  ์—†์–ดํ–ˆ๋Š”๋ฐ, ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†์–ด ์•ผ๊ธˆ์•ผ๊ธˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค.<br> +๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ๋ฐฑ์ค€์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์•„์ฃผ ๋ถˆ์นœ์ ˆํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚ด๊ฐ€ ํ•™๋ถ€์ƒ ๋•Œ ์ž˜ ํ•˜์ง€๋„ ๋ชปํ•˜๋Š” C++๋กœ ๊พธ์—ญ๊พธ์—ญ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ–ˆ๋‹ค. ๊ทธ ๋•Œ๋Š” ์•„๋Š” PS ํ”Œ๋žซํผ์ด ๋ฐฑ์ค€ ๋ฟ์ด๋‹ˆ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„์ธ๊ฐ€๋ณด๋‹ค ํ–ˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ๋ง› ๋ณด๊ณ  ๋‚˜๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์ปค์ ธ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐฑ์ค€์—๊ฒŒ ๋ถ€๋‹นํ•œ ์ฐจ๋ณ„์„ ๋ฐ›๋Š”(?) ๊ธฐ๋ถ„์ด ๋“ค์—ˆ๋‹ค. ์ง„์งœ๋กœ ํ™”๊ฐ€ ๋‚œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜๋„ ํ™”๊ฐ€ ๋‚ฌ๋‹ค. ์šฉ์„œํ•  ์ˆ˜๊ฐ€ ์—†์–ด ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/react/index.html b/tags/react/index.html index 2639914..f316568 100644 --- a/tags/react/index.html +++ b/tags/react/index.html @@ -1,10 +1,10 @@ React | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/react/index.xml b/tags/react/index.xml index a5c3c87..88d80a4 100644 --- a/tags/react/index.xml +++ b/tags/react/index.xml @@ -1 +1 @@ -React on PrayinForRain.devhttps://prayinforrain.github.io/tags/react/Recent content in React on PrayinForRain.devHugo -- gohugo.iokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ \ No newline at end of file +React on PrayinForRain.devhttps://prayinforrain.github.io/tags/react/Recent content in React on PrayinForRain.devHugokoMon, 15 Apr 2024 16:43:32 +0900์Šคํ”„๋ ˆ๋“œ์‹œํŠธ๋ฅผ ์ตœ์ ํ™” ํ•˜์žhttps://prayinforrain.github.io/posts/2023/11/cell-refactoring/Tue, 07 Nov 2023 16:43:32 +0900https://prayinforrain.github.io/posts/2023/11/cell-refactoring/React๋กœ ์„ฑ๋Šฅ ๋˜์ฐพ๊ธฐ \ No newline at end of file diff --git a/tags/recoil/index.html b/tags/recoil/index.html index c2332f9..cbf5b5c 100644 --- a/tags/recoil/index.html +++ b/tags/recoil/index.html @@ -1,10 +1,10 @@ Recoil | PrayinForRain.dev -

Recoil

2022

+Hugo. \ No newline at end of file diff --git a/tags/recoil/index.xml b/tags/recoil/index.xml index 2c6ffb8..555bf64 100644 --- a/tags/recoil/index.xml +++ b/tags/recoil/index.xml @@ -1 +1,8 @@ -Recoil on PrayinForRain.devhttps://prayinforrain.github.io/tags/recoil/Recent content in Recoil on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Recoil on PrayinForRain.devhttps://prayinforrain.github.io/tags/recoil/Recent content in Recoil on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/redux/index.html b/tags/redux/index.html index 8fa66a2..f3eb695 100644 --- a/tags/redux/index.html +++ b/tags/redux/index.html @@ -1,10 +1,10 @@ Redux | PrayinForRain.dev -

Redux

2022

+Hugo. \ No newline at end of file diff --git a/tags/redux/index.xml b/tags/redux/index.xml index 3839615..8264f8c 100644 --- a/tags/redux/index.xml +++ b/tags/redux/index.xml @@ -1 +1,8 @@ -Redux on PrayinForRain.devhttps://prayinforrain.github.io/tags/redux/Recent content in Redux on PrayinForRain.devHugo -- gohugo.iokoFri, 18 Nov 2022 16:42:55 +0900Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/๐Ÿคท TL;DR Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค. Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค. ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž ๐Ÿšช ์„œ๋ก  ์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต useState๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. useState๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Redux on PrayinForRain.devhttps://prayinforrain.github.io/tags/redux/Recent content in Redux on PrayinForRain.devHugokoFri, 18 Nov 2022 16:42:55 +0900Redux vs Recoilhttps://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/redux-vs-recoil/<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>Redux๋Š” ์•ˆ์ •์ ์ด์ง€๋งŒ, ์„ ์–ธ๊ณผ ์‚ฌ์šฉ์ด ๋ณต์žกํ•˜๋‹ค.</li> +<li>Recoil์€ ์‚ฌ์šฉ์ด ๋งค์šฐ ์‰ฝ์ง€๋งŒ ์ •์‹ ๋ฒ„์ „์ด ์—†๋‹ค.</li> +<li>ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋งˆ์Œ์— ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์ž</li> +</ul> +<h2 id="-์„œ๋ก ">๐Ÿšช ์„œ๋ก </h2> +<p>์šฐ๋ฆฌ๋Š” React๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณดํ†ต <code>useState</code>๋ฅผ ํ†ตํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <code>useState</code>๋Š” ์ •๋ง ์„น์‹œํ•˜์ง€๋งŒ, ํ•œ ๊ฐ€์ง€ ๋„ˆ๋ฌด ํฐ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ผ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ <strong>์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ</strong>์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•ด ๊ณต๊ฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ์งง์€ ํ† ๋ง‰๊ธ€์„ ๋งˆ๋ จํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/storybook/index.html b/tags/storybook/index.html index 47ab742..34fffcf 100644 --- a/tags/storybook/index.html +++ b/tags/storybook/index.html @@ -1,10 +1,10 @@ Storybook | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/storybook/index.xml b/tags/storybook/index.xml index c74d64f..31c8320 100644 --- a/tags/storybook/index.xml +++ b/tags/storybook/index.xml @@ -1,2 +1,3 @@ -Storybook on PrayinForRain.devhttps://prayinforrain.github.io/tags/storybook/Recent content in Storybook on PrayinForRain.devHugo -- gohugo.iokoThu, 27 Apr 2023 15:32:50 +0900Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. \ No newline at end of file +Storybook on PrayinForRain.devhttps://prayinforrain.github.io/tags/storybook/Recent content in Storybook on PrayinForRain.devHugokoThu, 27 Apr 2023 15:32:50 +0900Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/tree-shaking/index.html b/tags/tree-shaking/index.html index 20ed7da..20e16f1 100644 --- a/tags/tree-shaking/index.html +++ b/tags/tree-shaking/index.html @@ -1,10 +1,10 @@ Tree-Shaking | PrayinForRain.dev -

Tree-Shaking

2023

+Hugo. \ No newline at end of file diff --git a/tags/tree-shaking/index.xml b/tags/tree-shaking/index.xml index f118ed0..b4895c5 100644 --- a/tags/tree-shaking/index.xml +++ b/tags/tree-shaking/index.xml @@ -1,2 +1,4 @@ -Tree-Shaking on PrayinForRain.devhttps://prayinforrain.github.io/tags/tree-shaking/Recent content in Tree-Shaking on PrayinForRain.devHugo -- gohugo.iokoWed, 25 Jan 2023 17:17:15 +0900Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. \ No newline at end of file +Tree-Shaking on PrayinForRain.devhttps://prayinforrain.github.io/tags/tree-shaking/Recent content in Tree-Shaking on PrayinForRain.devHugokoWed, 25 Jan 2023 17:17:15 +0900Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/typescript/index.html b/tags/typescript/index.html index e410289..4b80c38 100644 --- a/tags/typescript/index.html +++ b/tags/typescript/index.html @@ -1,10 +1,10 @@ TypeScript | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/typescript/index.xml b/tags/typescript/index.xml index dd15f70..a6963c7 100644 --- a/tags/typescript/index.xml +++ b/tags/typescript/index.xml @@ -1,7 +1,32 @@ -TypeScript on PrayinForRain.devhttps://prayinforrain.github.io/tags/typescript/Recent content in TypeScript on PrayinForRain.devHugo -- gohugo.iokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this. \ No newline at end of file +TypeScript on PrayinForRain.devhttps://prayinforrain.github.io/tags/typescript/Recent content in TypeScript on PrayinForRain.devHugokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p>Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p> \ No newline at end of file diff --git a/tags/vscode/index.html b/tags/vscode/index.html index 1422c62..17bf54a 100644 --- a/tags/vscode/index.html +++ b/tags/vscode/index.html @@ -1,10 +1,10 @@ Vscode | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/vscode/index.xml b/tags/vscode/index.xml index 8f83ce1..025de4f 100644 --- a/tags/vscode/index.xml +++ b/tags/vscode/index.xml @@ -1,3 +1,8 @@ -Vscode on PrayinForRain.devhttps://prayinforrain.github.io/tags/vscode/Recent content in Vscode on PrayinForRain.devHugo -- gohugo.iokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip; -๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, ๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค. -๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. \ No newline at end of file +Vscode on PrayinForRain.devhttps://prayinforrain.github.io/tags/vscode/Recent content in Vscode on PrayinForRain.devHugokoWed, 29 Mar 2023 15:17:00 +0900VSCode์˜ NPM Scripts๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒhttps://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/Wed, 29 Mar 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/03/npm-scripts-doesnt-work/<figure><img src="https://prayinforrain.github.io/images/posts/2023/03/npm-scripts-doesnt-work/01.jpeg" + alt="image"><figcaption> + <p>๋Šฆ์ž ์ž๊ณ  ๊ฐ“์ƒ์‚ฌ๋Š” ์ฒ™ ํ•˜๋Š” ์‚ถ์ด๋ž€&hellip;</p> + </figcaption> +</figure> + +<p>๋งฅ๋ถ๊ณผ ์นœํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ•œ์ง€ 2๋‹ฌ์ด ๋˜์—ˆ๋‹ค. ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ฐˆ์•„ ํƒ„ ์ด์œ ๋Š”, <em>๋งฅ์—์„œ ๋˜๋Š” ๊ฒƒ์ด ์œˆ๋„์šฐ์—์„œ ๋˜๊ณ , ์œˆ๋„์šฐ์—์„œ ๋˜๋Š” ๊ฒƒ์€ ๋งฅ์—์„œ ์•ˆ๋˜๋Š”</em> ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฒช์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฃผ๋ณ€์˜ ๋งฅ ์œ ์ €์—๊ฒŒ ๊ณ„์†ํ•ด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์š”์ฒญํ•˜๊ธฐ๋„ ๋ˆˆ์น˜๋ณด์ด๊ณ , ์–ธ์  ๊ฐ€๋Š” ๋งˆ์ฃผํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๋…€์„์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ๊ฐํ•œ ํˆฌ์ž๋ฅผ ํ–ˆ๋‹ค. ๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์œˆ๋„์šฐ์— ์ง€๋‚˜์น˜๊ฒŒ ๊ฐ•๊ฒฐํ•ฉ(?) ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ง€๊ธˆ์€ ๋งฅ๋„ ์œˆ๋„์šฐ๋„ ๋ชป ์“ฐ๋Š” ๊ทธ ์–ด๋”˜๊ฐ€์˜ ์ง€์ ์— ์žˆ๋‹ค.</p> +<p>๊ทธ๋ฆฌ๊ณ  ์ตœ๊ทผ์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค. ๋ถ€์ŠคํŠธ์บ ํ”„์—์„œ ๋งŒ๋‚œ ์‚ฌ๋žŒ๋“ค๊ณผ ์Šคํ„ฐ๋””๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™€์„œ ๋‹ค๊ฐ™์ด ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ ์ค‘์ด๋‹ค. ์ด ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์จ์•ผ ํ•˜๋Š”๋ฐ ์˜ค๋Š˜ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ์€ ์ด ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค. ํšŒ๊ณ ๋ฅผ ์•ˆ ์“ฐ๋‹ˆ ์ด์•ผ๊ธฐ๊ฐ€ ๋งŽ์ด ๋ฐ€๋ ค ํšก์„ค์ˆ˜์„ค ํ•˜๋Š”๊ตฌ๋‚˜..</p> \ No newline at end of file diff --git a/tags/web/index.html b/tags/web/index.html index 6aecb03..a052483 100644 --- a/tags/web/index.html +++ b/tags/web/index.html @@ -1,10 +1,10 @@ Web | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/web/index.xml b/tags/web/index.xml index f6517c4..6a3cb28 100644 --- a/tags/web/index.xml +++ b/tags/web/index.xml @@ -1,13 +1,78 @@ -Web on PrayinForRain.devhttps://prayinforrain.github.io/tags/web/Recent content in Web on PrayinForRain.devHugo -- gohugo.iokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ. -์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..? -๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ DocumentData ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ React.useState์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..? -๋ถ•๋Œ€ ๊ฐ๊ธฐ ์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” DocumentData๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” useState ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. -const [name, setName] = useState&lt;string&gt;(&#34;์ง€์ƒ๋ ฌ&#34;); ๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ name.split('')์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”. -any ํƒ€์ž…์˜ ๋ฌธ์ œ ์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”. -class Stack { arr: any[] = []; push(element: any) { this.Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ• ์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์˜ ํฌ๊ธฐ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. -์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ @next/bundle-analyzer ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/Ecma international Ecma International is an industry association dedicated to the standardization of information and communication systems Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. &gt; https://www.ecma-international.org/ -Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ) -์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ ECMA(European Computer Manufacturers Association)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด Ecma International๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/CSS์˜ display ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜์•ˆ์ชฝโ€™๊ณผ โ€˜๋ฐ”๊นฅ์ชฝโ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -display: ๋ฐ”๊นฅ์ชฝ block ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. inline ์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ inline์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— inline ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. -์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout) ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint) ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด Reflow๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„ CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” px์™€ %๋ถ€ํ„ฐ, em, rem, pt, vh, vw ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. -์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„ px๊ณผ %๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, px์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์ ˆ๋Œ€ ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด %๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ width: 10px;์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— width: 50%;๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . \ No newline at end of file +Web on PrayinForRain.devhttps://prayinforrain.github.io/tags/web/Recent content in Web on PrayinForRain.devHugokoWed, 15 Feb 2023 15:17:00 +0900Firebase๋ฅผ TypeScript์—์„œ ์‚ฌ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/Wed, 15 Feb 2023 15:17:00 +0900https://prayinforrain.github.io/posts/2023/02/firebase-with-typescript/<p>์ตœ๊ทผ์— ๋“ค์–ด์„œ Firebase๊ฐ€ ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ๋‹ค. ๋Œ€ํ•™๊ต์—์„œ ์จ๋ณธ ๊ฒฝํ—˜์€ ์žˆ์—ˆ๋Š”๋ฐ, ์˜ค๋žœ๋งŒ์— ๋งŒ๋‚œ Firebase๋Š” ์˜ˆ์ „๊ฐ™์ง€ ์•Š์•˜๋‹ค. ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” Firebase๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ Firestore๋Š” ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์™€๋„ ํƒ€์ž…์„ ์ œ๋Œ€๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ.</p> +<figure><img src="https://prayinforrain.github.io/images/posts/2023/02/firebase-with-typescript/01.png" + alt="image"><figcaption> + <p>์ž๋™์™„์„ฑ์ด ์•ˆ๋˜๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š”.. ๊ทธ.. ์™œ..?</p> + </figcaption> +</figure> + +<p>๋ฌผ๋ก  ๋ฐ์ดํ„ฐ์Šคํ‚ค๋งˆ๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Firebase ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ <code>DocumentData</code> ํƒ€์ž…์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋งž์ถฐ์ค„ ์˜๋ฌด๋Š” ์—†์ง€๋งŒ, ์ ์–ด๋„ <code>React.useState</code>์ฒ˜๋Ÿผ ์ œ๋„ค๋ฆญ์œผ๋กœ ํƒ€์ž…์„ ๋ฐ›์•„ ์–ด๋Š์ •๋„ ์•ฝ์†ํ•ด ์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ค. ์•„๋‹ˆ ๋ฐ”๋ผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€..?</p> +<h2 id="๋ถ•๋Œ€-๊ฐ๊ธฐ">๋ถ•๋Œ€ ๊ฐ๊ธฐ</h2> +<p>์šฐ์„  Firebase์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์˜ค๋Š” <code>DocumentData</code>๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.</p>Typescript Generichttps://prayinforrain.github.io/posts/2023/02/typescript-generic/Wed, 01 Feb 2023 02:01:15 +0900https://prayinforrain.github.io/posts/2023/02/typescript-generic/<p>ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ๋•Œ, ์šฐ๋ฆฌ๋Š” <code>useState</code> ํ›…์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="p">[</span><span class="nx">name</span><span class="p">,</span> <span class="nx">setName</span><span class="p">]</span> <span class="o">=</span> <span class="nx">useState</span><span class="p">&lt;</span><span class="nt">string</span><span class="p">&gt;(</span><span class="s2">&#34;์ง€์ƒ๋ ฌ&#34;</span><span class="p">);</span> +</span></span></code></pre></div><p>๋ญ”์ง„ ๋ชฐ๋ผ๋„, ์ € ๊บฝ์‡  ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ state๊ฐ€ ๋‹ค๋ฃฐ ์ƒํƒœ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์ถ”๋ก ํ•ด ์ฃผ์ง€๋งŒ, ์•„๋ฌดํŠผ <code>name.split('')</code>์ฒ˜๋Ÿผ string ํƒ€์ž…์ด ์ œ๊ณตํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋„ ์ž๋™์™„์„ฑํ•ด์ฃผ๊ณ , ์•„์ฃผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ € ๊บฝ์‡ ๊ด„ํ˜ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊ฑฐ์—์š”.</p> +<h2 id="any-ํƒ€์ž…์˜-๋ฌธ์ œ">any ํƒ€์ž…์˜ ๋ฌธ์ œ</h2> +<p>์•„๋ฌดํŠผ ์ด๋ฒˆ์— ๊ฐ€์ ธ์˜จ ์˜ˆ์ œ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ€์ถฉ ๋งŒ๋“ค๊ฒŒ์š”.</p> +<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">class</span> <span class="nx">Stack</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="nx">arr</span>: <span class="kt">any</span><span class="p">[]</span> <span class="o">=</span> <span class="p">[];</span> +</span></span><span class="line"><span class="cl"> <span class="nx">push</span><span class="p">(</span><span class="nx">element</span>: <span class="kt">any</span><span class="p">)</span> <span class="p">{</span> +</span></span><span class="line"><span class="cl"> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">element</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"> <span class="nx">pop() {</span> +</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">arr</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"> <span class="p">}</span> +</span></span><span class="line"><span class="cl"><span class="p">}</span> +</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">stringStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">stringStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="s2">&#34;ํฌ์™€์•™&#34;</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">stringStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">numberStack</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Stack</span><span class="p">();</span> +</span></span><span class="line"><span class="cl"><span class="nx">numberStack</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> +</span></span><span class="line"><span class="cl"><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">numberStack</span><span class="p">.</span><span class="nx">pop</span><span class="p">().</span><span class="nx">slice</span><span class="p">());</span> <span class="c1">// TypeError: numberStack.pop(...).slice is not a function +</span></span></span></code></pre></div><p>๋‹น์—ฐํžˆ <code>numberStack</code> ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€๋งŒ, ์ด ๋ฌธ์ œ๋ฅผ <strong>์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „๊นŒ์ง„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค</strong>. <code>Stack</code>์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ <code>any</code> ํƒ€์ž…์˜ ๋ฐฐ์—ด์ด๋‹ˆ๊นŒ์š”.</p>Tree Shakinghttps://prayinforrain.github.io/posts/2023/01/tree-shaking/Wed, 25 Jan 2023 17:17:15 +0900https://prayinforrain.github.io/posts/2023/01/tree-shaking/<h2 id="์šฉ๋Ÿ‰์„-์ ˆ์•ฝํ•˜๋Š”-๋ฐฉ๋ฒ•">์šฉ๋Ÿ‰์„ ์ ˆ์•ฝํ•˜๋Š” ๋ฐฉ๋ฒ•</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/tree-shaking/01.png" alt="bundle_map"></p> +<p>์›นํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ ์ง€ํ‘œ๋Š” ์•„๋งˆ ํŽ˜์ด์ง€์— ์‚ฌ์šฉ๋˜๋Š” <strong>ํŒŒ์ผ์˜ ํฌ๊ธฐ</strong>์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํฌ๊ธฐ๊ฐ€ ๋ฌด๊ฒ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ Œ๋”๋ง ํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒˆ๋“ค ํŒŒ์ผ์˜ ์šฉ๋Ÿ‰์„ ๋‹ค์ด์–ดํŠธ ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์— ๊ฝค ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.</p> +<p>์œ„ ์‚ฌ์ง„์€ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋˜ ์ค‘ <code>@next/bundle-analyzer</code> ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๋ฒˆ๋“ค ๋งต์„ ๊ทธ๋ ธ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํด์ˆ˜๋ก ๋ฒˆ๋“ค ์šฉ๋Ÿ‰์ด ํฌ๋‹ค๋Š” ๋œป์ด๋‹ˆ ์ปค๋‹ค๋ž€ ์ฒญํฌ ์œ„์ฃผ๋กœ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ์šฉ๋Ÿ‰์„ ์ค„์ผ ์ˆ˜ ์žˆ์„๊นŒ์š”? gzip์„ ํ†ตํ•ด ํŒŒ์ผ์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์ฝ”๋“œ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ <code>Tree-shaking</code>์ž…๋‹ˆ๋‹ค.</p>ECMAScripthttps://prayinforrain.github.io/posts/2023/01/ecmascript/Wed, 25 Jan 2023 16:35:01 +0900https://prayinforrain.github.io/posts/2023/01/ecmascript/<p><img src="https://prayinforrain.github.io/images/posts/2023/01/ecmascript/01.png" alt="untitled"></p> +<h2 id="ecma-international">Ecma international</h2> +<blockquote> +<p><strong>Ecma International</strong> is an industry association dedicated to the standardization of information and communication systems +<em>Emca International์€ ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์œ„ํ•œ ๊ตญ์ œ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค.</em> &gt; <a href="https://www.ecma-international.org/">https://www.ecma-international.org/</a></p> +</blockquote> +<p>Ecma International์€ Ecma ์‚ฌ์ดํŠธ์—์„œ ์†Œ๊ฐœํ•˜๋“ฏ, ์ •๋ณดํ†ต์‹  ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ตญ์ œ ๊ธฐ๊ตฌ์ž…๋‹ˆ๋‹ค. C#, JSON, .u3d ํ™•์žฅ์ž ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฉด์—์„œ์˜ ํ‘œ์ค€์•ˆ์„ ์ œ์‹œํ•˜์˜€์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ IEEE๊ฐ™์€ ์กด์žฌ๋กœ ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.(์ œ ์ƒ๊ฐ)</p> +<p>์œ ๋Ÿฝ์—์„œ ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์„ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๋ฆฝ๋˜์–ด์„œ <strong>ECMA</strong>(<em>European Computer Manufacturers Association</em>)๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋‚˜ ์œ ๋Ÿฝ๊ตญ๊ฐ€ ๋ฟ ์•„๋‹ˆ๋ผ ์ „์„ธ๊ณ„์˜ ํ‘œ์ค€์œผ๋กœ ํ™œ์šฉ๋˜๊ธฐ ์œ„ํ•ด <strong>Ecma International</strong>๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. <strong>ECMA</strong> ์ž์ฒด๋Š” ๋‘๋ฌธ์ž์–ด์ด์ง€๋งŒ ์ง€๊ธˆ์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ๊ณ ์œ ๋ช…์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์…ˆ์ด์ฃ . ๋”ฐ๋ผ์„œ <strong>Ecma</strong>๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค.</p>CSS์˜ display ์†์„ฑhttps://prayinforrain.github.io/posts/2023/01/css-display/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/css-display/<p>CSS์˜ <code>display</code> ์†์„ฑ์€ HTML element๊ฐ€ block์ธ์ง€, inline์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ž์‹ element๋“ค์„ ์–ด๋–ค ์‹์œผ๋กœ ํ‘œ์‹œํ• ์ง€๋ฅผ ์ •ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์š”์†Œ ์ž์ฒด๊ฐ€ ํ˜•์ œ ์š”์†Œ์™€ ๋ฐฐ์น˜๋˜๋Š” ๋ฐฉ๋ฒ•๊ณผ, ์ž์‹ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— โ€˜<strong>์•ˆ์ชฝ</strong>โ€™๊ณผ โ€˜<strong>๋ฐ”๊นฅ์ชฝ</strong>โ€™์œผ๋กœ ์†์„ฑ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="display">display:</h2> +<h3 id="๋ฐ”๊นฅ์ชฝ">๋ฐ”๊นฅ์ชฝ</h3> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/css-display/01.png" alt="Untitled"></p> +<ul> +<li><code>block</code> +<ul> +<li>ํ•œ ์ค„์—๋Š” ํ•œ ์š”์†Œ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.</li> +</ul> +</li> +<li><code>inline</code> +<ul> +<li>์š”์†Œ๊ฐ€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ <code>inline</code>์ด ์ ์šฉ๋œ ์š”์†Œ์˜ ์ „ํ›„์— <code>inline</code> ์š”์†Œ๋ฅผ ํ‘œ์‹œํ•  ๊ณต๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<p>์‚ฌ์ง„์˜ div๋“ค์€ ๊ฐ๊ฐ <code>inline</code>, <code>block</code> ์†์„ฑ์„ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด <code>block</code> ์†์„ฑ์˜ ์š”์†Œ๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, <code>inline</code> ์†์„ฑ์€ ์ถฉ๋ถ„ํ•œ ๊ณต๊ฐ„์ด ์žˆ์œผ๋ฉด ํ•œ ์ค„์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. <code>span</code>๊ณผ <code>p</code>ํƒœ๊ทธ์˜ ์ฐจ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.</p>๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅhttps://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/Mon, 16 Jan 2023 16:38:15 +0900https://prayinforrain.github.io/posts/2023/01/browser-rendering-performance/<h2 id="๋ธŒ๋ผ์šฐ์ €-๋ Œ๋”๋ง">๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง</h2> +<p>์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์–ด๋–ป๊ฒŒ HTML ๋ฌธ์„œ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ฆฌ๋Š”์ง€ ๊ณผ์ •์— ๋Œ€ํ•ด ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง์€ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.</p> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/browser-rendering-performance/01.png" alt="Untitled"></p> +<ul> +<li>์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML, CSS, JavaScript ํŒŒ์ผ์„ ๋ฐ›์•„์™€ HTML โ†’ DOM, CSS โ†’ CSSOM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Render Tree๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.</li> +<li>Render Tree์˜ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. Render Tree์˜ ๋ฃจํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Layout)</li> +<li>๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™”๋ฉด์— ์‹ค์ œ ๋…ธ๋“œ๋“ค์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. (Paint)</li> +<li>์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•œ ์ œ์–ด ๋“ฑ์œผ๋กœ HTML ์š”์†Œ์˜ ํฌ๊ธฐ๋‚˜ ์œ„์น˜์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋ฉด <code>Reflow</code>๋ผ๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. +<ul> +<li>Reflow๋Š” Render Tree ๊ตฌ์„ฑ๋ถ€ํ„ฐ <strong>๋ชจ๋“  ์ž‘์—…์„ ๋‹ค์‹œ ์ˆ˜ํ–‰</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +<li>๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ ์ž์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์ƒ‰์ƒ์ด๋‚˜ visibility ๋“ฑ์˜ ๋ณ€๊ฒฝ๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” Paint ๊ณผ์ •๋งŒ์„ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (Repaint)</li> +<li>๋”ฐ๋ผ์„œ ๋น„์šฉ์ด ํฐ <strong>Reflow์˜ ๋ฐœ์ƒ์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”</strong>ํ•ฉ๋‹ˆ๋‹ค.</li> +</ul> +</li> +</ul> +<iframe width="560" height="315" src="https://www.youtube.com/embed/TZz9VHjJzMk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe> +<p>์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๋‚ด์šฉ์ธ ๊ฒƒ ๊ฐ™์•„์š” CSS์˜ <code>will-change</code>๋ฅผ ํ†ตํ—ค ๋ถˆํ•„์š”ํ•œ GPU ์ ์œ ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”!</p>CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„https://prayinforrain.github.io/posts/2023/01/size-units-in-css/Fri, 13 Jan 2023 23:39:15 +0900https://prayinforrain.github.io/posts/2023/01/size-units-in-css/<h2 id="css์˜-ํฌ๊ธฐ-๋‹จ์œ„">CSS์˜ ํฌ๊ธฐ ๋‹จ์œ„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/01/size-units-in-css/01.png" alt="Untitled"></p> +<p>CSS์—๋Š” ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ์•„๋Š” <code>px</code>์™€ <code>%</code>๋ถ€ํ„ฐ, <code>em</code>, <code>rem</code>, <code>pt</code>, <code>vh</code>, <code>vw</code> ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋‹จ์œ„๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ์š”, ์ด ํฌ๊ธฐ ๋‹จ์œ„๋“ค์„ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.</p> +<h2 id="์ƒ๋Œ€-๋‹จ์œ„์™€-์ ˆ๋Œ€-๋‹จ์œ„">์ƒ๋Œ€ ๋‹จ์œ„์™€ ์ ˆ๋Œ€ ๋‹จ์œ„</h2> +<p><code>px</code>๊ณผ <code>%</code>๋ฅผ ๋จผ์ € ๋น„๊ตํ•ด ๋ณด๋ฉด, <code>px</code>์€ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์˜ 1ํ”ฝ์…€์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์–ด๋Š ํ™”๋ฉด์—์„œ๋‚˜ ๊ฐ™์€ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ <strong>์ ˆ๋Œ€ ๋‹จ์œ„</strong>์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด <code>%</code>๋Š” ๋ณดํ†ต ๋ถ€๋ชจ element์˜ ํฌ๊ธฐ๋ฅผ ์ƒ์†๋ฐ›์•„ ๊ทธ์˜ ์ •ํ•ด์ง„ ๋น„์œจ๋งŒํผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰ <code>width: 10px;</code>์ธ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ element์— <code>width: 50%;</code>๋ฅผ ์ฃผ๋ฉด 5px์ด ๋˜๊ฒ ์ฃ . ์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๋Š” ๋‹จ์œ„๋ฅผ <strong>์ƒ๋Œ€ ๋‹จ์œ„</strong>๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.</p> \ No newline at end of file diff --git a/tags/yarn/index.html b/tags/yarn/index.html index e5dcf6e..28d493b 100644 --- a/tags/yarn/index.html +++ b/tags/yarn/index.html @@ -1,10 +1,10 @@ Yarn | PrayinForRain.dev - +Hugo. \ No newline at end of file diff --git a/tags/yarn/index.xml b/tags/yarn/index.xml index 47f9306..cec0c5f 100644 --- a/tags/yarn/index.xml +++ b/tags/yarn/index.xml @@ -1,4 +1,14 @@ -Yarn on PrayinForRain.devhttps://prayinforrain.github.io/tags/yarn/Recent content in Yarn on PrayinForRain.devHugo -- gohugo.iokoTue, 30 May 2023 02:27:49 +0900์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„ ์ตœ๊ทผ ์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ Yarn berry๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  node_modules ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— node_modules์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค. -ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค. -๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค.npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ node_modules ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด npm i ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” yarn๊ณผ pnpm์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. -๐Ÿคท TL;DR npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค. ๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. \ No newline at end of file +Yarn on PrayinForRain.devhttps://prayinforrain.github.io/tags/yarn/Recent content in Yarn on PrayinForRain.devHugokoTue, 30 May 2023 02:27:49 +0900์–€ ๋ฒ ๋ฆฌ ํƒํ—˜ํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/Tue, 30 May 2023 02:27:49 +0900https://prayinforrain.github.io/posts/2023/05/exploring-yarn-berry/<h2 id="๋‚ด-๋ ˆํฌ์˜-์œ„ํ—˜ํ•œ-๋…€์„">๋‚ด ๋ ˆํฌ์˜ ์œ„ํ—˜ํ•œ ๋…€์„</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2023/05/exploring-yarn-berry/01.png" alt="cds issue"></p> +<p>์ตœ๊ทผ <a href="https://github.com/c-h-w-h/cds">์ฐจ๊ฐ€์šด ๋””์ž์ธ ์‹œ์Šคํ…œ(CDS)</a>์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ <strong>Yarn berry</strong>๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์œ ๋Š” ํ›„์ˆ ํ•  <code>node_modules</code> ์ž์ฒด์˜ ๋‹จ์ ๋„ ์žˆ๊ณ , ๋‚ด ๋ฐ์Šคํฌํƒ‘์ด HDD๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— <code>node_modules</code>์˜ ์ˆ˜์‹ญ๋งŒ ๊ฐœ์˜ ํŒŒ์ผ๋“ค์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๋Š๋ ค์„œ ๊ฐ•๋ ฅ ์ถ”์ฒœํ–ˆ๋‹ค.</p> +<p>ํ•˜์ง€๋งŒ ์‚ฌ์‹ค ๋‚˜๋Š” PnP๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒจํ‚ค์ง€๋“ค์„ resolveํ•˜๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฅธ๋‹ค. ๊ทธ์ € ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์˜ค๋ฅ˜ ์—†์ด ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์—ด์‹ฌํžˆ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ํŒ€์›๋“ค์—๊ฒŒ ์„ค๋ช…ํ•  ๋•Œ ๋งˆ๋‹ค ๋ง‰์—ฐํžˆ ์–€๋ฒ ๋ฆฌ๊ฐ€ ์ž˜๋ชปํ–ˆ๊ฒ ์ฃ ~ ํ•˜๋Š” ์Šค์Šค๋กœ์—๊ฒŒ ์ž๊ดด๊ฐ์„ ๋Š๊ปด ์ด ๊ธฐํšŒ์— ํ•œ ๋ฒˆ Yarn PnP๋ฅผ ๋˜‘๋ฐ”๋กœ ๋งˆ์ฃผํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>Next.js Storybook์— Yarn PnP ์ ์šฉํ•˜๊ธฐhttps://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/Thu, 27 Apr 2023 15:32:50 +0900https://prayinforrain.github.io/posts/2023/04/nextjs-storybook-with-pnp/<h2 id="storybook์„-์“ฐ๋ ค๊ณ -ํ–ˆ๋Š”๋ฐ">Storybook์„ ์“ฐ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ</h2> +<p>์ตœ๊ทผ Storybook์„ ์‚ฌ์šฉํ•  ์ผ์ด ๋ฌด์ฒ™ ๋งŽ์•˜๋‹ค. ์–ธ์  ๊ฐ€๋Š” ํฌ์ŠคํŒ…์„ ํ•ด์•ผ ํ•  CDS ํ”„๋กœ์ ํŠธ๋ถ€ํ„ฐ <a href="https://prayinforrain.github.io/posts/2023/04/numble-talk/">๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€</a>๋„ ์žˆ์—ˆ๊ณ &hellip; ์ฒ˜์Œ์—” ๋„ˆ๋ฌด ๋‚ฏ์„ค์—ˆ์ง€๋งŒ ๊ณตํ†ต๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ฏธ๋ฆฌ ์„ค๊ณ„ํ•ด ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ๊น”๋”ํ•œ ์„ค๊ณ„๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋งค๋ ฅ์„ ๋Š๊ผˆ๋‹ค.</p> +<p>๊ทธ๋Ÿฐ๋ฐ ๋ฌธ์ œ๋Š” ๋‚ด ์ž‘์—… ํ™˜๊ฒฝ์— ์žˆ์—ˆ๋‹ค. ๊ฝค ์—ฐ์‹์ด ๋œ ์œˆ๋„์šฐ ๋ฐ์Šคํฌํƒ‘์— ์ˆ˜์‹ญ๊ฐ€์ง€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ž์–ด ๋†“๊ณ , ์š”์ƒˆ๋Š” ๊ฒŒ์ž„์—๋„ ๋ชป ์“ฐ๋Š” ์ฒ˜์ฐธํ•œ ์„ฑ๋Šฅ์˜ HDD์— ๋ ˆํฌ๋ฅผ ๋‘๊ณ  ์“ฐ๋‹ˆ ์ข…์†์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜๋„ ์ปคํ”ผ ํ•œ ์ž” ํƒ€์™€์•ผ ํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ Yarn Berry์˜ ์‚ฌ์šฉ์ด ๋ฐ˜ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๋„˜๋ธ” ์ฑŒ๋ฆฐ์ง€ ๋•Œ Yarn Berry๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์• ์„ํ•˜๊ฒŒ๋„ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์— ์‹œ๋‹ฌ๋ ค ํฌ๊ธฐํ–ˆ๋Š”๋ฐ, ์—ฌ์œ ๊ฐ€ ์ƒ๊ธด ์ง€๊ธˆ ๋งˆ์Œ์„ ๋‹ค์žก๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.</p>npm vs yarn vs pnpmhttps://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/Fri, 18 Nov 2022 16:42:55 +0900https://prayinforrain.github.io/posts/2022/11/npm-vs-yarn-vs-pnpm/<p>์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์•„๋ฌด ์˜์‹ฌ ์—†์ด npm์„ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ์ด๋”ฐ๊ธˆ์”ฉ <code>node_modules</code> ํด๋”๊ฐ€ ์ €๋ฅผ ๊ณ ํ†ต์Šค๋Ÿฝ๊ฒŒ ํ–ˆ๋˜ ์‹œ๊ฐ„๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐํ™”์— ์ •๋ง ์ด์ƒํ•œ ํ–‰๋™๋งŒ ํ•˜์ง€ ์•Š์œผ๋ฉด <code>npm i</code> ํ•œ ์ค„๊ณผ ์ปคํ”ผ ํ•œ ์ž”์œผ๋กœ ๋ชจ๋“ ๊ฒŒ ๋ฌธ์ œ ์—†์ด ๋™์ž‘ํ–ˆ์œผ๋‹ˆ๊นŒ์š”. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์Šฌ๋ž™์˜ ์–ด๋–ค ๋ถ„์„ ํ†ตํ•ด, npm๋ณด๋‹ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” <code>yarn</code>๊ณผ <code>pnpm</code>์„ ์ฒดํ—˜ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.</p> +<h2 id="-tldr">๐Ÿคท TL;DR</h2> +<ul> +<li>npm์˜ ์˜์กด์„ฑ ๊ด€๋ฆฌ๋Š” ์‚ฌ์‹ค ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค.</li> +<li>์ด ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๊ฐ€ yarn, pnpm์ด๋‹ค.</li> +<li>๊ฐ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์‰ฝ๋‹ค. ๊ธ์ •์ ์œผ๋กœ ๊ณ ๋ คํ•ด๋ณด์ž.</li> +</ul> +<h2 id="-npm">๐ŸŽ npm</h2> +<p><img src="https://prayinforrain.github.io/images/posts/2022/11/npm-vs-yarn-vs-pnpm/npm_vs_yarn_01.png" alt="Untitled"></p> \ No newline at end of file