๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’๊ณต๋ถ€/ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ์ฝ”์Šค

[ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ์ฝ”์Šค] 5์ฃผ์ฐจ -๊ณผ์ œ8

by rindev 2021. 8. 30.

โœ์•Œ๊ฒŒ๋œ ๊ฒƒ๊ณผ ๋Š๋‚€์ 

 

๐Ÿ”ฅ๊ทธ๋ž˜์„œ ํ•ด๋ณด๋Š” ์ •๋ฆฌ

1. global style๋กœ reset.css ์‚ฌ์šฉํ•˜๊ธฐ

src/styles/GlobalStyle.ts ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ตœ์ƒ๋‹จ์—์„œ importํ•œ๋‹ค.

GlobalStyle์„ ์ž‘์„ฑํ•  ๋•Œ์—๋Š” ์•„๋ž˜์™€๊ฐ™์ด importํ•˜์—ฌ ์ ์–ด์•ผ ํ•œ๋‹ค.

import { createGlobalStyle } from 'styled-components';

const GlobalStyle = createGlobalStyle`
  *  {
    box-sizing: border-box;
  }

// ๋‚ด์šฉ ์ƒ๋žต

`;

export default GlobalStyle;

 

 

2. StyeldComponent์— ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜์—ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฃผ๊ธฐ

์˜†์—์„œ ์Šค์œฝ ๋‚˜์˜ค๋Š” ์‚ฌ์ด๋“œํƒญ์„ ๋งŒ๋“ค์—ˆ๋‹ค!

์‚ฌ์ด๋“œํƒญ์ด ์—ด๋ฆฌ๋Š” ๊ฑด ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋‹ซํžˆ๋Š”๊ฒŒ ์ž˜ ์•ˆ๋ผ์„œ ์งˆ๋ฌธ๋“œ๋ ธ๋”๋‹ˆ ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ ๋ฐ›์•„์˜ค๊ธฐ+์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ํ•ด๊ฒฐํ•ด์ฃผ์…จ๋‹ค. 

const fadeIn = keyframes`
 from {
   transform : translateX(30rem);
 }
 to {
   transform: translateX(0);
 }
`;

const fadeOut = keyframes`
 from {
   transform: translateX(0);
 }
 to {
   transform: translateX(30rem);
 }
`;

const SideTabWrapper = styled.div<{ fade: boolean }>`
  
  //๋‚ด์šฉ ์ƒ๋žต
  
  animation-duration: 0.4s;
  animation-timing-function: ease-out;
  animation-fill-mode: forwards;
  animation-name: ${({ fade }) => (fade ? fadeIn : fadeOut)};
`;

fadeIn : ์‚ฌ์ด๋“œํƒญ์ด ๋ณด์—ฌ์ง€๋Š” ํšจ๊ณผ

fadeOut : ์‚ฌ์ด๋“œํƒญ์ด ์‚ฌ๋ผ์ง€๋Š” ํšจ๊ณผ

 

 

3. Drag and Drop ์‚ฌ์šฉํ•˜๊ธฐ

์ €๋ฒˆ ๊ณผ์ œ์—์„œ DND ๋์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๊ณ  ์ ์–ด๋ƒˆ๋Š”๋ฐ ๊ทธ๊ฒŒ ์ด๋ ‡๊ฒŒ ๊ณผ์ œ๋กœ ๋‚˜์˜ฌ์ค„์ด์•ผ^^.. ๊ทธ๋ž˜์„œ ์ง„์งœ ํ•ด๋ณด๊ณ ์‹ถ์—ˆ๋Š”๋ฐ ์šฐ๋ฆฌ ์กฐ ์„ค๊ณ„๊ฐ€ ๋ณต์žกํ•ด์„œ ์˜ˆ์ƒํ–ˆ๋˜๊ฑฐ๋ณด๋‹ค ํ›จ์”ฌํ›จ์”ฌ ํ›จ์”ฌ ์ •๋ง ๋„ˆ๋ฌด๋งŽ์ด ์–ด๋ ค์›Œ์„œ ๊ณ„์† ์‚ฝ์งˆ๋งŒ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค๐Ÿ˜ญ (์ด๊ฑธ ๊ตฌํ˜„ํ•ด๋‚ด์‹  ํŒ€์›๋ถ„์€ ์ฒœ์žฌ๊ฐ€ ์•„๋‹๊นŒ)

์šฐ์„  ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— TO DO, On Progress, DONE ์ด ๋ถ€๋ถ„์€ ์ „๋ถ€ ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ ํ•œ ๋ถ€๋ถ„์ด๋‹ค. (=TodoBoard)

 

1. ๊ทธ๋ž˜์„œ ๊ฐ™์€ ๋ณด๋“œ(TO DO, On Progress, DONE)์ผ ๋•Œ์—๋Š” state๊ฐ€ ์œ ์ง€๋์ง€๋งŒ ๋“œ๋ž˜๊ทธํ•ด์„œ ์˜† ๋ผ์ธ์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ๋˜๋ฉด unmountmount ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. = isDrag(ํ˜„์žฌ ๋“œ๋ž˜๊ทธ ๋˜๊ณ  ์žˆ๋Š” ์ค‘์ธ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ„) ๋“ฑ์˜ state๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š์Œ

2. ๋˜ํ•œ onDrop์€ ์š”์†Œ๊ฐ€ ๋“œ๋กญ์กด์— ๋†“์—ฌ์งˆ ๋•Œ ๋ฐ˜์‘ํ•˜๋Š”๋ฐ, ๋งˆ์šฐ์Šค๊ฐ€ ๊ทธ ๋“œ๋กญ์กด์„ ๋ฒ—์–ด๋‚˜์žˆ๋Š” ์ƒํƒœ๋กœ ๋†“๊ฒŒ๋˜๋ฉด onDrop์ด ํ˜ธ์ถœ๋˜์ง€์•Š๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ๋‹ค. ๋“œ๋กญ์กด์„ ๋ฒ—์–ด๋‚˜์žˆ๋Š” ์ƒํƒœ = ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํฐ ์—ฌ๋ฐฑ ๋ถ€๋ถ„(๋…ธ๋ž€์ƒ‰ ๋„ค๋ชจ๋กœ ํ‘œ์‹œ)์— ๋งˆ์šฐ์Šค๊ฐ€ ์žˆ๋Š” ์ƒํƒœ๋กœ ์†์„ ๋†“๊ฒŒ ๋˜๋ฉด onDrop์ด ์ ์šฉ์ด ์•ˆ๋จ! 

 

1์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด isDrag๋ฅผ useState๊ฐ€ ์•„๋‹Œ ContextAPI๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค. ๋“œ๋ž˜๊ทธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด isDrag: true๊ฐ€ ๋˜๊ณ , ์ด๋Š” ContextAPI์— ์ €์žฅ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ผ์ธ์œผ๋กœ ๋„˜์–ด๊ฐ€๋„ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋งˆ์šฐ์Šค๋ฅผ ๋†“์•„์„œ onDrop์ด ํ˜ธ์ถœ๋˜๋ฉด isDrag: false๋กœ ๋งŒ๋“ค์–ด์„œ ๋“œ๋ž˜๊ทธ ์ค‘์ผ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํšจ๊ณผ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

2๋Š” ๋“œ๋กญ์กด์˜ ์˜์—ญ์„ ํ™•๋Œ€ํ–ˆ๋‹ค. (์ ๊ณ ๋ณด๋‹ˆ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•ด์„œ ์–ต์šธํ•˜๋‹ค!)

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

 

 

4. ContextAPI + ์ƒํƒœ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€

์œ„์˜ ๋ฌธ์ œ๋กœ ์ธํ•ด ContextAPI์˜ ์†Œ์ค‘ํ•จ์„ ๊นจ๋‹ฌ์•˜๋‹ค. (๋งˆ์นจ ์ง€๋‚œ์ฃผ์— ๋ฆฌ๋•์Šค๋ฅผ ๋ฐฐ์› ๋Š”๋ฐ..)

ContextAPI VS Redux๋ฅผ ์งง๊ฒŒ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด.....

 

ContextAPI (ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ ์œ ์ €, ํ…Œ๋งˆ, ์„ ํ˜ธํ•˜๋Š” ์–ธ์–ด ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Œ)

  • ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค
  • Provider ํ•˜์œ„์—์„œ context๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” value prop์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ๋‹ค (๋‹น์—ฐํ•˜์ง€!)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‚˜์˜ context๋ฅผ ๊ตฌ๋…ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ context๋ฅผ ๊ตฌ๋…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ ๊ฐ’๋“ค์„ ํ•œ๋ฒˆ์— ๋ฐ›๋Š” render prop ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

Redux

  •  JS ์•ฑ์„ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ
  • ์Šคํ† ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์˜ ๋ฐ”๊นฅ์— ๋‘๊ณ , ์Šคํ† ์–ด๋ฅผ ์ค‘๊ฐ„์ž๋กœ ๋‘๊ณ  ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š”๋‹ค
  • Single source of Truth / State is read-only / Changes are made with pure functions ๋ผ๋Š” ์›์น™์ด ์žˆ๋‹ค

 

 

5. TypeScript์™€ ์นœํ•ด์งˆ ์ˆ˜ ์žˆ์„๊นŒ?

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ๊ณ„์† ์‹ธ์šฐ๋˜ ๋‚˜๋Š” ์•„.. ์ •๋ง ๋”ฑ ํ•œ๋Œ€๋งŒ ์ฅ์–ด๋ฐ•๊ณ ์‹ถ๋‹ค.. ๋ผ๋Š” ์ƒ๊ฐ์„ ๋ฐฑ๋ฒˆ์ •๋„ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ๋ฆด ํž˜๋“ค๊ฒŒ ํ–ˆ๋˜...... 

๊ทธ๋™์•ˆ JS๋ฅผ ์–ผ๋งˆ๋‚˜ ๋ง‰ ์จ์™”๋Š”์ง€ ๋‹ค์‹œ ๋Š๊ผˆ๊ณ , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •๋ง ์–ด๋ ต๋‹ค. 

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

 

 

๐Ÿš€๊ณผ์ œ ํ›„๊ธฐ

5๋ฒˆ์ด ์“ฐ๋‹ค๋ณด๋‹ˆ ํ›„๊ธฐ๊ฐ™์•„์ ธ์„œ ๊ธ‰ํ•˜๊ฒŒ ์—ฌ๊ธฐ์— ์ ๊ธฐ ์‹œ์ž‘...

์‚ฌ์‹ค ์•„์‰ฌ์›€๋„ ๋งŽ์ด ๋‚จ์•˜๋‹คใ… ใ…  DND ํ•ด๋ณด๊ณ ์‹ถ์–ด์„œ ๋‚ด๊ฐ€ ๋งก๊ฒ ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค์ด ๋‹ค ๋ด์ฃผ์…”์„œ..ใ…œใ…œ ๊ทธ๋ž˜์„œ ์ด ์•„์‰ฌ์›€ ๊ทธ๋ƒฅ ๋‚จ๊ฒจ๋‘˜ ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จ, ์ถ”ํ›„ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค(ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹) ์‚ฌ์‹ค... dnd๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ฒœ๊ฐœ๋„˜๊ฒŒ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ.... ๋ญ.. ๊ทธ๋ž˜๋„ ํ• ์ค„์•Œ๋ฉด ์ข‹์œผ๋‹ˆ๊นŒ...?๐Ÿค”

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

 

 

 

๐Ÿ‘€์ฐธ๊ณ (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค)

๋”๋ณด๊ธฐ

 

๋Œ“๊ธ€