[ํ”„๋ก ํŠธ์—”๋“œ ์ƒ์กด์ฝ”์Šค 10๊ธฐ] 8์ฃผ์ฐจ ํšŒ๊ณ 

2024. 3. 24. 21:16ใ†Education/Megaptera

๐Ÿ“…  24.03.18 ~ 24.03.24

๋””์ž์ธ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  styled-components๋ฅผ ํ™œ์šฉํ•˜์—ฌ CSS in JS๋ฅผ ํ•™์Šตํ•˜๋Š” ์ฃผ์ฐจ์˜€๋‹ค. 

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๋‚˜๋Š” ์ด๋ฒˆ์ฃผ์— ๋ฌด์—‡์„ ๋ฐฐ์› ๋Š”๊ฐ€? 

 

์ด๋ฒˆ์ฃผ๋Š” ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•˜๊ณ  CSS in JS์˜ ๋Œ€ํ‘œ์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ styled-components ํ•™์Šตํ•˜๋Š” ์ฃผ์ฐจ์˜€๋‹ค. CSS in JS ๋Œ€ํ•ด ๊ถ๊ธˆํ–ˆ์—ˆ๋Š”๋ฐ ํ•™์Šตํ•˜๊ฒŒ ๋˜์–ด์„œ ์žฌ๋ฏธ์žˆ์—ˆ๋‹ค. CSS์˜ ์—ญ์‚ฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ Web์˜ ์—ญ์‚ฌ๊นŒ์ง€ ์•Œ๊ฒŒ ๋˜๋Š” ์ฃผ์ฐจ์˜€๋‹ค. 

 

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

 

CSS in JS์€ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์„ฑ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ์Šคํƒ€์ผ๋ง ๊ธฐ์ˆ ์„ ์˜๋ฏธํ•œ๋‹ค.

ํŽ˜์ด์Šค๋ถ์˜ ์„ฑ์žฅ์œผ๋กœ ์ธํ•ด React๋ฅผ ๋น„๋กฏํ•œ Framework๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด์„œ ๋ฌธ์„œ ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด ์ž๋ฆฌ์žก๊ฒŒ ๋˜์—ˆ๊ณ , ๋ฌธ์„œ๋ฅผ ํŽธํ•˜๊ฒŒ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ CSS๋Š” ๋ฌธ์„œ๋ฅผ ๊พธ๋ฏธ๋Š” ๋ฐ ์žˆ์–ด์„œ ์œ ์šฉํ–ˆ์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์Šค๋Ÿฌ์šด UI์™€ ๋ชจ๋“ˆ๊ณผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐฉ์‹์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ๋Š” ๋งž์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ๋ฐฉ์‹์—์„œ CSS๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋…์ด CSS in JS์ด๋‹ค.

 

CSS in JS๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Styled-Components๋Š” React์˜ Props๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ES6 ์ตœ์‹  ๋ฌธ๋ฒ• Tagged Template Literals์„ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•œ๋‹ค. Template Literals๋Š” ์ž˜ ์•Œ๊ณ  ์žˆ์—ˆ์œผ๋‚˜, ํ•ด๋‹น ๋ฌธ๋ฒ•์€ ์ฒ˜์Œ ๋“ค์–ด๋ณด์•˜๋‹ค. ์•„์ง๋„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ฌธ๋ฒ•์„ ์ดํ•ดํ•˜์ง„ ๋ชปํ•ด์„œ ์ถ”๊ฐ€์ ์ธ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•ด ๋ณด์ธ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๊ฐ„๋‹จํ–ˆ์œผ๋‚˜ ๋ฌธ์ œ๋Š” Props๋กœ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์„ ํ•˜๋Š” ๋ฐฉ์‹์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ํ—ท๊ฐˆ๋ ธ๋‹ค. ๋˜ํ•œ Styled-Components๋ฅผ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ• ์ง€ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค. ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋ถ„๋ฆฌํ–ˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ์— ์œ„์น˜ํ•˜๋„๋ก ํ–ˆ๋‹ค. ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•˜๋‹ค ๋ณด๋‹ˆ ์Šคํƒ€์ผ๋ง ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ  ์ธ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„  Styled-Components๋กœ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ๋์—๋Š” Style ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

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

 

๋‹คํฌ๋ชจ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด usehooks๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Context API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ContextAPI๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ThemeProvider์„ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด Styled-component๊ฐ€ ์ œ๊ณตํ•˜๋Š” ThemeProvider๋ฅผ ์ปค์Šคํ…€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณด๋‹ˆ ์žฌ๋ฏธ์žˆ์—ˆ๊ณ  useLayoutEffect hook๋„ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋‹ค. useEffect์™€ ์ฐจ์ด์ ์ด ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฒคํŠธ ํ˜ธ์ถœ ์‹œ์ ์˜ ์ฐจ์ด๋ฅผ ๊ฒฝํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. 

 

 

๐ŸŽฏ ํ•™์Šต์ด ๋” ํ•„์š”ํ•œ ๋ถ€๋ถ„

 

๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ store ์ƒ์„ฑ์„  useSyncExternalStore hook์„ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค.

๋Œ€๋žต ๋™์ž‘์›๋ฆฌ๋ฅผ ์ดํ•ดํ•ด์„œ ์ ์šฉํ–ˆ์œผ๋‚˜ ๋ฌธ์ œ๋Š” Test ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ Mocking ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ChatGPT์—๊ฒŒ ๋ฌผ์–ด๋ณด์•˜์œผ๋‚˜ ๋Œ€๋‹ต์ด ์˜ ๋‚ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜๋‹ค. ๋” ๊ณ ๋ฏผํ•˜๊ณ  ์‹œ๋„ํ•ด ๋ณด์•„์•ผ๊ฒ ๋‹ค. 

 

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

์‹œ๋„ํ•ด ๋ณผ ํ•„์š”์„ฑ์„ ๋Š๊ผˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์™ธ์›Œ๋ฒ„๋ ค์„œ ์ต์ˆ™ํ•ด์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š”๊ฐ€..๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

์ด๋ฒˆ์ฃผ๋Š” ์—ด์‹ฌํžˆ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•˜๋‹ค. Styled-Components ๋ง๊ณ  Tailwind CSS, emotion ์‚ฌ์šฉ๋ฒ•๋„ ํ•™์Šตํ•ด๋ณด์ž๊ณ 

์Šค์Šค๋กœ ํ•™์Šต ๊ณ„ํš์„ ์„ธ์› ์ง€๋งŒ.... Styled-Components๋งŒ ํ•™์Šตํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ณผ์ œ๋ฅผ ํ•˜๋Š”๋ฐ Styled-Components ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. CSS ๋ผ๊ณ  ๋„ˆ๋ฌด ์‰ฝ๊ฒŒ ์ƒ๊ฐํ–ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค. ๋‚˜ ์ž์‹  ๋ฐ˜์„ฑํ•˜์ž.