Skip to content

๐Ÿ“… ์ผ์ • ๊ด€๋ฆฌ, ๊ฐ์ •์ผ๊ธฐ๋ฅผ ์“ธ์ˆ˜ ์žˆ๋Š” ๋ผ์ดํ”„ ์บ˜๋ฆฐ๋” ์‚ฌ์ดํŠธ

Notifications You must be signed in to change notification settings

hahahaday12/Life-Calender-front

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

85 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ€Life-Calendar

image

Hits

๐Ÿ“ƒLife-Calendar Web Page

๊ฐœ๋ฐœ๊ธฐ๊ฐ„: 2022-11. 01 ~ 2023-1.31

๋ฐฐํฌ ์ฃผ์†Œ

ํ”„๋ก ํŠธ ์„œ๋ฒ„ : https://web-life-calender-front-6g2llffebnui.sel3.cloudtype.app/
๋ฐฑ์—”๋“œ ์„œ๋ฒ„ :

Test ์šฉ id, password

ID- [email protected]
PW- Test123456!

๐Ÿ“Œ ์œ ์˜์‚ฌํ•ญ

๋””๋ฐ”์ด์Šค์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋‹ค ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— , ๋ชจ๋“  ๋””๋ฐ”์ด์Šค์˜ ์ตœ์ ํ™” ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ˜น์—ฌ, ๋งž์ง€ ์•Š์œผ์‹œ๋‹ค๋ฉด ํ™”๋ฉด ํฌ๊ธฐ 90% ๋กœ ์‹œ๋„ํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์›น๊ฐœ๋ฐœํŒ€ ์†Œ๊ฐœ

๊น€ํ•˜์€ (Front) ๋ฐ•๋‹คํ˜„ (BackEnd)
@haeunKim @dahyeonPark

๐Ÿ“œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

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

๐ŸŽˆ ํ”„๋กœ์ ํŠธ ๊ฒฐ์ • ์ด์œ 

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

์‹œ์ž‘ ๊ฐ€์ด๋“œ

Requirements

For building and running the application you need:

Installation

$ git clone https://github.com/hahahaday12/Life-Calender-front.git
$ cd client

Backend

$ cd server  ->  cd lifeserver
$ nvm use v.16.19.1
$ npm install
$ npm run start

Frontend

$ cd client
$ nvm use v.8.19.3
$ npm install 
$ npm run start

Stacks ๐Ÿˆ

Environment

Visual Studio Code Git Github

Config

npm

Development Frontend

JavaScript React Recoil Styled Components

Development Backed

NestJS

Communication

GoogleMeet


ํ™”๋ฉด ๊ตฌ์„ฑ ๐Ÿ“บ

๋ฉ”์ธ ํŽ˜์ด์ง€ ํšŒ์› ๊ฐ€์ž… ํŽ˜์ด์ง€
image image
Calendar ํŽ˜์ด์ง€ List ํŽ˜์ด์ง€
image image
Diary ํŽ˜์ด์ง€
image

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ โœจ

โญ๏ธ 1) ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ

๐Ÿ“Œ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์„ ํ†ตํ•˜์—ฌ, ํšŒ์›๊ฐ€์ž… ๊ฐ€๋Šฅ.

-> ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฉ”์ผ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ฒดํฌํ•˜์—ฌ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋กœ ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โญ๏ธ 2) ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

๐Ÿ“Œ Local storage ์— Token ์ €์žฅ.

-> ์ž…๋ ฅํ•œ ์•„์ด๋”” ํŒจ์Šค์›Œ๋“œ๋ฅผ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ ํ›„ ์„ฑ๊ณต์‹œ ์ƒํƒœ๊ฐ’๊ณผ Token๊ฐ’ ์„ ๋ฐ›์•„์™€ local storage ์— ๋ณด๊ด€ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจ์‹œ โ€œ์•„์ด๋”” ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž˜๋ชป ์ž…๋ ฅ ํ•˜์…จ์Šต๋‹ˆ๋‹คโ€ ๋ผ๋Š” ์•Œ๋ฆผ์ด ๋œน๋‹ˆ๋‹ค.

โญ๏ธ 3) Todo ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

๐Ÿ“Œ ํ•˜๋ฃจ ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ/ Todo ๋“ฑ๋ก/ Todo ์ƒํƒœ๊ฐ’ ๋ณ€๊ฒฝ ์ˆ˜์ •/ Todo ์‚ญ์ œ

-> ๋‚ ์งœ๋Š” ์‹œ์Šคํ…œ ๋‚ ์งœ๋กœ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋˜๋ฉฐ ํ•˜๋ฃจ์— ์ง„ํ–‰๋  ์ผ์„ ๋“ฑ๋กํ›„ Drag And Drop์œผ๋กœ TODO ์ƒํƒœ์—์„œ Done ์ƒํƒœ๋กœ ์˜ฎ๊ฒจ ํ•˜๋ฃจ ์™„๋ฃŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ๋‚ ์งœ์˜ TODO๋„ ์ถ”๊ฐ€๋“ฑ๋ก, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์•ž์œผ๋กœ ํ• ์ผ๋„ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด ํ•˜๋ฃจ ์ผ์ •์„ ๊ด€๋ฆฌํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ๏ธ 4) Diary ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

๐Ÿ“Œ ํ•œ๋‹ฌ ๋‚ ์งœ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ/ Diary ๋“ฑ๋ก/ ์ด์ „ ์ž‘์„ฑ๋œ ๊ธ€ & ํ˜„์žฌ๊ธ€ ์ˆ˜์ •/ Diary ์‚ญ์ œ

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

โญ๏ธ 5) Calendar ๊ธฐ๋Šฅ

๐Ÿ“Œ Diary Color ๋…ธ์ถœ ๊ธฐ๋Šฅ

-> Diary ์—์„œ ์ €์žฅํ•œ Color ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ž‘์„ฑํ•œ ๋‚ ์งœ์˜ ์ƒ‰์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ํ•œ๋‹ฌ ๋™์•ˆ์˜ ๊ฐ์ •์„ ๋ณผ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœจ ์ƒ์„ธ ๊ตฌํ˜„ ๊ธฐ๋Šฅ ์„ค๋ช… โœจ

๐Ÿ“ List ๊ธฐ๋Šฅ

1) Todo ๋“ฑ๋ก ๊ธฐ๋Šฅ

-> input ์— ํ• ์ผ์„ ์ž…๋ ฅํ•˜๊ณ , ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ์‹œ onClick์˜ ์ด๋ฒคํŠธ๊ฐ€ ํ™œ์„ฑ ๋˜๋ฉด์„œ content(๋‚ด์šฉ) , date(๋‚ ์งœ), status(์ƒํƒœ๊ฐ’) ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„ api ์— ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ๋Š” post ๋ฐฉ์‹์œผ๋กœ ์ด์šฉ ํ•˜์˜€์œผ๋ฉฐ, ์„œ๋ฒ„์— ์ €์žฅ์ด ๋˜๋ฉด, "๋“ฑ๋ก ๋˜์—ˆ์Šต๋‹ˆ๋‹ค." ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค. ๊ทธํ›„ setState ์— ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์กฐํšŒํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ Api ์—์„œ Get ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2) Todo ์‚ญ์ œ ๊ธฐ๋Šฅ

-> x์˜ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด onClick์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ํ™œ์„ฑ๋˜๋ฉด์„œ "์‚ญ์ œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ด๋•Œ ์ทจ์†Œ๋ฅผ ํด๋ฆญ์‹œ "์ทจ์†Œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ค๊ณ  ํ™•์ธ์„ ํด๋ฆญ์‹œ ์„œ๋ฒ„ Api์— delete ๋ฐฉ์‹์œผ๋กœ ์„ ํƒํ•œ id์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ณ , ์„ฑ๊ณต ์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์œผ๋ฉด "์‚ญ์ œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์„ ๋„๊ฒŒ๋” ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์˜ ์ƒํƒœ๊ฐ’์„ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•˜๋ฉด ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์ฐฝ์— ๋œน๋‹ˆ๋‹ค.

3) Todo ์™„๋ฃŒ ๊ธฐ๋Šฅ

๐Ÿ“Œ Drag and Drop ๊ธฐ๋Šฅ

-> onDragEnd ์˜ ํ•จ์ˆ˜๋Š” React์˜ useState Hook ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ๊ฐ’์ธ columns๊ณผ setColumns๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. columns๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์ด ์ ์šฉ๋  ์—ฌ๋Ÿฌ ์—ด(column)๋“ค์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. result๋Š” react-beautiful-dnd ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ด๋ฒคํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด์—์„œ๋Š” ๋“œ๋ž˜๊ทธ๋œ ์•„์ดํ…œ, ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€ droppable ์˜์—ญ์˜ ์ •๋ณด ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์—์„œ๋Š” ๋จผ์ €, result.destination์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(์ฆ‰, ์•„์ดํ…œ์ด ๋“œ๋กญ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

const onDragEnd = (result, columns, setColumns) => {
   if (!result.destination) return;
  const { source, destination } = result;

๊ทธ ๋‹ค์Œ, ๋“œ๋ž˜๊ทธ๋œ ์•„์ดํ…œ์ด ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ์—ด(column) ๊ฐ„ ์ด๋™์ผ ๊ฒฝ์šฐ์™€, ๊ฐ™์€ ์—ด ๋‚ด์—์„œ์˜ ์•„์ดํ…œ ์ˆœ์„œ ๋ณ€๊ฒฝ์ผ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์—ด(column) ๊ฐ„ ์ด๋™์ด๋ผ๋ฉด, columns ์ƒํƒœ๊ฐ’์—์„œ ์ถœ๋ฐœ์ง€ ์—ด์„ ์ฐพ์•„ ํ•ด๋‹น ์—ด์˜ items ๋ฐฐ์—ด์—์„œ ์•„์ดํ…œ์„ ์ด๋™์‹œํ‚ค๊ณ , ๋ณ€๊ฒฝ๋œ items ๋ฐฐ์—ด์„ ๋‹ค์‹œ columns ์ƒํƒœ๊ฐ’์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ChangeStatus() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋“œ๋ž˜๊ทธ๋œ ์•„์ดํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

if (source.droppableId !== destination.droppableId) {
    console.log(result);
    const sourceColumn = columns[source.droppableId];
    const destColumn = columns[destination.droppableId];

    const sourceItems = [...sourceColumn.items];
    const destItems = [...destColumn.items];

    const [removed] = 
      sourceItems.splice(source.index, 1);
      destItems.splice(destination.index, 0, removed);
      setColumns({
        ...columns,
      [source.droppableId]: {
        ...sourceColumn,
        items: sourceItems
      },
      [destination.droppableId]: {
        ...destColumn,
        items: destItems
      }, 
      });
       ChangeStatus(result.draggableId, destination.droppableId.toLowerCase());
    }

๊ทธ๋Ÿฌ๋‚˜, ๋‹ค๋ฅธ ์—ด ๊ฐ„ ์ด๋™์ด๋ผ๋ฉด, ์ถœ๋ฐœ์ง€ ์—ด๊ณผ ๋ชฉ์ ์ง€ ์—ด์—์„œ ์•„์ดํ…œ์„ ์ด๋™์‹œํ‚ค๊ณ , ์ด๋ฅผ columns ์ƒํƒœ๊ฐ’์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

else { 
    const column = columns[source.droppableId];
    const copiedItems = [...column.items];
    
    const [removed] = copiedItems.splice(source.index, 1);
    copiedItems.splice(destination.index, 0, removed);
      setColumns({
        ...columns,
        [source.droppableId]: {
        ...column,
        items: copiedItems
      }
    });
  }
};

์ด๋ ‡๊ฒŒ onDragEnd ํ•จ์ˆ˜๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ์ด๋ฒคํŠธ์— ๋งž๊ฒŒ columns ์ƒํƒœ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ์ƒํƒœ๊ฐ’์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ Œ๋”๋งํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

-> Todo์— ๋“ฑ๋ก๋œ item์˜ ์ƒํƒœ๊ฐ€ ์™„๋ฃŒ๋œ done์˜ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ๋˜์—ˆ์„๋•Œ ๋ณ€๊ฒฝ๋œ ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ Api ์— Patch ๋ฐฉ์‹์œผ๋กœ ์„ ํƒํ•œ item์˜ id ๊ฐ’๊ณผ ํ•จ๊ป˜ status ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌํ•ด ์ฃผ์—ˆ๊ณ , ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

4) ์กฐํšŒ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ

-> Datepicker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉ ํ–ˆ์œผ๋ฉฐ, Datepicker์—์„œ ๊ฐ€์ ธ์˜จ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์ƒํƒœ(todo,done) ๊ตฌ๋ถ„ํ•˜์—ฌ ํ™”๋ฉด์— ๋…ธ์ถœ๋˜๋ก ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ›„ map์œผ๋กœ ๋…ธ์ถœํ•˜์˜€๋‹ค.

5) ๋ฒ„ํ‚ท ๋ฆฌ์ŠคํŠธ ๋“ฑ๋ก, ์‚ญ์ œ ๊ธฐ๋Šฅ

๐Ÿ“Œ ๋“ฑ๋ก

-> input ์— ํ• ์ผ์„ ์ž…๋ ฅํ•˜๊ณ , ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ์‹œ onClick์˜ ์ด๋ฒคํŠธ๊ฐ€ ํ™œ์„ฑ ๋˜๋ฉด์„œ title(์ œ๋ชฉ) , content(๋‚ด์šฉ) , date(๋‚ ์งœ) ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„ api ์— ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ๋Š” post ๋ฐฉ์‹์œผ๋กœ ์ด์šฉ ํ•˜์˜€์œผ๋ฉฐ, ์„œ๋ฒ„์— ์ €์žฅ์ด ๋˜๋ฉด, "๋“ฑ๋ก ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค. ๊ทธํ›„ setState ์— ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ Api ์—์„œ Get ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์‚ญ์ œ

-> x์˜ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด onClick์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ํ™œ์„ฑ๋˜๋ฉด์„œ "์‚ญ์ œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ด๋•Œ ์ทจ์†Œ๋ฅผ ํด๋ฆญ์‹œ "๋‹ค์‹œ ์„ ํƒํ•ด ์ฃผ์„ธ์š”" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ค๊ณ  ํ™•์ธ์„ ํด๋ฆญ์‹œ ์„œ๋ฒ„ Api์— delete ๋ฐฉ์‹์œผ๋กœ ์„ ํƒํ•œ id์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ณ , ์„œ๋ฒ„์—์„œ ์„ฑ๊ณต ์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์œผ๋ฉด "์‚ญ์ œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์„ ๋„๊ฒŒ๋” ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์—์„œ ์ƒํƒœ๊ฐ’์ด ์„ฑ๊ณต์ด ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์ฐฝ์— ๋œน๋‹ˆ๋‹ค.

๐Ÿ“• Diary ๊ธฐ๋Šฅ

1) diary ๋“ฑ๋ก ๊ธฐ๋Šฅ

-> ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๊ณ , ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ์‹œ onClick์˜ ์ด๋ฒคํŠธ๊ฐ€ ํ™œ์„ฑ ๋˜๋ฉด์„œ title(์ œ๋ชฉ) , content(๋‚ด์šฉ) , date(๋‚ ์งœ) ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋ฒ„ api ์— ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ๋Š” post ๋ฐฉ์‹์œผ๋กœ ์ด์šฉ ํ•˜์˜€์œผ๋ฉฐ, ์„œ๋ฒ„์— ์ €์žฅ์ด ๋˜๋ฉด, "๋“ฑ๋ก ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค. ๊ทธํ›„, ๋“ฑ๋ก๋œ ์ •๋ณด๊ฐ€ slider ์ปดํฌ๋„ŒํŠธ์— ๋“ฑ๋ก๋˜์–ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด, ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐ๊ฐ’์— ๋Œ€ํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์•ˆ์— setState ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งจ์ฒ˜์Œ ์ƒํƒœ์ธ ๋นˆ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ ์—ˆ๊ณ , date ๋Š” ํ˜„์žฌ ์‹œ๊ฐ„, color๋Š” ๋งจ์ฒ˜์Œ ๊ธฐ๋ณธ ์ƒ‰์ƒ์„ ์ ์–ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

2) diary ์‚ญ์ œ ๊ธฐ๋Šฅ

-> x์˜ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด onClick์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ํ™œ์„ฑ๋˜๋ฉด์„œ "์‚ญ์ œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ด๋•Œ ์ทจ์†Œ๋ฅผ ํด๋ฆญ์‹œ "๋‹ค์‹œ ์„ ํƒํ•ด ์ฃผ์„ธ์š”" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์ด ๋‚˜์˜ค๊ณ  ํ™•์ธ์„ ํด๋ฆญ์‹œ ์„œ๋ฒ„ Api์— delete ๋ฐฉ์‹์œผ๋กœ ์„ ํƒํ•œ ์ด๋ฒคํŠธ id์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๊ณ , ์„œ๋ฒ„์—์„œ ์„ฑ๊ณต ์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์„ ์ „๋‹ฌ ๋ฐ›์œผ๋ฉด "์‚ญ์ œ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค" ๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ์„ ๋„๊ฒŒ๋” ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์˜ ์ƒํƒœ๊ฐ’์„ ๋ฐ›์•„์˜ค์ง€ ๋ชปํ•˜๋ฉด ์—๋Ÿฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์ฐฝ์— ๋œน๋‹ˆ๋‹ค.

3) diary ์ƒ‰ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ(ColorPeeker๐ŸŒˆ)

-> recoile ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Color ๋ผ๋Š” ๋ณ€์ˆ˜์— โ€œ๊ฐ์ •์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹จ์–ด(key)โ€ : โ€œ์ƒ‰๊น” ์ฝ”๋“œ(value)โ€, ํ‚ค์™€ ๋ฒจ๋ฅ˜ ๊ฐ’์œผ๋กœ ๋„ฃ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธํ›„, colorNameArray ๋ผ๋Š” ๋ณ€์ˆ˜์— Color์— ์žˆ๋Š” key ๊ฐ’์„ ๋„ฃ์–ด๋‘์—ˆ๊ณ , colorArray ๋ผ๋Š” ๋ณ€์ˆ˜์—๋Š” color ์— ์žˆ๋Š” value ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒ‰์„ ์„ ํƒํ•˜๋Š” color์˜ type์€ radio ํƒ€์ž…์˜ ๋™๊ทธ๋ž€ ๋ชจ์–‘์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Map์„ ์‚ฌ์šฉํ•˜์—ฌ colorArray ์— ์žˆ๋Š” color ๊ฐ’๋“ค์„ ๋‚˜์—ดํ•ด ์ฃผ์—ˆ๊ณ , ํ•ด๋‹น color๋ฅผ ํด๋ฆญ์‹œ onChange ์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ๊ตฌํ˜„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Onchange ํ•จ์ˆ˜๋กœ ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด

useEffect(() => {
    const changedColor = {
      color: colorState
    };
    setRecoilColor(changedColor);
  }, [colorState, setRecoilColor]);

useEffect ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ๋œ ์ƒ‰์ƒ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ผ์Šต๋‹ˆ๋‹ค.

๋‹ค์ด์–ด๋ฆฌํผ์—์„œ๋Š” ๋ฆฌ์ฝ”์ผ ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋™์ผํ•˜๊ฒŒ useEffect ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ,

const [recoilColor, setRecoilColor] = useRecoilState(recoilColorState);
const [colorPeeker, setColorPeeker ] = useState(recoilColor.color);

 useEffect(() =>{
    const tmpColor = { ...recoilColor };
    setColorPeeker(tmpColor.color);
    let defaultDate = new Date();
    if(ViewData.date !== ""){
        defaultDate = new Date(ViewData.date);
    }
    setViewData({
      ...ViewData,
      color:tmpColor.color,
      date:defaultDate
    })
  },[recoilColor] )

recoilColor ์ƒํƒœ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด์„œ ์ƒˆ๋กœ์šด ์ปฌ๋Ÿฌ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4) ๋“ฑ๋ก๋œ diary ํด๋ฆญ์‹œ ์ž…๋ ฅ ํ™”๋ฉด์— ๋‹ค์ด์–ด๋ฆฌ ์กฐํšŒ ๊ธฐ๋Šฅ

-> Sliderr ์˜ ์ปดํฌ๋„ŒํŠธ์— props ๋กœ ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

List = ์นด๋“œ ์ •๋ณด๋“ค์„ ๋ฟŒ๋ ค์ค„ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ Search = ์กฐํšŒ ํ•จ์ˆ˜๋Š” ์‚ญ์ œ ํ›„ ์นด๋“œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€ ์Šต๋‹ˆ๋‹ค. refreshFunction = ์„ ํƒํ•œ ์นด๋“œ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ๊ฐ’์„ ์ž…๋ ฅํ™”๋ฉด์— ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

<Sliderr 
 list={list} 
 search={search}
 refreshFunction={updateList}
/>

{renderDiary()} ๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด props๋กœ ์ „๋‹ฌ๋ฐ›์€ list ๋ฐ์ดํ„ฐ๋ฅผ map ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

const renderDiary = () => props.list && props.list.map((item) => (

๋“ฑ๋ก๋œ diary์˜ title์„ ํด๋ฆญ์‹œ ๋‹ค์ด์–ด๋ฆฌ ๋‚ด์šฉ์ด ๋ณด์—ฌ์ง€๋Š” ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Item์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋“ค์„ ๋„ฃ์—ˆ๊ณ  props ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™”์Šต๋‹ˆ๋‹ค.

 const Viewdiary = (item) => {
    const body = {
      title : item.title
      ,content : item.content
      ,color : item.color
      ,id : item._id
      ,date : new Date(KSTchangeUTC(item.date))     
    }        
      props.refreshFunction(body);
  };

๐Ÿ“… Calendar ๊ธฐ๋Šฅ

-> Calendar ์—๋Š” Diary ์—์„œ ์ €์žฅํ•œ Color ๊ฐ’์ด ๋„ํŠธ์˜ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๊ตฌํ˜„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Calendar ๋Š” fullCalendar ๋ผ๋Š” ๋ผ์ด๋ธŒ๋ฅผ ์‚ฌ์šฉ ํ•˜์˜€๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์— ๋‚ด์žฌ๋˜์–ด ์žˆ๋Š” ์ด๋ฒคํŠธ ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๋„ํŠธ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๊ตฌํ˜„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Calendar ๋ผ๋Š” ํŽ˜์ด์ง€์— ์ฒ˜์Œ ๋“ค์–ด์™”์„ ๋•Œ useEffect ์ด๋ผ๋Š” Hook ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , Get ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„ Api ๋ฅผ ์ด์šฉํ•˜์—ฌ diary์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด์˜ค๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•˜์˜€ ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ซUserName ํ‘œ์‹œ ๊ธฐ๋Šฅ

-> ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด recoil-persist ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. Recoil-persist๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „์ฒ˜๋Ÿผ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด๋„ recoil state๊ฐ€ ์—†์–ด์ง€์ง€ ์•Š๊ณ  sessionStorage ๋˜๋Š” localStorage์— ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค.

import { atom } from 'recoil';
import { recoilPersist } from 'recoil-persist';

//1. ์•„๋ฌด๊ฒƒ๋„ ์„ค์ • ์•ˆ ํ•˜๊ณ  ์“ฐ๋Š” ๊ฒฝ์šฐ
//localStorage์— ์ €์žฅ๋˜๋ฉฐ, key ์ด๋ฆ„์€ 'recoil-persist'๋กœ ์ €์žฅ๋œ๋‹ค.
const { persistAtom } = recoilPersist();

export const userState = atom({
  key: "userState",
  default: null,
  effects_UNSTABLE: [persistAtom],
  //Recoil-persist๋ฅผ ์ ์šฉ์‹œํ‚ค๋ ค๋ฉด ์•„๋ž˜์˜ effects_UNSTABLE์„ ์ ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
});

์„ ์–ธํ•ด๋‘” atom์„ ์ด์šฉํ•ด์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด state์˜ ๊ธฐ๋ณธ๊ฐ’์— ์„ค์ •ํ•ด์ค€ (userState) ๊ฐ’์„ ๋„ฃ์–ด ๋†“์•˜์Šต๋‹ˆ๋‹ค. ๊ทธํ›„ server api๋ฅผ ์ด์šฉํ•ด ๋กœ๊ทธ์ธ์‹œ ์ €์žฅ๋œ user์˜ ์ •๋ณด๋Š” Get ๋ฐฉ์‹์œผ๋กœ ๊ฐ€์ ธ์™”๊ณ  ๊ทธํ›„, setUser์— ๊ฐ€์ ธ์˜จ data.user.name ์„ ์ €์žฅ ํ•˜์˜€ ์Šต๋‹ˆ๋‹ค.

const Usertitle = () => {
 const [users, setUsers] = useRecoilState(userState);
   Api.user()
   .then(response => {
     setUsers(response.data.data.user.name);
   },(error) => {
     console.log(error)
     TokenRepository.removeToken();
   });

๐ŸŽ‡ ๋Š๋‚€์ 

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


์„œ๋น„์Šค ๋ฐฐํฌํ›„ 1์ฐจ ์ˆ˜์ •

-> ์„œ๋น„์Šค ๋ฐฐํฌํ›„ ์‹ค์‚ฌ์šฉ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์–ป๊ณ  ์‹ถ์–ด Okky ๋ผ๋Š” IT ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์˜ฌ๋ ธ์Šต๋‹ˆ๋‹ค.
-> https://okky.kr/articles/1421448

ํ”ผ๋“œ๋ฐฑ ์ •๋ฆฌ

image

1์ฐจ ์ˆ˜์ • 2023-04-05
-> Life-Clendar ์˜คํƒ€ ์ˆ˜์ • ์™„๋ฃŒ
-> ์ด๋ฉ”์ผ ์ •๊ทœ์‹ ์ˆ˜์ • ์™„๋ฃŒ
-> ํšŒ์›๊ฐ€์ž… ์กฐ๊ฑด ์˜ค๋ฅ˜ ์ˆ˜์ • ์™„๋ฃŒ
-> input ์ž…๋ ฅ์ฐฝ ๊ฐ„๊ฒฉ ์กฐ์ ˆ ์™„๋ฃŒ

About

๐Ÿ“… ์ผ์ • ๊ด€๋ฆฌ, ๊ฐ์ •์ผ๊ธฐ๋ฅผ ์“ธ์ˆ˜ ์žˆ๋Š” ๋ผ์ดํ”„ ์บ˜๋ฆฐ๋” ์‚ฌ์ดํŠธ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published