๐Ÿ ์›น์œผ๋กœ ๋นš์€ ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ

์ž”๋ง ๋ง๊ณ  ์ผ๋‹จ ๋จผ์ € ๋ณด์—ฌ์ค˜์š”

๊ทธ๋Ÿผ์š”. ์•„๋ž˜ ๊ฒ€์ •์ƒ‰ ํƒ€์›์„ ํด๋ฆญํ•ด๋ณด์„ธ์š”. ์ œ๊ฐ€ ํ˜„์žฌ ๋“ฃ๊ณ  ์žˆ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์€ 30๊ฐœ์˜ ์Œ์•… ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ๋‚˜ํƒ€๋‚ ๊ฑฐ์˜ˆ์š”.

๋ฆฌ๋ฒ„์Šค์—”์ง€๋‹ˆ์–ด๋งํ•œ Apple Music API๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๊ณ , ๋•Œ๋ฌธ์— API๋ฅผ ๋”์ด์ƒ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์œ ๋Šฅํ•œ ์˜ˆ์ˆ ๊ฐ€๋Š” ๋ชจ๋ฐฉํ•˜๊ณ  ์œ„๋Œ€ํ•œ ์˜ˆ์ˆ ๊ฐ€๋Š” ํ›”์นœ๋‹ค โ€” ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—๋Š” Vercel์˜ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜ ๋‹ด๋‹น VP Lee Robinson์˜ ์•„์ด๋””์–ด ํ•˜๋‚˜๋ฅผ ๋ฒ ๊ปด๋ณด๋ ค ํ•œ๋‹ค. Next.js์˜ ๊ฐ์ข… ์‹ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๋Š” ์‹คํ—˜์ ์ด์ง€๋งŒ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•„๋ฆ„๋‹ค์šด ํฌํŠธํด๋ฆฌ์˜ค๋กœ ์œ ๋ช…ํ•œ leerob.io์—๋Š” ํ•œ ๊ฐ€์ง€ ์žฌ๋ฏธ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์ž์‹ ์ด ํ˜„์žฌ ๋“ฃ๊ณ  ์žˆ๋Š” ์Œ์•…์ด ์›น์— ๊ฐ™์ด ๋‚˜ํƒ€๋‚˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

ALT: leerob.io ์›น์‚ฌ์ดํŠธ ํ•˜๋‹จ์˜ ๋ชจ์Šต

Now Playing โ€” Spotify @ leerob.io

๋ˆ„๊ตฌ๋ณด๋‹ค ์Œ์•…์  ์ทจํ–ฅ์ด ๋šœ๋ ทํ•œ ๋‚˜์˜€๊ธฐ์— ์–ธ์  ๊ฐ€๋Š” ์ด๋ฅผ ๊ผญ ๋‚ด ์›น์‚ฌ์ดํŠธ์— ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. ๋‹ค๋งŒ ๋‹จ์ˆœํ•˜๊ฒŒ ์žฌํ˜„ํ•˜๋Š” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ ๋ฌด์–ธ๊ฐ€ ๊ธฐ์ˆ ์ ์ธ ๋„์ „์„ ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. ๋‹น์‹œ ์—ฌ๋Ÿฌ ์Œ์•… ์„œ๋น„์Šค๋ฅผ ๋Œ์•„๊ฐ€๋ฉฐ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์žˆ์—ˆ๊ธฐ์— ๊ตณ์ด ๊ฐœ๋ฐœ์„ ์„œ๋‘๋ฅด์ง€ ์•Š์€ ์ด์œ ๋„ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ด์œ ๋กœ ๊ฐœ๋ฐœ์„ ์ด๋ฆฌ์ €๋ฆฌ ๋ฏธ๋ฃจ๋‹ค 2022๋…„์— ์ด๋ฅด๋ €๋‹ค. ๊ทธ๋Ÿฌ๋˜ ์ค‘ Apple์ด ์ตœ๊ทผ ์‹ ๋ฐ•ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋ฐœํ‘œํ–ˆ๋‹ค. ๋ฐ”๋กœ ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ(Dynamic Island)๋ผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

ALT: ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ์˜ ๋ชจ์Šต

ํ™”๋ฉด ์ƒ๋‹จ ํŽ€์น˜ํ™€์ด ์ž์œ ์ž์žฌ๋กœ ํฌ๊ธฐ๋ฅผ ๋ฐ”๊พธ๋ฉฐ ๋‹ค์–‘ํ•œ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

๋‚ด๊ฐ€ ๋ฐ”๋ผ๊ณ  ์žˆ๋˜ ๊ธฐ์ˆ ์ ์ธ ๋„์ „์ด์—ˆ๋‹ค! ์ด๋ฅผ ์›น์—์„œ ์ •ํ™•ํ•˜๊ฒŒ ๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒฐ๋ก ์— ์ด๋ฅด๋ €๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์•ˆ๋“œ๋กœ์ด๋“œ ์ „์šฉ ๋ณต์ œํ’ˆ์„ ์ธํ„ฐ๋„ท์—์„œ ํ™•์ธํ•˜๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ์ „๋ถ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ณก์„ ์ด ๋ถ€์ž์—ฐ์Šค๋Ÿฌ์›Œ ์ด๋Ÿฐ ๋””ํ…Œ์ผ์„ ๊ณต๋ถ€ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค.

๋ชฉํ‘œ

์›น ์ƒ์—์„œ ๋‚ด๊ฐ€ ํ˜„์žฌ ๋“ฃ๊ณ  ์žˆ๋Š” ์Œ์•…์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ ๐Ÿ ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž.

๊ฟ€ํŒ

์ด ํ”„๋กœ์ ํŠธ์˜ ์—ฐ๊ตฌ ๊ธฐ๋ก๋„ ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค.

๐Ÿ›  ๊ธฐ์ˆ  ์ •ํ•˜๊ธฐ

์šฐ์„  ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋Š” ๊ฐ€์žฅ ์ต์ˆ™ํ•œ Next.js์™€ Tailwind๋ฅผ ๊ณจ๋ž๋‹ค. ๋ฌธ์ œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด์—ˆ๋‹ค. ๊ฐ„๋‹จํ•œ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋‹ค๋ฃจ์–ด ๋ณด์•˜์ง€๋งŒ ease-in-ease-out ์ด์ƒ์˜ ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋‹ค๋ค„๋ณด์ง€ ๋ชปํ–ˆ๋‹ค. Framer Motion์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ๊ฒŒ ๋˜์–ด ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

ALT: Framer Motion์˜ ์›น์‚ฌ์ดํŠธ

Framer Motion

๐Ÿง‘๐Ÿปโ€๐Ÿซ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ฌผ๋ฆฌ

์šฐ์„  Apple์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋‹ค๋ฅธ ๋ชจ๋ฐฉ์ž‘์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™œ ๋‹ฌ๋ผ๋ณด์ด๋Š”์ง€๋ถ€ํ„ฐ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์—๋„ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ, ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. (์ตœ์†Œํ•œ Apple ํ”Œ๋žซํผ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด ์ง€์›ํ•œ๋‹ค.) ์•„์ฃผ ๋‹จ์ˆœํ•˜๊ฒŒ ์ดํ•ดํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Parametric Curve. ์‹œ์ž‘์ ๊ณผ ์ข…์ฐฉ์ ์ด ์žˆ์„ ๋•Œ, ๊ทธ ์‚ฌ์ด ์กฐ์ž‘์ (Control Point)์„ ๋‘๊ณ  ๊ทธ ์กฐ์ž‘์  ์‚ฌ์ด๋ฅผ ์ˆ˜ํ•™ ๊ณต์‹์„ ์ด์šฉํ•ด ๋ณด๊ฐ„(interpolate)ํ•œ๋‹ค. ๋ณด๊ฐ„์— ์‚ฌ์šฉ๋˜๋Š” ๊ณต์‹์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ Linear Curve, Polynomial Curve, Spline Curve ๋“ฑ์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” Bezier Curve๋„ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋œ๋‹ค.

Spring Curve. ๊ณ ์ „ ๋ฌผ๋ฆฌํ•™์˜ ํƒ„์„ฑ ๋ฐฉ์ •์‹(Hooke's law์™€ ๊ทธ์— ๊ธฐ๋ฐ˜ํ•œ ์ˆ˜๋งŽ์€ ๋ฐฉ์ •์‹)์„ ์ด์šฉํ•ด ๊ฒฝ์ง๋„(Stiffness)์™€ ์ œ๋™ ๊ณ„์ˆ˜(Dampening)๋ฅผ ํ†ตํ•œ ๋ฌผ๋ฆฌ์ ์ธ ๊ถค๋„๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ๋” ์•Œ์•„๋ณด๊ธฐ: Maxime Heckel

์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ณก์„ ์— ๋Œ€ํ•ด์„œ ๋” ๊นŠ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์ด ๊ธ€์˜ ์ดˆ์ ์—์„œ ๋ฒ—์–ด๋‚˜๋‹ˆ ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ ์žฌํ˜„์ž‘๋“ค์ด ์œ„์˜ Parametric Curve๋ฅผ ์ด์šฉํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ œ์ž‘ํ•˜๋Š” ๋ฐ˜๋ฉด (CSS์— ๋‚ด์žฅ๋˜์–ด ์ œ๊ณต๋˜๋‹ˆ ๊ฐ€์žฅ ์‰ฝ๊ธฐ๋„ ํ•˜๋‹ค) Apple์˜ ๊ฒฝ์šฐ ํ˜„์‹ค์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ธ์ง€ Spring Motion์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ฒˆ์— ์‚ฌ์šฉํ•œ Framer Motion์—์„œ๋„ useSpring()์ด๋ผ๋Š” React Hook์„ ํ†ตํ•ด ์ด๋Ÿฐ ๋ฌผ๋ฆฌ์ ์ธ ์›€์ง์ž„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.


useSpring(x, { stiffness: 1000, damping: 10 })

๐Ÿ›ฅ ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋ฅผ ํ–ฅํ•ด

Source: Apple

์šฐ์„  Apple์˜ ๋ฌธ์„œ๋ฅผ ๊นŠ์ด ์ฝ์–ด๋ณด๋ฉฐ ์ด๋Ÿฐ ์ €๋Ÿฐ ํŠน์ง•๋“ค์„ ๊ณต๋ถ€ํ–ˆ๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋Š” ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋‹ค์Œ์˜ ํ˜•ํƒœ๋ฅผ ์ง€๋‹Œ๋‹ค.

Minimal: ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ์˜ ํ•œ์ชฝ์„ ์ฐจ์ง€ํ•˜๋Š” ์ž‘์€ ํ˜•ํƒœ์ด๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™์ž‘์ด ์ž‘๋™ํ•  ๋•Œ ๊ฐ๊ฐ ํ•œ์ชฝ์”ฉ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋œ๋‹ค. Compact: ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ์˜ ์–‘์˜†์„ ์ฐจ์ง€ํ•˜๋Š” ์ค‘๊ฐ„ ์‚ฌ์ด์ฆˆ์ด๋‹ค. ๋‹จ์ผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™์ž‘(์Œ์•…. ํƒ€์ด๋จธ. ๋“ฑ)์ด ์ž‘๋™ํ•  ๋•Œ ์–‘ ์˜†์„ ๋ชจ๋‘ ์ฐจ์ง€ํ•œ๋‹ค. Expanded: ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ์˜ ์ตœ๋Œ€ ์‚ฌ์ด์ฆˆ์ด๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋ฅผ ๊ธธ๊ฒŒ ๋ˆ„๋ฅด๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ๋‚˜ํƒ€๋‚œ๋‹ค. ๋นจ๊ฐ„ ์˜์—ญ์—๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ๋ชปํ•œ๋‹ค.

๋”๋ถˆ์–ด์„œ ์ธํ„ฐ๋„ท ์–ด๋”˜๊ฐ€์—์„œ ๋‹ค์Œ ์‚ฌ์ง„๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. Apple ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ Expanded๋ผ๊ณ  ๋‘๋ฃจ๋ญ‰์‹คํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ˜๋ฉด ์ด ์‚ฌ์ง„์—๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋™์‹œ์— ๋‚˜ํƒ€๋‚œ๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์ด์ฆˆ. ์‚ฌ์ง„์— ์˜คํƒ€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๊ณต์‹์ ์ธ ์ž๋ฃŒ๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค. ์ฐธ๊ณ  ์ž๋ฃŒ๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

์ด๋ฅผ ๋ฐ˜์˜ํ•ด์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ ํƒ€์ž… ์ •์˜๋ฅผ ํ•ด๋ณด์•˜๋‹ค.

export type DynamicIslandSize =
  | 'compact'
  | 'minimalLeading'
  | 'minimalTrailing'
  | 'default'
  | 'long'
  | 'large'
  | 'ultra'

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•˜๋ฃป๋ฐค์„ ๊ฐˆ์•„๋„ฃ์–ด (2022๋…„ 10์›” 16์ผ) Framer Motion์„ ์ด์šฉํ•ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํฌ๊ธฐ ์ „ํ™˜์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ๋‹ค. ๋‹ค์Œ์˜ ์ฝ”๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํŠนํžˆ stiffness์™€ damping ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋งŽ์€ ์‹คํ—˜์„ ํ–ˆ๋‹ค. ์•Œ์•„๋‚ธ ๊ฐ’์€ const stiffness = 400 ๊ทธ๋ฆฌ๊ณ  const damping = 30.

<motion.div
  id={props.id}
  initial={{
	opacity: props.size === props.before ? 1 : 0,
	scale: props.size === props.before ? 1 : 0.9,
  }}
  animate={{
	opacity: props.size === props.before ? 0 : 1,
	scale: props.size === props.before ? 0.9 : 1,
	transition: { type: 'spring', stiffness: stiffness, damping: damping },
  }}
  exit={{ opacity: 0, filter: 'blur(10px)', scale: 0 }}
  style={{ willChange }}
  className={props.className}
>

ALT: 2022๋…„ 10์›” 16์ผ ์™„์„ฑํ•œ ๋ชจ์Šต

2022๋…„ 10์›” 16์ผ ์™„์„ฑํ•œ ๋ชจ์Šต

๐Ÿ“ž ์ „ํ™” ๊ตฌํ˜„

๋‹ค๋ฅธ API๋ฅผ ๋ถ™์ด๊ธฐ ์ „์— ์ฒ˜์Œ ํ•œ ๊ฒƒ์€ ์ „ํ™” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ผ์ด์—ˆ๋‹ค. ํฐ ์ด์œ ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ์‹ค์ œ๋กœ ์™„์„ฑ๋œ ์ œํ’ˆ์„ ๋ณด๋‹ˆ ์‹ค์ œ Apple์˜ ์ œํ’ˆ๊ณผ ์•„์ฃผ ๋‹ฎ์•„ ๋งˆ์Œ์— ๋“ค์—ˆ๋‹ค. 2022๋…„ 10์›” 20์ผ์— ์™„์„ฑ๋˜์—ˆ๋‹ค.

๐ŸŽ Apple Music API

๊ทธ ๋‹ค์Œ ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ์€ Apple Music API์™€ ์—ฐ๋™ํ•˜๋Š” ์ผ์ด์—ˆ๋‹ค. 2021๋…„ ์ดˆ์— Spotify๋ฅผ ์ด์šฉํ•ด์„œ ๊ธฐ์ˆ  ์‹œ์—ฐ์„ ์™„์„ฑํ•œ ์ ์ด ์žˆ๋‹ค. Spotify์—๋Š” Now Playing API๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ Apple Music๋„ Now Playing API๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

Apple Music API 1.1์ด ์–ธ์ œ ์ถœ์‹œ๋œ ๊ฒƒ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋น„๊ต์  ์ตœ๊ทผ์— Get Recently Played Tracks๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋น„์Šทํ•œ API๊ฐ€ ๊ณต๊ฐœ๋˜์—ˆ๋‹ค.

ALT: Apple Music Get Recently Played Tracks

์ฐธ๊ณ ๋กœ 2๋…„ ์ „๋งŒ ํ•ด๋„ API๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.

์ด์ œ ํ•„์š”ํ•œ ๊ฒƒ์€ OAuth 2.0์— ํ•„์š”ํ•œ ๊ฐ์ข… ํ† ํฐ๋“ค์„ ๋ฐœ๊ธ‰ ๋ฐ ์ €์žฅํ•˜๋Š” ์ผ์ด๋‹ค. Spotify์˜ ๊ฒฝ์šฐ OAuth 2.0 ํ‘œ์ค€์„ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋‹ค์‹œํ”ผ ํ–ˆ๋Š”๋ฐ Apple์€ ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ๋” ํ•„์š”ํ–ˆ๋‹ค. ํŠนํžˆ ์ด Now Playing ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ Apple๊ณผ์˜ ์ธ์ฆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค ๋ณด๋‹ˆ ์‚ฌ์šฉ์ž์˜ ๋™์˜ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ๊ถŒํ•œ ์ฒ˜๋ฆฌ๋„ ๋ณ„๋„๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋ฌธ์„œํ™”๊ฐ€ ์ œ๋Œ€๋กœ ๋˜์–ด์žˆ์ง€ ์•Š์•„ ๊ฝค ๊ณจ์น˜ ์•„ํŒ ๋‹ค. ์šฐ์„  ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋น„ํ–‰๊ธฐApple์—์„œ์˜ ๋™์ผํ•œ ๊ฐœ๋…์„ค๋ช…
ํ•ญ๊ณต๊ธฐ ์‚ฌ์—…์„ ์œ„ํ•œ ๋น„์šฉ ์ฒ˜๋ฆฌApple Developer ์œ ๋ฃŒ ๊ณ„์ •$99
์กฐ์ข…์‚ฌ ์ž๊ฒฉ์ฆApple Developer์—์„œ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” Apple Music KeyApple Music ๊ด€๋ จ ์„œ๋น„์Šค์— ๋‚ด๊ฐ€ ์š”์ฒญ์„ ๋‚ ๋ฆด ๋ฒ•์  ๊ถŒํ•œ์ด ์žˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.
ํ•ญ๊ณต๊ธฐ ์šดํ•ญ์Šน์ธ ์‹ ์ฒญ์„œApple ์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” Apple Music Main TokenApple Music ๊ด€๋ จ ์„œ๋น„์Šค์— ๋‚ด๊ฐ€ ์š”์ฒญ์„ ๋‚ ๋ฆด ๋•Œ ์“ธ ํ†ตํ–‰์ฆ์„ ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค.
ํƒ‘์Šน์ž๊ฐ€ ๊ตฌ๋งคํ•˜๋Š” ๋น„ํ–‰๊ธฐ ํ‹ฐ์ผ“์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ํ”Œ๋กœ์šฐ๋ฅผ ๊ฑฐ์ณ ๋ฐœ๊ธ‰ ๋ฐ›๋Š” Apple Music User Token๋‚ด ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด์— ์ ‘๊ทผํ•ด๋„ ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋™์˜๋ฅผ ํ™•์ธํ•œ๋‹ค.

์ด 4๊ฐ€์ง€ ์ •๋ณด๋“ค์ด ๋ชจ๋‘ ์—ฐ๋™๋˜์–ด์•ผ์ง€ ์ •์ƒ์ ์œผ๋กœ ์ •๋ณด(์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์Šจ ์Œ์•…์„ ๋“ฃ๊ณ  ์žˆ์—ˆ๋Š”๊ฐ€)๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์™€์ค‘์— ๋งˆ์ง€๋ง‰ User Token์€ iOS, macOS์™€ MusicKit on the Web ๋“ฑ ์•„์ฃผ ์ œํ•œ์ ์ธ ํ˜•ํƒœ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด๋†“์•˜๋‹ค. MusicKit on the Web์€ music.apple.com๋‚˜ Cider, LitoMusic ๋“ฑ Apple Music ์›น ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด์ง€ ์ง€๊ธˆ ์ด ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์ž์œ ์ž์žฌ๋กœ API ์š”์ฒญ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฐ๋ฐ๋„ Apple ๋ฌธ์„œ์—๋Š” ๋”ฑ ์ €๋ ‡๊ฒŒ MusicKit on the Web๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค๋ผ๊ณ ๋งŒ ๋‚˜์™€์žˆ๊ณ  ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ•˜๋Š”์ง€ ์ „ํ˜€ ์–ธ๊ธ‰์ด ์—†๋‹ค.

๊ทธ๋Ÿผ ์–ด๋–กํ•˜๊ฒ ๋‚˜. ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง ํ•ด๋ด์•ผ์ง€. ๋‚˜๋จธ์ง€ ๋‹จ๊ณ„๋“ค์€ ๋น„๊ต์  ์ง๊ด€์ ์ธ ๋‹จ๊ณ„๋“ค๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค. ์—ฐ๊ตฌ ๊ธฐ๋ก ์ฐธ๊ณ .

Apple: ๋ฌธ์„œํ™” ๊ทธ๋Ÿฐ๊ฑฐ ๋ชจ๋ฅด๊ฒ ๊ณ  MusicKit on the Web์„ ํ†ตํ•ด์„œ๋งŒ ํ•˜๋ผ๊ณ ~

ALT: MusicKit on the Web

MusicKit on the Web. ์• ํ”Œ ์„ฑ๊ฒฉ์— Storybook ๋ฌธ์„œ๋กœ ๋œ ๊ฒƒ์„ ๋ณด๋ฉด ์•„์ง ์™„์ „ ์ดˆ๊ธฐ ๋ฒ ํƒ€์ธ๊ฐ€ ๋ณด๋‹ค.

๐Ÿฆพ MusicKit ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋ง

์šฐ์„  MusicKit on the Web์˜ ๊ธฐ๋ณธ์ ์ธ ์ŠคํŽ™์„ ๋ชจ๋ฐฉํ•˜๋ฉฐ ๊ธฐ์ดˆ์ ์ธ ์›น์„ ๋งŒ๋“ค์—ˆ๋‹ค.

์•„๋ฌด ๊ฒƒ๋„ ์—†์ด ์ธ์ฆ ํ”„๋กœ์„ธ์Šค๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์›นํŽ˜์ด์ง€์ด๋‹ค.

์ด๋ ‡๊ฒŒ Apple Music ๊ถŒํ•œ ์ธ์ฆ ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ๋ถ€ํ„ฐ ์›นํŽ˜์ด์ง€์˜ ์š”์ฒญ ํ—ค๋”๋ฅผ ๊นŒ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด media-user-token์ด๋ผ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Postman์—์„œ key๋“ค์„ ๋ชจ๋‘ ์ฑ„์›Œ์„œ ์š”์ฒญ์„ ๋‚ ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด JSON ์‘๋‹ต์ด ๋Œ์•„์˜ด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ 2022๋…„ 10์›” 28์ผ๊นŒ์ง€ ์ง„ํ–‰๋œ ๊ฐœ๋ฐœ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋‹จ์ˆœํ•˜๊ณ  ์งง๊ณ  ์ง์ ‘์ ์ธ ๊ณผ์ •์œผ๋กœ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฉฐ์น ์ด ์‚ด์‚ด ๋…น์•˜๋‹ค ๐Ÿ˜ญ

์‚ฌ๋žŒ๋“ค์ด ์ ‘์†ํ•  ๋•Œ๋งˆ๋‹ค API ์š”์ฒญ์„ ๋‚ ๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด ๋‹น์—ฐํžˆ ์ˆœ์‹๊ฐ„์— API Quota๋ฅผ ๋‹ค ์“ธ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋– ํ•œ ํ˜•ํƒœ๋กœ๋“  ์บ์‹œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ๊ณ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹ฌํ•˜์ž.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š” ์—†์„ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์“ฐ์ง€ ๋งˆ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑด ์ƒ๊ฐ๋ณด๋‹ค ๊ฝค ์ž์ฃผ ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ๋ž๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ „์„ธ๊ณ„ 195๊ฐœ ๋‚˜๋ผ ์ด๋ฆ„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง‘์–ด๋„ฃ๊ณ  ๋งค๋ฒˆ joinํ•  ํ•„์š”๊ฐ€ ์žˆ๊ฒ ์–ด์š”? ๊ทธ๋ƒฅ config ํŒŒ์ผ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๊ณ  ๋ถ€ํŒ…ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ฝ์–ด ๋“ค์ด์ž๊ณ ์š”. ์•„๋‹ˆ๋ฉด, ์ด์ปค๋จธ์Šค ์‚ฌ์ดํŠธ์˜ ์ „์ฒด ์ œํ’ˆ ๋ชฉ๋ก์„ ํ•˜๋‚˜์˜ YAML์— ๋‹ค ๋„ฃ์–ด๋ฒ„๋ฆฌ๊ณ  ์„œ๋ฒ„๊ฐ€ ๋ถ€ํŒ…ํ•  ๋•Œ ์ฝ์–ด๋“ค์ด๋ฉด ์–ด๋•Œ์š”? ์ด๊ฒƒ์€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒฝ์šฐ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. It's not Ruby that's slow, it's your database

๊ทธ๋ƒฅ GitHub Secrets์— ๋น„๋ฐ€ ํ‚ค๋ฅผ ์ €์žฅํ•ด๋†“๊ณ  ๋ช‡ ๋ถ„์— ํ•œ ๋ฒˆ์”ฉ API๋ฅผ ์š”์ฒญํ•ด GitHub์— ๋„์›Œ๋‘๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

์ด ์˜คํƒ€ ์ฐพ๋Š”๋ฐ ๋ช‡ ์‹œ๊ฐ„์„ ์ผ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

๐ŸŽผ ์ดํ€„๋ผ์ด์ €

์•ž์„œ ์ „ํ™” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™„์„ฑํ•œ ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์Œ์•… ํ”Œ๋ ˆ์ด์–ด ์ปดํฌ๋„ŒํŠธ๋„ ์™„์„ฑํ–ˆ๋‹ค.

๊ทผ๋ฐ ์–ด๋”˜๊ฐ€ ๋„ˆ๋ฌด ํ—ˆ์ „ํ–ˆ๋‹ค.

๋ฐ”๋กœ ์ดํ€„๋ผ์ด์ €๊ฐ€ ์—†๋Š” ๊ฒƒ์ด๋‹ค. React์— ๊ดœ์ฐฎ์€ ์ดํ€„๋ผ์ด์ €๊ฐ€ ์—†๋Š”์ง€ ์•Œ์•„๋ณด๋‹ค๊ฐ€ ๊ทธ๋ƒฅ Framer Motion์œผ๋กœ ์ด๋งˆ์ €๋„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋ช‡๊ฐ€์ง€ ๋ฐ˜๋ณต์  ๊ฐœ๋ฐœ(iteration)์˜ ๊ณผ์ • ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ•œ๋‹ค.

ALT: FANCY by TWICE ALT: After Like by IVE

ALT: Lavender Haze by Taylor Swift ALT: Hype Boy by NewJeans

์ดํ€„๋ผ์ด์ €์˜ ๊ฐ ๋ด‰์€ ๋ฌด์ž‘์œ„๋กœ ๊ธธ์ด๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. ๊ทผ๋ฐ ๋งˆ์ง€๋ง‰ Hype Boy ์˜ˆ์‹œ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด, ๋ญ”๊ฐ€ ์–ด์ƒ‰ํ•œ ๊ฒƒ์ด ๋А๊ปด์กŒ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์Œ์•…์€ ์ €์Œ์—ญ๋Œ€์™€ ๊ณ ์Œ์—ญ๋Œ€๋Š” ์ง„ํญ์ด ์ž‘์€๋ฐ ๋ฐ˜ํ•ด, ์™„์ „ํ•˜๊ฒŒ ๋ฌด์ž‘์œ„๋กœ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ์ €์Œ์—ญ๋Œ€์™€ ๊ณ ์Œ์—ญ๋Œ€์—๋„ ๋น„์Šทํ•œ ์ง„ํญ์˜ ๋ด‰์ด ๋‚˜ํƒ€๋‚˜์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ๋ด‰๋งˆ๋‹ค ๊ธฐ์ค€์น˜ (baseLength) ๋ฅผ ์ •ํ•ด์ฃผ๊ณ  ๊ทธ ๊ฐ’์—์„œ ยฑ(๋ฌด์ž‘์œ„ ๊ฐ’)์„ ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ดํ€„๋ผ์ด์ €์˜ ์ƒ‰๊น”์„ ์•จ๋ฒ”์•„ํŠธ์˜ ํ‚ค ์ปฌ๋Ÿฌ(Key Color)์™€ ๋™์ผํ•˜๊ฒŒ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ๋ณ„๋„์˜ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง„ ์•Š์•˜๊ณ  Apple Music API์— ๊ทธ ๊ฐ’์ด ๊ฐ™์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.

๐Ÿ”Ž ์Šค์ฟผํด์˜ ๋ฌผ๋ฆฌ

์•„์ง ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์˜ค์‚ฐ์ด๋‹ค! ์ด๋ ‡๊ฒŒ ์™„์„ฑ๋œ ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋„ ์•„์ง ๋ฌด์–ธ๊ฐ€ ์–ด์ƒ‰ํ–ˆ๋‹ค. ๊ณก์„ ์ด ๋‚ ์นด๋กœ์šด ๋А๋‚Œ์ด ๋“ค์—ˆ๋‹ค. ๋ฐ”๋กœ ์Šค์ฟผํด์˜ ๋ฏธ์ ์šฉ ๋•Œ๋ฌธ์ด๋‹ค.

ALT: Squircle

์ถœ์ฒ˜: Apple's Icons Have That Shape for a Very Good Reason @ HackerNoon

์ผ๋ฐ˜์ ์œผ๋กœ borderRadius๋ฅผ ํ†ตํ•ด์„œ ์„ค์ •ํ•˜๋Š” ํ…Œ๋‘๋ฆฌ๋Š” ๊ณก๋ฅ ์ด ์ผ์ •ํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ณก๋ฅ ์ด ์‹œ์ž‘๋˜๋Š” ์ง€์ ์—์„œ ๊ธ‰๊ฒฉํ•œ ๊ณก๋ฅ ์˜ ๋ณ€ํ™”๋กœ ์ธํ•ด ๊ทธ ๋ถ€๋ถ„์ด ๋‚ ์นด๋กญ๊ฒŒ ๋А๊ปด์ง„๋‹ค. ์ด์— ๋ฐ˜ํ•ด์„œ ๊ณก๋ฅ ์„ ์„œ์„œํžˆ ๋†’์˜€๋‹ค๊ฐ€ ๋‚ฎ์ถ”๋ฉด ํ›จ์”ฌ ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์ด ํƒ„์ƒํ•œ๋‹ค.

๋ฌผํˆฌ ํ•™์ƒ๋“ค์„ ์œ„ํ•œ ์„ค๋ช…: ๋“ฑ๊ฐ€์†๋„ ์šด๋™์ด ์•„๋‹ˆ๋ผ ๋“ฑ๊ฐ€๊ฐ€์†๋„ ์šด๋™์„ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค (์†๋„๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ฐ€์†๋„๋ฅผ ์ผ์ •ํ•˜๊ฒŒ ๋ฐ”๊พธ๋Š” ๊ฒƒ).

๊ธฐ๋ฒก ํ•™์ƒ๋“ค์„ ์œ„ํ•œ ์„ค๋ช…: ์Šค์ฟผํด์€ ์ดˆํƒ€์› (Superellipse)์ด๋‹ค. ๋‹ค์Œ ๊ณต์‹์„ ๋งŒ์กฑํ•˜๋Š” ํ˜•ํƒœ๋“ค์ด๋‹ค. ์—ฌ๊ธฐ์—์„œ nn์€ ๊ณก๋ฅ , aa๋Š” xx ์ถ• ๊ธธ์ด, bb๋Š” yy ์ถ•์˜ ๊ธธ์ด์ด๋‹ค. ์ˆ˜ํ•™์ ์œผ๋กœ ๋” ๊นŠ์€ ๋‚ด์šฉ์€ Figma์˜ Desperately seeking squircles ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

โˆฃxaโˆฃn+โˆฃybโˆฃn=1{\lvert{x \over a}\rvert}^n + {\lvert{y \over b}\rvert}^n = 1

tienphaw/figma-squircle๋ฅผ ์ด์šฉํ•ด SVG ์Šค์ฟผํด์„ ์ƒ์„ฑํ•œ ๋’ค clipPath ํ”„๋กœํผํ‹ฐ๋ฅผ ์ด์šฉํ•ด ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋ฅผ ์ž˜๋ผ๋‚ด๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

iOS16 ์•Œ๋ฆผ์„ผํ„ฐ์—์„œ๋„ ๋น„์Šทํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ดค๋‹ค.

๋‹ค๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ชจ๋“  ํ”„๋ ˆ์ž„์— clipPath๋ฅผ ๊ฑธ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์Šค์ฟผํด์„ ๋ชจ๋“  ํ”„๋ ˆ์ž„๋งˆ๋‹ค ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์†๋„ ์ €ํ•˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๊ฐ€ ํฌ๊ธฐ๋ฅผ ๋ฐ”๊พธ๋Š” ๋™์•ˆ์€ borderRadius๋ฅผ ์ด์šฉํ•ด ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‹ค๋“ฌ๊ณ , ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚˜๋Š” ์ฆ‰์‹œ ์žฌ๋น ๋ฅด๊ฒŒ clipPath๋ฅผ ์ ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”ํ–ˆ๋‹ค.

์•„์ฃผ ์ž์„ธํžˆ ๋ณด์ง€ ์•Š์œผ๋ฉด ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ ์–ด๋ ค์›Œ ์„ฑ๋Šฅ๊ณผ ๋””ํ…Œ์ผ์˜ ๊ดœ์ฐฎ์€ ํƒ€ํ˜‘์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ 2022๋…„ 11์›” 11์ผ๊นŒ์ง€ ์™„์„ฑํ•œ ๋‚ด์šฉ์ด๋‹ค.

์ž์„ธํžˆ ๋ณด๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข…๋ฃŒ๋˜๋ฉด์„œ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์Šค์ฟผํด๋กœ ๋‹ค๋“ฌ์–ด์ง„๋‹ค.

๐Ÿ’จ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ตœ์ ํ™”

CSS์—๋Š” will-change๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋‹ค. ํ™”๋ฉด์— ๋ฌด์Šจ ์š”์†Œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™”ํ•  ๊ฒƒ์ธ์ง€ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ์–ด ์†๋„๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฏธ๋ฆฌ ์ž‘์—…ํ•˜๋ผ๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” will-change๊ฐ€ ์—†๋Š” ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ "๋ Œ๋”๋ง"(rasterize)ํ•˜๋Š”๋ฐ, will-change๊ฐ€ ์žˆ์œผ๋ฉด ๋ฏธ๋ฆฌ ๊ณ„์‚ฐ๋œ ์ •ํ•ด์ง„ ์ด๋ฏธ์ง€๋กœ ์ผ๋‹จ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง„ํ–‰ํ•œ ๋’ค ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ์ง„ํ–‰ํ•œ๋‹ค. ๋•Œ๋ฌธ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ๋ ค๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, transform, scale, rotate ๋“ฑ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๋ถ€๋“œ๋Ÿฌ์›€์„ ์ค€๋‹ค.

๋‹ค์ด๋‚˜๋ฏน ์•„์ผ๋žœ๋“œ๋Š” ํฌ๊ธฐ์™€ ํˆฌ๋ช…๋„ ๋“ฑ์„ ์ฃผ๋กœ ์กฐ์ ˆํ•˜๊ธฐ์— will-change๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ ํ•ฉํ–ˆ๋‹ค. Framer Motion์—์„œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.



// ...

const willChange = useWillChange()

// ...

<motion.div style={{ willChange }}/>

๐Ÿ”— ์—ฐ๋™

๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฐ๋™์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋“ค์„ ๋งŒ๋“ค์—ˆ๋‹ค (/embed-player, /embed-phone-call). ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ๋“ค์— Tailwind, Framer Motion ๋“ฑ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜๊ธฐ์— iframe์„ ์ด์šฉํ•ด์„œ ์—ฐ๋™ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค. davidjbradshaw/iframe-resizer๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐ˜์‘ํ˜• iframe์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. Position Sticky๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ํŽ˜์ด์ง€ ํ™”๋ฉด ์ƒ๋‹จ์— ๋ถ™์–ด์žˆ์„ ์ˆ˜๋„ ์žˆ๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ํŽ˜์ด์ง€ ์ƒ๋‹จ์—๋„ ๋ถ™์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค!

๐Ÿ’ญ ํšŒ๊ณ 

์ด๋กœ์จ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋‘ ์™„์„ฑํ–ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํŠน๋ณ„ํžˆ ๋А๋‚€ ์ ์ด ์žˆ๋‹ค.

์šฐ์„  ์ฒซ๋ฒˆ์งธ๋กœ ์ค‘์žฅ๊ธฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ˆ๊ธฐ ์žˆ๊ฒŒ ์ž˜ ์ง„ํ–‰ํ–ˆ๋‹ค. ์›๋ž˜๋„ ๊ทœ์น™์ ์œผ๋กœ ๊พธ์ค€ํžˆ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋ถ„๋“ค์„ ์กด๊ฒฝํ•ด์™”๋Š”๋ฐ, ์•ฝ ํ•œ ๋‹ฌ ๋ฐ˜์— ๊ฑธ์ณ ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋šซ์–ด๋‚ด๋Š”๋ฐ ์„ฑ๊ณตํ•ด์„œ ๋ณด๋žŒ์ด ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ๋Œ€ํ•™๊ต ์ˆ˜์—…, ๊ตฌ์ง ํ™œ๋™, ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋“ฑ์„ ์ž˜ ์ €๊ธ€๋ง ๐Ÿคน ํ•ด์„œ ๋ฟŒ๋“ฏํ–ˆ๋‹ค. (์•„์ง ๋‹ค ๋๋‚˜์ง„ ์•Š์•˜์ง€๋งŒ)

๋‘ ๋ฒˆ์งธ ๋А๋‚€ ์ ์œผ๋กœ, cometkim๋‹˜๊ป˜ ํŠน๋ณ„ํžˆ ๊ฐ์‚ฌ ์ธ์‚ฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค. ๋‹น๊ทผ์—์„œ ์ธํ„ด์„ ํ•  ๋‹น์‹œ ํŠน๋ณ„ํ•œ ์ผํ™”๊ฐ€ ํ•˜๋‚˜ ๊ธฐ์–ต์— ๋‚จ๋Š”๋ฐ, ๋ฐ”๋กœ webpack์œผ๋กœ ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ ์ฝ”๋“œ ๊ทธ ์ž์ฒด๋ฅผ ๋œฏ์–ด๊ฐ€๋ฉฐ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค(โ€ผ๏ธ)๋Š” ๊ฒƒ์„ ์ง์ ‘ ๋ณด์—ฌ์ฃผ์‹  ๊ฒƒ์ด๋‹ค. ์ธํ„ด์‹ญ ๊ธฐ๊ฐ„๋™์•ˆ ์ •๋ง ๋งค์ฝคํ•˜๊ฒŒ ๐ŸŒถ ๋งŽ์ด ๋ฐฐ์› ๋‹ค. (๋งค์ฝค๋งˆ์ผ“ ๋‹น๊ทผ๋ฏธ๋‹ˆ ํŒ€ โค๏ธ) ์—ฌํ•˜ํŠผ ๊ทธ ๋•๋ถ„์— Apple Music API์—์„œ ๋ง‰ํ˜”์„ ๋•Œ ๊ทธ๋ƒฅ ๋ฆฌ๋ฒ„์Šค ์—”์ง€๋‹ˆ์–ด๋งํ•ด์„œ ๋šซ์–ด๋‚ด์•ผ์ง€๋ผ๋Š” ์ž์‹ ๊ฐ์ด ์ƒ๊ฒผ๋‹ค. ํŒ€, ๊ฐ์‚ฌ์˜ ์˜๋ฏธ๋กœ ํ—ค์ด์บ๋Ÿฟ ๋‹น๊ทผ์„ ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿฅ•

๋…ธํŠธํ…Œ์ดํ‚น๊ณผ ๋ฉ”๋ชจ์˜ ์Šต๊ด€๋„ ์ ์  ์ƒ๊ธฐ๊ณ  ์žˆ๋‹ค. ์‚ฌ๋žŒ์€ ์ƒ๊ฐ๋ณด๋‹ค ์˜์ง€๋ ฅ์ด ์•ฝํ•˜๋‹ˆ๊นŒ ํ™˜๊ฒฝ์„ ๋ฐ”๊พธ๋ผ๋Š” ๋ง์ด ์žˆ๋‹ค. cho.sh๋ฅผ ๋…ธํŠธํ…Œ์ดํ‚น์— ์ตœ์ ํ™”๋˜์–ด์žˆ๋„๋ก ๋””์ง€ํ„ธ ์ •์›(๋˜๋Š” Extracranial Memex)์„ ์ž˜ ๊ฐ€๊พผ ๊ฒƒ ๊ฐ™๋‹ค. ๋ช‡ ๋‹ฌ ๊ฐ„ cho.sh์— ์—ฐ๊ตฌ ๋…ธํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์–ด๋А ์ •๋„ ์ •ํ˜•ํ™”๋˜๊ณ  ์žˆ๋‹ค. ๊ณ„์† ๋…ธํŠธ๋ฅผ ๊พธ์ค€ํžˆ ์ž‘์„ฑํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ๋“ค์„ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค. ์ด ๋˜ํ•œ ํŒ€(cometkim)์˜ Roam Research ๋…ธํŠธํ…Œ์ดํ‚น ์Šต๊ด€์„ ๋ณด๋ฉฐ ๋งŽ์ด ๋ฐฐ์› ๋‹ค. ํŒ€, ๊ฐ์‚ฌ์˜ ์˜๋ฏธ๋กœ ํ—ค์ด์บ๋Ÿฟ ๋‹น๊ทผ์„ ํ•˜๋‚˜ ๋” ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿฅ•

์–ด์จŒ๋“  ์ด๋ ‡๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ธ๋‹ค. ๋ชจ๋‘ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!