Safari์—์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„ ํ˜ธ์ถœํ•˜๋Š” window.open() ์šฐํšŒํ•ด์„œ ํ•ด๊ฒฐ
ยท
issue
๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์€ '์‹ ๊ณ ํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์‹ ๊ณ ํ•˜๋Š” ํผ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ' ์˜€๋Š”๋ฐ, ์ด ์ตœ์†Œ ๊ธฐ๋Šฅ๋งŒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์‹ ๊ณ ํ•˜๋Š” ํผ์— ํ•„์š”ํ•œ ์–‘์‹๋“ค์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด ํŽ˜์ด์ง€๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋” ์ข‹์„ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜ ํ›„ ์‹ ๊ณ ํ•˜๋Š” ํผ์€ ์ƒˆ ํƒญ์œผ๋กœ ์—ด๋ฆฌ๊ฒŒ ํ•˜๊ณ , ๊ธฐ์กด ํŽ˜์ด์ง€๋Š” ์ด๋™์—†์ด ์œ ์ง€ํ•˜๋„๋กํ•˜๋ฉด์„œ, ๊ธฐ์กด ๊ธฐํš/๋””์ž์ธ์—์„œ ์žˆ์—ˆ๋˜ ํ† ์ŠคํŠธ๋Š” ์‚ญ์ œํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ํƒญ์œผ๋กœ ์—ด๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ window ๊ฐ์ฒด์˜ open ํ•จ์ˆ˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.'use client'export default function Page({ params: { userId, messageId },}: { params: {..
useCustom hook์„ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค ํ—ค๋”์˜ ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
ยท
What I Learn
์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ผ์šฐํ„ฐ๋Š” /messagebox/[userId]/[type]/[messageId]/[options] ์ธ๋ฐ, ๋งˆ์ง€๋ง‰ ๊ฒฝ๋กœ [options]๋Š” ๋ณ‘๋ ฌ ๋ผ์šฐํŒ…์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๊ฒฝ๋กœ ๊ฐ€๋กœ์ฑ„๊ธฐ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ์ƒ์œ„์— ๋„์šฐ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•œ ํŽ˜์ด์ง€์™€ ์ชฝ์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” reaction ํŽ˜์ด์ง€๊ฐ€ ์žˆ์–ด์„œ ๊ฒฝ๋กœ์— ๋งž์ถฐ ๊ธฐ๋Šฅ์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ๋‹จ์ˆœํžˆ router.back()์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค ํ•˜๋‹ˆ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์˜๋„ํ•œ ๋ฐ”๋กœ ๋’ค๋กœ๊ฐ€๊ธฐ๊ฐ€ ๋˜์ง€ ์•Š๋˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์žกํ•œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๊ณ  ํŠน์ • ๊ฒฝ๋กœ์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ ํ›…์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” router.back() ์ด์—ˆ์„ ๋•Œ ํ˜„์ƒ์ž…๋‹ˆ๋‹คhttps://youtu...
husky์™€ GitHub Actions์„ ์‚ฌ์šฉํ•œ CICD
ยท
What I Learn
์ด์ „์— ํˆฌ๋‘ํƒœ์Šคํฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ํŒ€ ์ €์žฅ์†Œ๋ฅผ forkํ•ด์™€์„œ ๊ฐœ์ธ ๋ ˆํฌ์—์„œ AWS Amplify๋กœ ๋ฐฐํฌํ–ˆ๋Š”๋ฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์–‘์ชฝ์— ๋‹ค push ํ•ด์ค˜์•ผ ํ–ˆ๋˜ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ๋А๊ผˆ๋˜ ๊ฒฝํ—˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.Amplify๋กœ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ๋“ค์—ˆ๋˜ ๊ฒŒ Next.js๋กœ ๋ฐฐํฌ๋ฅผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด vercel์ด ๊ฐ™์€ ํšŒ์‚ฌ๋ผ์„œ ์—ฐ๋™์ด ์‰ฝ๊ณ  CICD๋ฅผ ์ž˜ ๊ตฌ์ถ•ํ•ด๋‘ฌ์„œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ง์„ ๋“ค์€ ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.์›น์„œ๋ฒ„ ๊ตฌ์ถ•์— ์–ด๋ ค์›€์„ ๋А๋ผ๊ณ  ์žˆ๋˜ ๋•Œ Vercel๋กœ ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ•˜๋ฉด ์•ˆ๋˜๋‚˜? ์‹ถ์–ด์„œ ํ•ด๋ณด์•˜๋Š”๋ฐ, ์ž‘์—…์„ ๋๋‚ด๊ณ  ์ฐพ์•„๋ณด๋‹ˆ๊นŒ Vercel์„ ์›น์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ Vercel์˜ ์„œ๋ฒ„๋ฆฌ์Šค ํ•œ๊ณ„์™€ ์„ฑ๋Šฅ์„ ๊ณ ๋ คํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ดํ›„ AWS EC2์™€ Nginx๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›น์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค..
Intersection Observer API๋ฅผ ์‚ฌ์šฉํ•ด ๋ทฐํฌํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ
ยท
What I Learn
์ด์ „์— offset ๊ธฐ๋ฐ˜ ๋ฌดํ•œ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋Š” ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ทฐํฌํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€๋กœ๋“œํ•˜๋„๋ก ํ–ˆ์—ˆ๋Š”๋ฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ์„œ๋ฅผ ์ญ‰ ์ฝ์–ด๋ณด๋‹ค๊ฐ€ ํŽ˜์ด์ง€ ๋‚ด์— ๊ฐ ์š”์†Œ๊ฐ€ ๊ฐ๊ฐ์˜ ๋ชฉ์ (๊ด‘๊ณ , ๋ ˆ์ด์ง€ ๋กœ๋”ฉ, ๋ฌดํ•œ ์Šคํฌ๋กค ๋“ฑ)์˜ ์ด์œ ๋กœ scroll ์ด๋ฒคํŠธ๋ฅผ ๋ฆฌ์Šค๋‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ์ƒ์‘ํ•˜๋Š” ์ฝœ๋ฐฑ์ด ๋ฌด์ˆ˜ํžˆ ์‹คํ–‰๋  ์ˆ˜๋„ ์žˆ๊ณ  ์ด๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์— ํฐ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋‹ค๊ฐ€ ํƒ€๊ฒŸ ์š”์†Œ์™€ ๋ทฐํฌํŠธ์˜ ๊ต์ฐจ์ ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ด€์ฐฐํ•ด์„œ ์š”์†Œ๊ฐ€ ๋ทฐํฌํŠธ์— ํฌํ•จ๋˜๋Š”์ง€ ์•„๋‹Œ์ง€ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” Intersection Observer API๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค ์ด๋ฒคํŠธ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ throttling/debouncing์ด ๋ถˆํ•„์š”ํ•˜๋‹ค๋Š” ์ , ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ..