๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฟ Project

FE ํ”„๋กœ์ ํŠธ ์‹œ ์„ ํƒํ•˜๋Š” ๊ธฐ์ˆ ์Šคํƒ๋“ค - yarn, emotion, materail UI...

by Tamii 2021. 12. 19.
๋ฐ˜์‘ํ˜•

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด, ์ˆ˜๋งŽ์€ ์„ ํƒ์˜ ๊ธฐ๋กœ์— ๋†“์ด๊ฒŒ ๋œ๋‹ค. ๋ฐ”๋กœ.. ๊ธฐ์ˆ ์Šคํƒ๋“ค

์‚ฌ์‹ค ์ผ์ „์—” ํฐ ๊ณ ๋ฏผ์—†์ด ๋งŽ์ด ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒํ•œ ๊ฒƒ๋“ค์ด ์žˆ์—ˆ์ง€๋งŒ,

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋‚˜์—๊ฒŒ ๋งค์šฐ ํฌ๊ณ  ์†Œ์ค‘ํ•˜๊ธฐ์— ์„ ํƒ์ง€๋“ค์„ ๋น„๊ตํ•ด๋ณด๊ฒ ๋‹ค!

 


1.  Package Manager  - npm vs yarn

npm (node package Manager)

Node.js ๊ธฐ๋ณธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž

 

yarn

npm๊ณผ ํฌ๊ฒŒ ์ฐจ์ด๋Š” ์—†์ง€๋งŒ , ๋ฒ„์ „ ์ฐจ์ด๋กœ ์ธํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ํŒจํ‚ค์ง€๊ฐ€ ์•ฝ๊ฐ„ ๋” ๊ฐ€๋ฒผ์›€

  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋‹ค
  • ์†๋„์™€ ์•ˆ์ „์„ฑ์ด ๋ฏธ์„ธํ•˜๊ฒŒ ์ข‹์ง€๋งŒ performance ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š๋‹ค.
  • ๋ณ‘๋ ฌ์  ํŒจํ‚ค์ง€ ์„ค์น˜, ๋ฒ„์ „์ฐจ์ด๋กœ ์ธํ•œ ๋ฒ„๊ทธ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

โœ”๏ธ ๋‘˜ ์‚ฌ์ด์— ํฐ ์˜๋ฏธ๊ฐ€ ์—†์ง€๋งŒ ์žฅ์ ์ด ๋” ํ•œ yarn์„ ์•ˆ ์“ธ ์ด์œ ๊ฐ€ ์—†๊ธฐ์— yarn์„ ํƒ

 

 

2. Frame Work - CNA vs CRA

CNA

webpack ์„ค์ • ์—†์ด SSR์„ ์ œ๊ณตํ•˜๋Š” Next.js๋ฅผ ์‚ฌ์šฉํ•œ app์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

CRA

webpack ์„ค์ • ์—†์ด React app์„ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

 

 

โœ”๏ธ ๋‘๊ฐ€์ง€ ๋‹ค webpack์ด๋‚˜ ๋ชจ๋“ˆ ์„ค์ •์„ ๋”ฐ๋กœ ํ•  ํ•„์š”์—†์ด ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ app ์ƒ์„ฑ์‹œ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ๋ฐ, 

์‚ฌ์‹ค SEO๊ฐ€ ์ข‹์œผ๋ ค๋ฉด CNA๊ฐ€ ์ข‹์ง€๋งŒ , AWS์™€  EC2๊ด€๋ฆฌ ๋“ฑ ๋‚ด๋ถ€ ์‚ฌ์ •์œผ๋กœ ์ธํ•ด CRA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

-> Next.js์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ์—ฌ๊ธฐ์— ์ž์„ธํžˆ ์ ์–ด๋†“์•˜๋‹ค.

 

3. Design - Material UI vs Antd Design

 

Material UI

  • React ๊ฐœ๋ฐœ ์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” UI framework

 

Ant Design

  • ๋ธŒ๋ผ์šฐ์ €, ์„œ๋ฒ„, ๋ Œ๋”๋ง ํ™˜๊ฒฝ ์ง€์›
  • ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ์‰ฌ์›€
  • props์—๋Œ€ํ•œ type์ง€์ •์ด ๋˜์–ด ์žˆ์Œ

โœ”๏ธ ๋” ๋‹ค์–‘ํ•œ๋””์ž์ธ์„ ๋ณด์œ ํ•œ MaterialUI์™€ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ๋ฌธ์„œํ™”๊ฐ€ ๋˜์–ด์žˆ๊ณ  type์•ˆ๋‚ด๊ฐ€ ์ž˜ ๋˜์–ด์žˆ์–ด ์„ ํƒ

 

4. Style Library - SCSS vs styled-component vs emotion

 

SCSS

  • CRA์— ๋‚ด์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ html๊ณผ css ๊ฐ€ ๋ถ„๋ฆฌ๋จ

styled-component

  • ๋Œ€ํ‘œ์ ์ธ CSS-In-JS๋กœ JS์•ˆ์—์„œ CSS๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

emotion

  • CSS-In-JS
  • ๊ฐ€๋ฒผ์šด ํ™˜๊ฒฝ, ๋‹ค์–‘ํ•œ style ์ž‘์„ฑ๋ฐฉ์‹ ์ง€์› (styled-components , SCSS , inline )

โœ”๏ธ styled-component๋ณด๋‹ค ๊ฐ€๋ฒผ์šฐ๋ฉด์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š” ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ emoiton ์„ ํƒ

 

 

5. ์ƒํƒœ๊ด€๋ฆฌ - Redux vs Recoil

 

Redux

  • ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›๊ณผ ์ž๋ฃŒ
  • dev tool์˜ ํŽธ๋ฆฌํ•จ

Recoil

  • ๊ฐ€๋ฒผ์šด setting ํ™˜๊ฒฝ
  • ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ์ฒ˜๋ฆฌ์™€ ๊ณ„์‚ฐ๋œ ๊ฐ’ ์ฒ˜๋ฆฌ๊ฐ€ ๋‚ด๋ถ€ ๋ชจ๋“ˆ๋กœ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ ์„œ๋ธŒ์…‹์„ ๋Œ€์ƒ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€, ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ

โœ”๏ธ hook ๊ณผ ๋น„์Šทํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๊ณ  Component ๋ฐ์ดํ„ฐ ์กฐ๊ฐ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๋น„๋™๊ธฐ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ œ์–ดํ•˜๋Š” ์†”๋ฃจ์…˜์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ

 

 

6. Test Library -  Enzyme vs react-testing-library

 

์ž ๊น! JEST๋ž€?

: JavaScript Testing Framework ๋กœ ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ

 

JEST ํ…Œ์ŠคํŠธ๋Ÿฌ๋„ˆ ๊ธฐ๋ฐ˜์— ์‚ฌ์šฉํ•  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค.

mobile-web์˜ test ์ฃผ ๋ชฉ์ ์€ ์‚ฌ์šฉ์ž ํ–‰๋™ ๊ธฐ๋ฐ˜์˜ test ์ง„ํ–‰
์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค์— ๊ธฐ๋ฐ˜ํ•œ test code ์ž‘์„ฑ ํ›„ ํ•„์š”์— ๋”ฐ๋ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ทจ์‚ฌ์„ ํƒํ•  ์˜ˆ์ •

ex) ์ƒํ’ˆ ๋“ฑ๋ก (testing-library) → state ํ™•์ธ(hooks-library) → DOM ๋ณ€๊ฒฝ ํ™•์ธ(testing-library) ๋Š๋‚Œ

 

Enzyme

๋™์ž‘ ์œ„์ฃผ ํ…Œ์ŠคํŠธ

  • Airbnb์—์„œ ๋งŒ๋“  testing library
  • ๊ฐ€์ƒ DOM์„ ๊ธฐ์ค€์œผ๋กœ test ๊ฐ€๋Šฅ
  • props , state ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— props , state ๊ฒ€์ฆ์— ์šฉ์ดํ•œ ๋ฐ˜๋ฉด ํ…Œ์ŠคํŠธ๋Š” ์ทจ์•ฝํ•จ.

ํ–‰๋™ ๊ธฐ๋ฐ˜์˜ test๋ฅผ ํ•˜๊ธฐ์— ๋ถˆํ•„์š”ํ•œ ๋‹จ์œ„ test ์œ„์ฃผ๋ฉฐ, Class ํ˜• component ๊ธฐ๋ฐ˜์˜ test code๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋‚ด๋ถ€์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์— ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ ๋ชฉ์ ๊ณผ ๋งž์ง€ ์•Š์Œ.

 

 

react-testing-library

ํ–‰์œ„ ์ฃผ๋„ ํ…Œ์ŠคํŠธ

  • CRA ์‚ฌ์šฉ ์‹œ ๊ธฐ๋ณธ ์ œ๊ณต
  • React ์—์„œ ๊ถŒ์žฅํ•˜๋Š” test library
  • ์‹ค์ œ DOM ๊ธฐ์ค€์œผ๋กœ test (jsdom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ)
  • React component ๋‹จ์œ„ํ…Œ์ŠคํŠธ ๋ฐ ํ†ตํ•ฉํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ

โœ”๏ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋”ฐ๋ฅธ React ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์ž‘ํ•˜๋Š” ๊ด€์ ์˜ test ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์ฃผ ๋ชฉ์ ์— ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์„ ํƒ

 

 

6-2) ๊ทธ๋ ‡๋‹ค๋ฉด.. Rcoil / hooks/ ์ „์—ญ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

 

  • ์—ฌ๋Ÿฌ component์—์„œ ์‚ฌ์šฉํ•˜๋Š” state ๊ด€๋ฆฌ ์‹œ ์‚ฌ์šฉ
  • hooks์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜ ๊ฐ’ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์—ฌ๋Ÿฌ custom hooks ๊ฐ€ ์—ฌ๋Ÿฌ component์™€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ
  • ํ•„์š”์— ๋”ฐ๋ผ Wrapping ํ•„์š”
    • <RecoilRoot >
    • <Suspense>

recoil์˜ atom ๊ณผ selector๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ custom ํ•˜์—ฌ test ํ•  ์ˆ˜ ์žˆ์Œ. ์‚ฌ์šฉ์ž interaction ์— ๋”ฐ๋ฅธ ์ƒํƒœ test์‹œ ์‚ฌ์šฉํ•˜๊ธฐ ์ ์ ˆ

 

react-recoil-hooks-testing-library

  • weekly downloads 1,584 ๐Ÿ˜ฎ
  • ๊ทธ๋ž˜๋„ TypeScript ๊ธฐ๋ฐ˜์ธ ์ ์€ ๋‹คํ–‰

 

โœ”๏ธ ํ˜„์žฌ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”์„ฑ์ด ๋Š๊ปด์ง€์ง€ ์•Š์Œ. ๊ตฌํ˜„ ์ค‘ ํ•„์š”ํ•จ์„ ๋Š๋ผ๋ฉด ์‚ฌ์šฉํ•  ์˜ˆ์ •

 

 

 


์ด๋ ‡๊ฒŒ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ๊ธฐ์ˆ  ์Šคํƒ๋“ค์„ ์„ ์ •ํ–ˆ๋‹ค.

๋ฌผ๋ก  ์ด ์„ ํƒ๋“ค์€ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜๋„ ์ด์œ ๋ฅผ ์•Œ๊ณ  ์“ฐ๋Š” ๊ฒƒ๊ณผ ๋ชจ๋ฅด๋Š” ๊ฒƒ์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ธฐ์—.. ๐Ÿ˜Ž

๋Œ“๊ธ€