[ToyProject-Todomate] ํˆฌ๋‘๋ฉ”์ดํŠธ ํด๋ก  ํ”„๋กœ์ ํŠธ 33

2022. 2. 1. 23:31ใ†WEB Dev/ToyProject

728x90


๐Ÿ”ท CloneTodo โ˜‘ - Todomate Clone Project  |  Team CloneMate

 

CloneTodo : ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ๋ž‘ํ•˜๋Š” ํˆฌ๋‘๋ฉ”์ดํŠธ๋ฅผ ํด๋ก ํ•˜์—ฌ ์›น ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•ด๋ณด๋Š” ํ”„๋กœ์ ํŠธ

 


 

 

์—ฐํœด๊ฐ€ ๋ฒŒ์จ ๋ฐ˜์ด ์ง€๋‚˜๊ฐ”๋‹ค. ๋‚˜ํ˜๋ฐ–์— ์•ˆ๋˜๋Š” ์งง์€ ์—ฐํœด์ง€๋งŒ ์˜ค๋žœ๋งŒ์— ๊ธธ๊ฒŒ ์‰ฌ์–ด์„œ ์ข‹๊ธด ํ•˜๋‹ค.

ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋ฅผ ํ›…ํ›… ์ž‘์„ฑํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์„ค์ค€๋น„ํ•˜๋ฉด์„œ ํ‹ˆํ‹ˆ์ด ํ•˜๋Š” ๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š์•˜๋‹ค ใ… ใ… ใ… ใ… 

 

์–ด์ œ๊นŒ์ง€๋Š” ์งฌ์งฌ์ด ๋ชฉํ‘œGoals ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ „๋ฐ˜์ ์œผ๋กœ ์ˆ˜๋ฆฌํ–ˆ๋‹ค.

 

 

- ์ €๋ฒˆ์ฃผ๊นŒ์ง€ ํ•œ ์ผ

1. ๋ชฉํ‘œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ธ ์ˆ˜์ •

 

 

๋ชฉํ‘œ Goals ์ปดํฌ๋„ŒํŠธ์˜ '๊ณต๊ฐœ ์„ค์ •' ๊ณผ '์ƒ‰์ƒ' ๋ถ€๋ถ„์˜ State๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์ฒ˜์Œ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๊ตฌํ˜„ ์ž์ฒด์— ์‹ ๊ฒฝ์“ฐ๋Š๋ผ๊ณ  ๊น€๋‹ค์ •๋‹˜์˜ ์ฑ…์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ ๋ถ™์˜€๋Š”๋ฐ, ์ด๋ฒˆ์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋‹ค ๋ณด๋‹ˆ ์ฝ”๋“œ ๊ธธ์ด๋„ ๋งŽ์ด ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  state๋„˜๊ธฐ๊ณ  ๋ฐ›๊ณ  ์ˆ˜์ •์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š” ๊ฑด ์ง€ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชฉํ‘œ ๋ฆฌ์ŠคํŠธ์—์„œ +๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ชฉํ‘œ ์ถ”๊ฐ€ ํŽ˜์ด์ง€๊ฐ€, ๋ชฉํ‘œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ชฉํ‘œ ์ˆ˜์ • ํŽ˜์ด์ง€๊ฐ€ ๋œฐ ์ˆ˜ ์žˆ๋„๋ก Router๋„ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

<Route exact path="/goals">
<BasicNavBar/>
  <Goals  />
</Route>
<Route exact path="/goalForm">
 <BasicNavBar/> 
 <GoalForm />  
</Route>
<Route exact path="/goalEditForm/:originID">
<BasicNavBar/> 
 <GoalEditForm />  
</Route>

 

๊ทธ๋ฆฌ๊ณ  ๋ชฉํ‘œ ์ˆ˜์ • ํŽ˜์ด์ง€์—์„œ๋Š” : ๋ฅผ ์‚ฌ์šฉํ•ด์„œ url์˜ get ๋ฐฉ์‹์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์„œ ํ•ด๋‹น id์˜ state๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ์ˆ˜์ •๋˜๋„๋ก ํ–ˆ๋‹ค.

 

 

๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๊ธฐ๋Šฅ๋“ค์˜ state๋„ ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๋˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์—„์ฒญ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ์ €๋ฒˆ์ฃผ๋Š” ์ „๋ถ€ ์—ฌ๊ธฐ์— ํˆฌ์žํ•œ ๊ฑฐ ๊ฐ™๋‹ค. ์ข€ ๋” ์ •์‹ ์ด ์žˆ์—ˆ์œผ๋ฉด ์ƒ์„ธํ•˜๊ฒŒ ๊ธฐ๋กํ–ˆ์„ํ…๋ฐ...

state ์ •๋ณด ์ค‘์—์„œ bg_color ๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ ํˆฌ๋‘๋ฉ”์ดํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ฐ”๋žŒ์— bg_color ๊ธฐ๋Šฅ์ด ์‚ฌ๋ผ์กŒ๋‹ค! ๊ทธ๋ž˜์„œ title_color ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๋˜์ง€ ํ•ด์•ผ๊ฒ ๋‹ค.

 

 

 

 

 

 

2. Dialog ์ ์šฉ

 

์ ์šฉํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๋ชจ๋‘ MUI์˜ Dialog ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋‹ฌ์ฒ˜๋Ÿผ ๋„์›Œ์ง€๋„๋ก ํ–ˆ๋‹ค.

Dialog ๋ฅผ ์ ์šฉํ•˜์ง€ ์กฐ๊ธˆ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด UI๊ฐ€ ๋˜์—ˆ๋‹ค.

SCSS๋กœ CSS๋„ ์ˆ˜์ •ํ–ˆ๊ณ  ์ƒ‰์ƒ ์„ ํƒ ์‹œ ์˜ˆ์‹œ ์ƒ‰์ƒ์ด ๋ณด์ผ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ , radio ๋ฒ„ํŠผ์œผ๋กœ ๊ตฌํ˜„ํ•œ input๋“ค์ด ๋ณ€ํ•  ๋•Œ ๋งˆ๋‹ค state๋„ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

 

 

 

 

3. Recoil์„ ์ ์šฉ

 

Recoil์„ ์„ค์น˜ํ•˜๊ณ , atoms๋ผ๋Š” ํด๋”์— todoData๋ผ๋Š” ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ state ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

state๋“ค์€ atom์œผ๋กœ ๊ฐ ์ปดํฌ๋„ŒํŠธ์— ๋ฟŒ๋ ค์ง€๊ณ  ์ฒ˜์Œ ๋ฐ์ดํ„ฐ๋กœ ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ default์— ์ž‘์„ฑํ–ˆ๋‹ค.

 

 

import { atom } from "recoil";

export const textState = atom({
  key: 'textState', // unique ID (with respect to other atoms/selectors)
  default: '', // default value (aka initial value)
});


export const calendarData = atom({
    key: 'calendarData', // unique ID (with respect to other atoms/selectors)
    default:  [ 
      { numTodoDay: 8, numCountTodo: 2, completeYn: 'n' }, 
      { numTodoDay: 13, numCountTodo: 4, completeYn: 'n', }, 
      { numTodoDay: 29, numCountTodo: 6, completeYn: 'y' } ] // default value (aka initial value)
  });


export const goalsData = atom({ 
  key: "goalsData",
  default: [
    {
      "goal_id": 0,
      "next_goal_id": 1,
      "title": "์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ",
      "privacy": "PUBLIC",
      "bg_color": "",
      "title_color": "#3CB371"
    },
    {
      "goal_id": 1,
      "next_goal_id": 2,
      "title": "๋‘ ๋ฒˆ์งธ ๋ชฉํ‘œ",
      "privacy": "PRIVATE",
      "bg_color": "",
      "title_color": "#C71585"
    }
  ]
})

export const goalReadOnly = atom({
  key: "goalReadOnly",
  default: "read"
})

 

Recoil์„ ์ด์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— App.js ๋กœ ์ „๋ถ€ ์˜ฌ๋ ค๋ณด๋ƒˆ๋˜ ํ•จ์ˆ˜๋“ค๋„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋ถ€ ์˜ฎ๊ฒผ๋‹ค. 

๋ชฉํ‘œ ์ปดํฌ๋„ŒํŠธ์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ App.js ์— ์žˆ๋˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ํ•จ์ˆ˜๋“ค์„ ํ•œ ๋ฒˆ ์ˆ˜์ •ํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„๋กœ ์˜ฎ๊ธฐ๋ฉด์„œ ๋˜ ์ˆ˜์ •์„ ๋ฐ˜๋ณตํ•ด์•ผํ–ˆ๋‹ค.

 

์—ญ์‹œ ํ•œ๋ฐฉ์— ํ•˜๋Š”๊ฒŒ ์ตœ๊ณ ๋‹ค.

 

 

 

์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ Feed ํ™”๋ฉด์— atom์œผ๋กœ ๋ชฉํ‘œ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ํ™”๋ฉด์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๊ณ 

๋‚ด์ผ์€ ๋ชฉํ‘œ๋ฅผ ํด๋ฆญํ•˜๋ฉด ํˆฌ๋‘๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ณด์ž.

 

 

 

 

728x90