๐ ์น์ผ๋ก ๋น์ ๋ค์ด๋๋ฏน ์์ผ๋๋
๊ทธ๋ผ์. ์๋ ๊ฒ์ ์ ํ์์ ํด๋ฆญํด๋ณด์ธ์. ์ ๊ฐ ํ์ฌ ๋ฃ๊ณ ์๊ฑฐ๋ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ 30๊ฐ์ ์์ ์ค ํ๋๊ฐ ๋ฌด์์๋ก ๋ํ๋ ๊ฑฐ์์.
๋ฆฌ๋ฒ์ค์์ง๋์ด๋งํ Apple Music API๊ฐ ๋ณ๊ฒฝ๋์๊ณ , ๋๋ฌธ์ API๋ฅผ ๋์ด์ ์ ๋ฐ์ดํธํ์ง ์์ ์์ ์ ๋๋ค.
์ ๋ฅํ ์์ ๊ฐ๋ ๋ชจ๋ฐฉํ๊ณ ์๋ํ ์์ ๊ฐ๋ ํ์น๋ค โ ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ Vercel์ ๊ฐ๋ฐ์ ๊ฒฝํ ๋ด๋น VP Lee Robinson์ ์์ด๋์ด ํ๋๋ฅผ ๋ฒ ๊ปด๋ณด๋ ค ํ๋ค. Next.js์ ๊ฐ์ข ์ ๊ธฐ์ ์ ํ์ฉํ๋ ์คํ์ ์ด์ง๋ง ๊ฐ๊ฒฐํ๊ณ ์๋ฆ๋ค์ด ํฌํธํด๋ฆฌ์ค๋ก ์ ๋ช ํ leerob.io์๋ ํ ๊ฐ์ง ์ฌ๋ฏธ์๋ ๊ธฐ๋ฅ์ด ์๋ค. ์์ ์ด ํ์ฌ ๋ฃ๊ณ ์๋ ์์ ์ด ์น์ ๊ฐ์ด ๋ํ๋๋ ๊ธฐ๋ฅ์ด๋ค.

Now Playing โ Spotify @ leerob.io
๋๊ตฌ๋ณด๋ค ์์ ์ ์ทจํฅ์ด ๋๋ ทํ ๋์๊ธฐ์ ์ธ์ ๊ฐ๋ ์ด๋ฅผ ๊ผญ ๋ด ์น์ฌ์ดํธ์ ๊ตฌํํ๊ณ ์ถ์๋ค. ๋ค๋ง ๋จ์ํ๊ฒ ์ฌํํ๋ ์์ค์ด ์๋๋ผ ๋ฌด์ธ๊ฐ ๊ธฐ์ ์ ์ธ ๋์ ์ ํด๋ณด๊ณ ์ถ์๋ค. ๋น์ ์ฌ๋ฌ ์์ ์๋น์ค๋ฅผ ๋์๊ฐ๋ฉฐ ์ฌ์ฉํด๋ณด๊ณ ์์๊ธฐ์ ๊ตณ์ด ๊ฐ๋ฐ์ ์๋๋ฅด์ง ์์ ์ด์ ๋ ์์๋ค. ๊ทธ๋ฐ ์ด์ ๋ก ๊ฐ๋ฐ์ ์ด๋ฆฌ์ ๋ฆฌ ๋ฏธ๋ฃจ๋ค 2022๋ ์ ์ด๋ฅด๋ ๋ค. ๊ทธ๋ฌ๋ ์ค Apple์ด ์ต๊ทผ ์ ๋ฐํ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฐํํ๋ค. ๋ฐ๋ก ๋ค์ด๋๋ฏน ์์ผ๋๋(Dynamic Island)๋ผ๋ ๊ธฐ๋ฅ์ด๋ค.

ํ๋ฉด ์๋จ ํ์นํ์ด ์์ ์์ฌ๋ก ํฌ๊ธฐ๋ฅผ ๋ฐ๊พธ๋ฉฐ ๋ค์ํ ๋ถ๊ฐ ์ ๋ณด๋ฅผ ํ์ํ๋ค.
๋ด๊ฐ ๋ฐ๋ผ๊ณ ์๋ ๊ธฐ์ ์ ์ธ ๋์ ์ด์๋ค! ์ด๋ฅผ ์น์์ ์ ํํ๊ฒ ๋๊ฐ์ด ๊ตฌํํด๋ณด๊ณ ์ถ๋ค๋ ๊ฒฐ๋ก ์ ์ด๋ฅด๋ ๋ค. ๋ช ๊ฐ์ง ์๋๋ก์ด๋ ์ ์ฉ ๋ณต์ ํ์ ์ธํฐ๋ท์์ ํ์ธํ๊ธฐ๋ ํ๋๋ฐ, ์ ๋ถ ์ ๋๋ฉ์ด์ ๊ณก์ ์ด ๋ถ์์ฐ์ค๋ฌ์ ์ด๋ฐ ๋ํ ์ผ์ ๊ณต๋ถํด๋ณด๊ณ ์ถ์๋ค.
์น ์์์ ๋ด๊ฐ ํ์ฌ ๋ฃ๊ณ ์๋ ์์ ์ ๋ณด์ฌ์ฃผ๋ ๋ค์ด๋๋ฏน ์์ผ๋๋ ๐ ๋ฅผ ๊ตฌํํด๋ณด์.
์ด ํ๋ก์ ํธ์ ์ฐ๊ตฌ ๊ธฐ๋ก๋ ๊ณต๊ฐ๋์ด ์๋ค.
๐ ๊ธฐ์ ์ ํ๊ธฐ
์ฐ์ ํ๋ ์์ํฌ๋ก๋ ๊ฐ์ฅ ์ต์ํ Next.js์ Tailwind๋ฅผ ๊ณจ๋๋ค. ๋ฌธ์ ๋ ์ ๋๋ฉ์ด์ ์ด์๋ค. ๊ฐ๋จํ CSS ์ ๋๋ฉ์ด์ ์ ๋ค๋ฃจ์ด ๋ณด์์ง๋ง ease-in-ease-out ์ด์์ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ ๋ค๋ค๋ณด์ง ๋ชปํ๋ค. 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 })
๐ฅ ๋ค์ด๋๋ฏน ์์ผ๋๋๋ฅผ ํฅํด

์ฐ์ Apple์ ๋ฌธ์๋ฅผ ๊น์ด ์ฝ์ด๋ณด๋ฉฐ ์ด๋ฐ ์ ๋ฐ ํน์ง๋ค์ ๊ณต๋ถํ๋ค. ๋ค์ด๋๋ฏน ์์ผ๋๋๋ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค์์ ํํ๋ฅผ ์ง๋๋ค.

๋๋ถ์ด์ ์ธํฐ๋ท ์ด๋๊ฐ์์ ๋ค์ ์ฌ์ง๋ ํ์ธํ ์ ์์๋ค. 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}
>

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๊ฐ ๊ณต๊ฐ๋์๋ค.

์ฐธ๊ณ ๋ก 2๋ ์ ๋ง ํด๋ API๊ฐ ์กด์ฌํ์ง ์์๋ค.
์ด์ ํ์ํ ๊ฒ์ OAuth 2.0์ ํ์ํ ๊ฐ์ข ํ ํฐ๋ค์ ๋ฐ๊ธ ๋ฐ ์ ์ฅํ๋ ์ผ์ด๋ค. Spotify์ ๊ฒฝ์ฐ OAuth 2.0 ํ์ค์ ๊ฑฐ์ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ๋ค์ํผ ํ๋๋ฐ Apple์ ๋ช ๊ฐ์ง ์ ๋ณด๊ฐ ๋ ํ์ํ๋ค. ํนํ ์ด Now Playing ๊ฐ์ ๊ฒฝ์ฐ๋ ๋จ์ํ๊ฒ Apple๊ณผ์ ์ธ์ฆ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์์ ์ ๋ณด์ ์ ๊ทผํ๋ ๊ฒ์ด๋ค ๋ณด๋ ์ฌ์ฉ์์ ๋์ ์ฌ๋ถ์ ๋ฐ๋ฅธ ๊ถํ ์ฒ๋ฆฌ๋ ๋ณ๋๋ก ์งํ๋์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๊ฒ์ด ๋ฌธ์ํ๊ฐ ์ ๋๋ก ๋์ด์์ง ์์ ๊ฝค ๊ณจ์น ์ํ ๋ค. ์ฐ์ ํ์ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
| ๋นํ๊ธฐ | Apple์์์ ๋์ผํ ๊ฐ๋ | ์ค๋ช |
|---|---|---|
| ํญ๊ณต๊ธฐ ์ฌ์ ์ ์ํ ๋น์ฉ ์ฒ๋ฆฌ | Apple Developer ์ ๋ฃ ๊ณ์ | $99 |
| ์กฐ์ข ์ฌ ์๊ฒฉ์ฆ | Apple Developer์์ ๋ฐ๊ธ ๋ฐ๋ Apple Music Key | Apple Music ๊ด๋ จ ์๋น์ค์ ๋ด๊ฐ ์์ฒญ์ ๋ ๋ฆด ๋ฒ์ ๊ถํ์ด ์์์ ํ์ธํ๋ค. |
| ํญ๊ณต๊ธฐ ์ดํญ์น์ธ ์ ์ฒญ์ | Apple ์๋ฒ์ ์์ฒญํด์ ๋ฐ๊ธ ๋ฐ๋ Apple Music Main Token | Apple 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๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ๋ฉ๋๋ค๋ผ๊ณ ๋ง ๋์์๊ณ ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ๊ตฌํ๋์ง ์ ํ ์ธ๊ธ์ด ์๋ค.
๊ทธ๋ผ ์ด๋กํ๊ฒ ๋. ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง ํด๋ด์ผ์ง. ๋๋จธ์ง ๋จ๊ณ๋ค์ ๋น๊ต์ ์ง๊ด์ ์ธ ๋จ๊ณ๋ค๋ก ์งํ๋์๋ค. ์ฐ๊ตฌ ๊ธฐ๋ก ์ฐธ๊ณ .


MusicKit on the Web. ์ ํ ์ฑ๊ฒฉ์ Storybook ๋ฌธ์๋ก ๋ ๊ฒ์ ๋ณด๋ฉด ์์ง ์์ ์ด๊ธฐ ๋ฒ ํ์ธ๊ฐ ๋ณด๋ค.
๐ฆพ MusicKit ๋ฆฌ๋ฒ์ค ์์ง๋์ด๋ง
์ฐ์ MusicKit on the Web์ ๊ธฐ๋ณธ์ ์ธ ์คํ์ ๋ชจ๋ฐฉํ๋ฉฐ ๊ธฐ์ด์ ์ธ ์น์ ๋ง๋ค์๋ค.


๊ทธ๋ฐ ๋ค์๋ถํฐ ์นํ์ด์ง์ ์์ฒญ ํค๋๋ฅผ ๊น๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด 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์ ๋์๋๋๋ก ๋ง๋ค์๋ค.
- anaclumos/now-playing: What is Sunghyun listening to right now? (Apple Music)
- raw.githubusercontent.com/anaclumos/now-playing/main/now-playing.json

๐ผ ์ดํ๋ผ์ด์
์์ ์ ํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ์์ ํ๋ ์ด์ด ์ปดํฌ๋ํธ๋ ์์ฑํ๋ค.

๋ฐ๋ก ์ดํ๋ผ์ด์ ๊ฐ ์๋ ๊ฒ์ด๋ค. React์ ๊ด์ฐฎ์ ์ดํ๋ผ์ด์ ๊ฐ ์๋์ง ์์๋ณด๋ค๊ฐ ๊ทธ๋ฅ Framer Motion์ผ๋ก ์ด๋ง์ ๋ ๋ง๋ค๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ๋ช๊ฐ์ง ๋ฐ๋ณต์ ๊ฐ๋ฐ(iteration)์ ๊ณผ์ ์คํฌ๋ฆฐ์ท์ ์ฒจ๋ถํ๋ค.


์ดํ๋ผ์ด์ ์ ๊ฐ ๋ด์ ๋ฌด์์๋ก ๊ธธ์ด๊ฐ ๊ฒฐ์ ๋๋ค.
๊ทผ๋ฐ ๋ง์ง๋ง Hype Boy ์์์์๋ ๋ณผ ์ ์๋ฏ์ด, ๋ญ๊ฐ ์ด์ํ ๊ฒ์ด ๋๊ปด์ก๋ค.
์ผ๋ฐ์ ์ผ๋ก ์์
์ ์ ์์ญ๋์ ๊ณ ์์ญ๋๋ ์งํญ์ด ์์๋ฐ ๋ฐํด,
์์ ํ๊ฒ ๋ฌด์์๋ก ๊ฐ์ ๊ณ์ฐํด์ ์ ์์ญ๋์ ๊ณ ์์ญ๋์๋ ๋น์ทํ ์งํญ์ ๋ด์ด ๋ํ๋์ ๊ทธ๋ฐ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋์ ๊ฐ ๋ด๋ง๋ค ๊ธฐ์ค์น (baseLength) ๋ฅผ ์ ํด์ฃผ๊ณ ๊ทธ ๊ฐ์์ ยฑ(๋ฌด์์ ๊ฐ)์ ํ๋๋ก ๋ณ๊ฒฝํ๋ค.
๋ง์ง๋ง์ผ๋ก ์ดํ๋ผ์ด์ ์ ์๊น์ ์จ๋ฒ์ํธ์ ํค ์ปฌ๋ฌ(Key Color)์ ๋์ผํ๊ฒ ๋ณ๊ฒฝํ๋ค.
๋ณ๋์ ์์
์ด ํ์ํ์ง ์์๊ณ Apple Music API์ ๊ทธ ๊ฐ์ด ๊ฐ์ด ํฌํจ๋์ด ์๋ค.

๐ ์ค์ฟผํด์ ๋ฌผ๋ฆฌ
์์ง ๋๋ฌ๋ค๊ณ ์๊ฐํ๋ฉด ์ค์ฐ์ด๋ค! ์ด๋ ๊ฒ ์์ฑ๋ ๋ค์ด๋๋ฏน ์์ผ๋๋๋ ์์ง ๋ฌด์ธ๊ฐ ์ด์ํ๋ค. ๊ณก์ ์ด ๋ ์นด๋ก์ด ๋๋์ด ๋ค์๋ค. ๋ฐ๋ก ์ค์ฟผํด์ ๋ฏธ์ ์ฉ ๋๋ฌธ์ด๋ค.

์ถ์ฒ: Apple's Icons Have That Shape for a Very Good Reason @ HackerNoon
์ผ๋ฐ์ ์ผ๋ก borderRadius๋ฅผ ํตํด์ ์ค์ ํ๋ ํ
๋๋ฆฌ๋ ๊ณก๋ฅ ์ด ์ผ์ ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๊ณก๋ฅ ์ด ์์๋๋ ์ง์ ์์ ๊ธ๊ฒฉํ ๊ณก๋ฅ ์ ๋ณํ๋ก ์ธํด ๊ทธ ๋ถ๋ถ์ด ๋ ์นด๋กญ๊ฒ ๋๊ปด์ง๋ค.
์ด์ ๋ฐํด์ ๊ณก๋ฅ ์ ์์ํ ๋์๋ค๊ฐ ๋ฎ์ถ๋ฉด ํจ์ฌ ๋ถ๋๋ฌ์ด ๊ณก์ ์ด ํ์ํ๋ค.
๋ฌผํฌ ํ์๋ค์ ์ํ ์ค๋ช : ๋ฑ๊ฐ์๋ ์ด๋์ด ์๋๋ผ ๋ฑ๊ฐ๊ฐ์๋ ์ด๋์ ํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค (์๋๋ฅผ ์ผ์ ํ๊ฒ ๋ฐ๊พธ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ์๋๋ฅผ ์ผ์ ํ๊ฒ ๋ฐ๊พธ๋ ๊ฒ).
๊ธฐ๋ฒก ํ์๋ค์ ์ํ ์ค๋ช : ์ค์ฟผํด์ ์ดํ์ (Superellipse)์ด๋ค. ๋ค์ ๊ณต์์ ๋ง์กฑํ๋ ํํ๋ค์ด๋ค. ์ฌ๊ธฐ์์ ์ ๊ณก๋ฅ , ๋ ์ถ ๊ธธ์ด, ๋ ์ถ์ ๊ธธ์ด์ด๋ค. ์ํ์ ์ผ๋ก ๋ ๊น์ ๋ด์ฉ์ Figma์ Desperately seeking squircles ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
tienphaw/figma-squircle๋ฅผ ์ด์ฉํด SVG ์ค์ฟผํด์ ์์ฑํ ๋ค
clipPath ํ๋กํผํฐ๋ฅผ ์ด์ฉํด ๋ค์ด๋๋ฏน ์์ผ๋๋๋ฅผ ์๋ผ๋ด๋๋ก ๋ง๋ค์๋ค.

๋ค๋ง ์ ๋๋ฉ์ด์
์ ๋ชจ๋ ํ๋ ์์ 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 ๋
ธํธํ
์ดํน ์ต๊ด์ ๋ณด๋ฉฐ ๋ง์ด ๋ฐฐ์ ๋ค.
ํ, ๊ฐ์ฌ์ ์๋ฏธ๋ก ํค์ด์บ๋ฟ ๋น๊ทผ์ ํ๋ ๋ ๋๋ฆฝ๋๋ค ๐ฅ
์ด์จ๋ ์ด๋ ๊ฒ ํ๋ก์ ํธ๋ฅผ ๋๋ธ๋ค. ๋ชจ๋ ์ ๋ง ๊ฐ์ฌํฉ๋๋ค!

