Date.toISOString() ๋กœ ์ธํ•œ -9์‹œ๊ฐ„ ๋˜๋Œ๋ฆฌ๊ธฐ (@date-fns)
ยท
issue
์บ˜๋ฆฐ๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „, ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋งŒ ์žˆ์—ˆ์„ ๋•Œ๋Š” ์ €์žฅํ•œ ๋‚ ์งœ(created_at)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒœ์Šคํฌ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์บ˜๋ฆฐ๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ์ €์žฅ ๋‚ ์งœ ๋”ฐ๋กœ, ํƒœ์Šคํฌ ๊ธฐ์ค€์ผ ๋”ฐ๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋˜์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด due_date ์ปฌ๋Ÿผ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.ALTER TABLE tasksADD COLUMN due_date DATE; ์ดํ›„ createTaskํ•˜๋Š” ํ•จ์ˆ˜์— props๋กœ due_date๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์ด์™ธ์˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ์ž‘์„ฑํ•ด์„œ Calendar ํŽ˜์ด์ง€์—์„œ ๋ชจ๋‹ฌ๋กœ ํƒœ์Šคํฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ DB๋ฅผ ํ™•์ธํ•˜๋‹ˆ due_date๊ฐ€ -1์ผ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.๊ทธ๋ž˜์„œ timestamptz๋กœ ํƒ€์ž…์„ ๋ฐ”๊พธ๊ณ  ์‹œ๋ถ„์ดˆ๊นŒ์ง€ ๋ณด๋‹ˆ๊นŒ -9์‹œ๊ฐ„์ด ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ UTC ๊ธฐ์ค€์œผ๋กœ ๋‚ ์งœ๊ฐ€ ์ €์žฅ๋œ ๊ฒƒ์„ ํ™•์ธํ• ..
picture, source, img ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• ์ด๋ฏธ์ง€ ๊ตฌํ˜„ (CSS)
ยท
What I Learn
: ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ์†Œ์Šค๋ฅผ ์ง€์ •ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์†Œ์Šค๋ฅผ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ• ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋ฉด์„œ ์—ฌ๊ธฐ์„œ ์Šคํƒ€์ผ์„ ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค. : picture ํƒœ๊ทธ ๋‚ด์—์„œ ์กฐ๊ฑด์„ ์ง€์ •ํ•˜๊ณ , ํ•ด๋‹น ์กฐ๊ฑด์— ๋งž๋Š” ์ด๋ฏธ์ง€๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์— media-query๋ฅผ ํ†ตํ•ด ์–ด๋– ํ•œ ์กฐ๊ฑด์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. @media (width: 734px) ์š”๋Ÿฐ... : ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํƒœ๊ทธ. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ picture ํƒœ๊ทธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, img ํƒœ๊ทธ์— ์„ค์ •๋œ ์ด๋ฏธ์ง€๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋กœ๋“œ๋œ๋‹ค.โžก๏ธ ์‚ฌ์šฉ ์˜ˆ์‹œ  ์˜ˆ์ „์—๋Š” ์ด๋Ÿฐ ์ด๋ฏธ์ง€ ์กฐ์ ˆ๋˜๋Š” ๊ฑฐ ๋ณด๊ณ  ์งฑ ํฐ ์ด๋ฏธ์ง€ ํ•˜๋‚˜ ๋‘๊ณ  ํฌ๊ธฐ ์กฐ์ ˆํ•˜๋Š” ๊ฑด๊ฐ€? ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์œ ๋ฌด์— ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค. ์ƒ..
media-query๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„์‹œ width์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ / ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ์˜ ์šฐ์„  ์ˆœ์œ„ (tailwindCSS)
ยท
What I Learn
๋ฐ˜์‘ํ˜• ์ด๋ฏธ์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ทฐํฌํŠธ width์— ๋”ฐ๋ผ ๋ณ€ํ™”๋ฅผ ์ฃผ๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๊พธ sm ์‚ฌ์ด์ฆˆ, lg ์‚ฌ์ด์ฆˆ๋งŒ ์ ์šฉ๋˜๊ณ  ์ค‘๊ฐ„ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ ์šฉ์ด ์•ˆ ๋˜๊ณ  ํ—›๋„๋Š” ๊ฒƒ;;์‚ฌ์ด์ฆˆ์— ๋ณ€ํ™”๋ฅผ ์ฃผ๊ฑฐ๋‚˜ ์ด๊ฒƒ ์ €๊ฒƒ ๋งŒ์ ธ๋ด๋„ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๋‹ค๊ฐ€ ํ•ด๊ฒฐ์ฑ…์„ ์•Œ์•„๋ƒˆ๋‹ค. ๋จผ์ € ๋ฌธ์ œ ์ƒํ™ฉ์„ ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.โžก๏ธ ๋ฌธ์ œ ์ƒํ™ฉ !@media screen and (max-width: 734px) { .section-tile-wrapper { min-height: 490px; justify-content: flex-end; }}@media screen and (max-width: 1068px) { .section-tile-wrapper { min-hei..
zustand๋ฅผ ์‚ฌ์šฉํ•œ ์œ ์ € ์ •๋ณด ์ „์—ญ ๊ด€๋ฆฌ
ยท
What I Learn
โžก๏ธ ๋ฌธ์ œ ์ƒํ™ฉ ! ๋ฉ”์ธ ํ™”๋ฉด์—์„œ ์œ ์ €์˜ email์„ ์œ ์ € ๋„ค์ž„์œผ๋กœ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์œ ์ € ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ. 1์ฐจ: useState๋กœ 1:1 ๊ด€๋ฆฌ2์ฐจ: ์ „์—ญ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด store ์ž‘์—…3์ฐจ: ๋กœ๊ทธ์ธ์ด ๋˜์—ˆ์„ ๋•Œ๋งŒ ์œ ์ €์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ฆฌํŒฉํ† ๋ง 1์ฐจ ์‹œ๋„ ->ํ•„์š”ํ•œ ํŒŒ์ผ๋งˆ๋‹ค useState๋กœ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ (1:1)const [userData, setUserData] = useState(null) useEffect(() => { const fetchData = async () => { const supabase = createClient() const { data: { user }, error } = await supabase.auth.getUser() setU..