Deno๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์ฐจ์ธ๋ ์น ํ๋ ์์ํฌ์ธ Fresh๋ฅผ ์ดํด๋ณด์ธ์. ์๋ฒ ์ธก ๋ ๋๋ง, ์์ผ๋๋ ์ํคํ ์ฒ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ก ๋ฐํ์ JS๋ฅผ ์ ๊ณตํ์ฌ ๋งค์ฐ ๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ํฅ์๋ SEO๋ฅผ ์ ๊ณตํฉ๋๋ค.
Fresh: Deno ์น ํ๋ ์์ํฌ์ ์๋ฒ ์ธก ๋ ๋๋ง ์ฌ์ธต ๋ถ์
์น ๊ฐ๋ฐ์ ๋์์์ด ์งํํ๋ ํ๊ฒฝ์์ ์๋ก์ด ํ๋ ์์ํฌ์ ๋๊ตฌ๊ฐ ๋์์์ด ๋ฑ์ฅํ๋ฉฐ ๊ฐ๊ฐ ํน์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ ๊ฒ์ ์ฝ์ํฉ๋๋ค. ์ด๋ฌํ ํ๋ ์์ํฌ ์ค ์๋นํ ์ฃผ๋ชฉ์ ๋ฐ์ ๊ฒ์ Deno๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ ์ฐจ์ธ๋ ์น ํ๋ ์์ํฌ์ธ Fresh์ ๋๋ค. Fresh๋ ์๋ฒ ์ธก ๋ ๋๋ง(SSR), ์์ผ๋๋ ์ํคํ ์ฒ, ํด๋ผ์ด์ธํธ ์ธก JavaScript์ ํ์์ฑ์ ์ต์ํํ์ฌ ํ์ํ ์ฑ๋ฅ๊ณผ ํฅ์๋ SEO๋ฅผ ์ ๊ณตํ๋ ๊ณ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ํตํด ์ฐจ๋ณํ๋ฉ๋๋ค.
Fresh๋ ๋ฌด์์ธ๊ฐ?
Fresh๋ ์ต์ ๋์ ์น์ฌ์ดํธ ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋๋ก ์ค๊ณ๋ ํ ์คํ ์น ํ๋ ์์ํฌ์ ๋๋ค. JavaScript ๋ฐ TypeScript๋ฅผ ์ํ ๋ณด์ ๋ฐํ์์ธ Deno์ ๊ฐ๋ ฅํจ๊ณผ ๋จ์์ฑ์ ํ์ฉํฉ๋๋ค. Fresh์ ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ฒ ์ธก ๋ ๋๋ง(SSR): Fresh๋ ์๋ฒ์์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ์ฌ ์์ ํ ๋ ๋๋ง๋ HTML์ ํด๋ผ์ด์ธํธ์ ๋ณด๋ ๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ๊ณผ SEO๋ฅผ ํฌ๊ฒ ๊ฐ์ ํ๋ฉฐ, ๊ฒ์ ์์ง์ด ์ฝํ ์ธ ๋ฅผ ์ฝ๊ฒ ํฌ๋กค๋งํ๊ณ ์์ธํํ ์ ์๋๋ก ํฉ๋๋ค.
- ์์ผ๋๋ ์ํคํ ์ฒ: Fresh๋ ํ์ด์ง์ ๋ํํ ๊ตฌ์ฑ ์์๋ง ํด๋ผ์ด์ธํธ ์ธก JavaScript๋ก ์ํํ๋ ์์ผ๋๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํ๋ JavaScript์ ์์ด ์ค์ด๋ค์ด ๋ ๋น ๋ฅธ ์ฑ๋ฅ๊ณผ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ป์ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ก ๋ฐํ์ JS: ํด๋ผ์ด์ธํธ์ ์๋นํ ์์ JavaScript๋ฅผ ๋ณด๋ด์ผ ํ๋ ๋ค๋ฅธ ๋ง์ ํ๋ ์์ํฌ์ ๋ฌ๋ฆฌ Fresh๋ ํด๋ผ์ด์ธํธ ์ธก JavaScript๋ฅผ ์ต์ํํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์๋ฒ์์ ์คํ๋๋ฉฐ, ๋ํํ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ํ JavaScript๋ง ํด๋ผ์ด์ธํธ์ ์ ์ก๋ฉ๋๋ค.
- ๋ด์ฅ ๋ผ์ฐํ : Fresh๋ ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ผ์ฐํ ์์คํ ์ ๋ด์ฅํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๊ณ ๋ค์ํ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
- TypeScript ์ง์: Fresh๋ TypeScript๋ก ๊ตฌ์ถ๋์ด ํ์ ์์ ์ฑ์ ์ ๊ณตํ๊ณ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ํฅ์์ํต๋๋ค.
- Deno ํตํฉ: Deno ์ฐ์ ํ๋ ์์ํฌ์ธ Fresh๋ Deno์ ๋ณด์ ๊ธฐ๋ฅ, ์ข ์์ฑ ๊ด๋ฆฌ ๋ฐ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ผ๋ก๋ถํฐ ์ด์ ์ ์ป์ต๋๋ค.
Fresh๋ฅผ ์ ํํด์ผ ํ๋ ์ด์
Fresh๋ ๊ธฐ์กด ์น ํ๋ ์์ํฌ์ ๋นํด ๋ช ๊ฐ์ง ๋งค๋ ฅ์ ์ธ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
1. ์ฑ๋ฅ
์ฑ๋ฅ์ ์ต์ ์น ๊ฐ๋ฐ์์ ์ค์ํ ์์์ ๋๋ค. ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฐ ์น์ฌ์ดํธ๋ ์ฌ์ฉ์์ ์ข์ , ์ดํ๋ฅ ์ฆ๊ฐ, ๊ฒ์ ์์ง ์์ ํ๋ฝ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. Fresh์ SSR ๋ฐ ์์ผ๋๋ ์ํคํ ์ฒ๋ ๋ธ๋ผ์ฐ์ ์์ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํ๋ JavaScript์ ์์ ์ค์ฌ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋จ์ถํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์ฑ ํฅ์์ํต๋๋ค.
์์: ์ ํ ๋ชฉ๋ก์ ํ์ํ๋ ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๊ธฐ์กด ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํ ๋ชฉ๋ก์ ๋ ๋๋งํ๊ธฐ ์ํด ํฐ JavaScript ๋ฒ๋ค์ ๋ค์ด๋ก๋ํ์ฌ ์คํํด์ผ ํฉ๋๋ค. Fresh๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ ์ ํ ๋ชฉ๋ก์ ๋ ๋๋งํ๊ณ HTML์ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ์ฌ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ํจ์ฌ ๋จ์ถํ ์ ์์ต๋๋ค. "์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ" ๋ฒํผ๊ณผ ๊ฐ์ ๋ํํ ์์๋ง ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ํ์ํฉ๋๋ค.
2. SEO ์ต์ ํ
๊ฒ์ ์์ง ์ต์ ํ(SEO)๋ ์น์ฌ์ดํธ๋ก ์ ๊ธฐ์ ์ธ ํธ๋ํฝ์ ์ ๋ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๊ฒ์ ์์ง์ ํฌ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ์์ธํํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง๋ ์น์ฌ์ดํธ๋ ๊ฒ์ ์์ง ํฌ๋กค๋ฌ๊ฐ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด JavaScript๋ฅผ ์คํํด์ผ ํ๋ฏ๋ก ์์ธํํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. Fresh์ SSR์ ๊ฒ์ ์์ง์ด ์ฝํ ์ธ ๋ฅผ ์ฝ๊ฒ ํฌ๋กค๋งํ๊ณ ์์ธํํ ์ ์๋๋ก ๋ณด์ฅํ์ฌ ๊ฒ์ ์์ง ์์๋ฅผ ๊ฐ์ ํฉ๋๋ค.
์์: Fresh๋ก ๊ตฌ์ถ๋ ๋ด์ค ์น์ฌ์ดํธ๋ ์๋ฒ์์ ๊ธฐ์ฌ๋ฅผ ๋ ๋๋งํ์ฌ ๊ฒ์ ์์ง ํฌ๋กค๋ฌ๊ฐ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์น์ฌ์ดํธ๋ ๊ด๋ จ ํค์๋์ ๋ํ ๊ฒ์ ๊ฒฐ๊ณผ์์ ๋ ๋์ ์์๋ฅผ ์ฐจ์งํ์ฌ ์ฌ์ดํธ๋ก ๋ ๋ง์ ์ ๊ธฐ์ ํธ๋ํฝ์ ์ ๋ํ ์ ์์ต๋๋ค.
3. ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ
๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์น์ฌ์ดํธ๋ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. Fresh๋ ์ฑ๋ฅ๊ณผ ์ต์ํ์ JavaScript์ ์ค์ ์ ๋์ด ์ฌ์ฉ์์๊ฒ ๋์ฑ ์ํํ๊ณ ์ฆ๊ฑฐ์ด ๋ธ๋ผ์ฐ์ง ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ฐธ์ฌ ์ฆ๊ฐ, ์ดํ๋ฅ ๊ฐ์, ์ ํ์จ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์์: Fresh๋ก ๊ตฌ์ถ๋ ์จ๋ผ์ธ ํ์ต ํ๋ซํผ์ ํ์๋ค์๊ฒ ์ํํ๊ณ ๋ฐ์์ ์ธ ํ์ต ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ํ์๋ค์ ๋ต๋ตํ ์ง์ฐ์ด๋ ์ฑ๋ฅ ๋ฌธ์ ์์ด ์ฝ์ค ์๋ฃ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ณ , ํ ๋ก ์ ์ฐธ์ฌํ๊ณ , ๊ณผ์ ๋ฅผ ์๋ฃํ ์ ์์ต๋๋ค.
4. ๊ฐ๋ฐ ๊ฐ์ํ
Fresh๋ ์์ง๋ ฅ ์๊ณ ์ง๊ด์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ์ฌ ์น ๊ฐ๋ฐ์ ๊ฐ์ํํฉ๋๋ค. ํ๋ ์์ํฌ์ ๋ด์ฅ ๋ผ์ฐํ ์์คํ , TypeScript ์ง์ ๋ฐ Deno ํตํฉ์ ํตํด ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ๊ตฌ์ถํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์์: Fresh๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋คํธ์ํน ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋ ์ฌ์ฉ์ ํ๋กํ, ํ์๋ผ์ธ ๋ฐ ์ค์ ๊ณผ ๊ฐ์ ๋ค์ํ ํ์ด์ง์ ๋ํ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค. TypeScript์ ํ์ ์์ ์ฑ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Deno์ ๋ณด์ ๊ธฐ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ๊ณ ์ทจ์ฝ์ฑ์ผ๋ก๋ถํฐ ๋ณดํธ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
5. Deno ์ํ๊ณ
Fresh๋ Node.js์ ๋นํด ํฅ์๋ ๋ณด์, ๋ด์ฅ TypeScript ์ง์ ๋ฐ ๋ณด๋ค ํ๋์ ์ธ ์ข ์์ฑ ๊ด๋ฆฌ ์์คํ ์ ํฌํจํ ๋ช ๊ฐ์ง ์ด์ ์ ์ ๊ณตํ๋ Deno๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. Deno์ ๋ถ์ฐ ๋ชจ๋ ์์คํ ์ npm๊ณผ ๊ฐ์ ์ค์ ํจํค์ง ์ ์ฅ์์ ํ์์ฑ์ ์์ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ์ ์ํ์ ์ค์ ๋๋ค.
์์: Deno๋ฅผ ์ฌ์ฉํ๋ฉด Fresh๊ฐ URL์์ ์ง์ ES ๋ชจ๋์ ํ์ฉํ์ฌ ๋ถ๋ณ์ฑ์ ์ด์งํ๊ณ ์ข ์์ฑ ํผ๋ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด๋ npm ํจํค์ง์ ์์กดํ๋ ๊ธฐ์กด Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ๋นํด ๋ณด์์ ๊ฐํํฉ๋๋ค.
Fresh ์๋ ๋ฐฉ์: ์์ผ๋๋ ์ํคํ ์ฒ ์์ธ ์ค๋ช
์์ผ๋๋ ์ํคํ ์ฒ๋ Fresh์ ์ฑ๋ฅ ์ด์ ๋ค์ ์๋ ํต์ฌ ๊ฐ๋ ์ ๋๋ค. ์ ์ฒด ํ์ด์ง๋ฅผ JavaScript๋ก ์ํํ๋ ๋์ "์์ผ๋๋"๋ผ๊ณ ํ๋ ํน์ ๋ํํ ๊ตฌ์ฑ ์์๋ง ์ํ๋ฉ๋๋ค. ๋๋จธ์ง ํ์ด์ง๋ ์ ์ HTML๋ก ์ ์ง๋ฉ๋๋ค. ์ด ์ ํ์ ์ํ๋ ๋ค์ด๋ก๋ํ๊ณ ์คํํด์ผ ํ๋ JavaScript์ ์์ ์ต์ํํ์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋จ์ถํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
์์: ๋๊ธ ์น์ ์ด ์๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์์ํด ๋ณด์ธ์. ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์์ฒด๋ ์ ์ ์ฝํ ์ธ ์ด๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ํ์ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธ ์น์ ์ ๋ํํ์ด๋ฉฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๊ณ , ๋๊ธ์ ํ์ํ๊ณ , ์ ๋๊ธ์ ์ ์ถํ๋ ค๋ฉด JavaScript๊ฐ ํ์ํฉ๋๋ค. Fresh์์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์๋ฒ์์ ๋ ๋๋ง๋์ด ์ ์ HTML๋ก ํด๋ผ์ด์ธํธ์ ์ ์ก๋ฉ๋๋ค. ๋๊ธ ์น์ ๋ง JavaScript๋ก ์ํ๋์ด ํ์ด์ง์์ ๋ํํ ์์ ์ "์์ผ๋๋"๊ฐ ๋ฉ๋๋ค.
ํ๋ก์ธ์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฝํ ์ ์์ต๋๋ค.
- ์๋ฒ ์ธก ๋ ๋๋ง: ์๋ฒ๋ ์ ์ ์ฝํ ์ธ ์ ๋ํํ ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋ ํฌํจํ์ฌ ์ ์ฒด ํ์ด์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค.
- ๋ถ๋ถ ์ํ: Fresh๋ ํ์ด์ง์์ ๋ํํ ๊ตฌ์ฑ ์์(์์ผ๋๋)๋ฅผ ์๋ณํฉ๋๋ค.
- ํด๋ผ์ด์ธํธ ์ธก ์ํ: ๋ธ๋ผ์ฐ์ ๋ ๋ํํ ๊ตฌ์ฑ ์์๋ง ์ํํ๋ ๋ฐ ํ์ํ JavaScript ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์คํํฉ๋๋ค.
- ๋ํํ ๊ฒฝํ: ๋ํํ ๊ตฌ์ฑ ์์๋ ์์ ํ ์๋ํ๊ฒ ๋๋ ๋ฐ๋ฉด ๋๋จธ์ง ํ์ด์ง๋ ์ ์ HTML๋ก ์ ์ง๋ฉ๋๋ค.
Fresh ์์ํ๊ธฐ
Fresh๋ฅผ ์์ํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ์์คํ ์ Deno๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ๊ณต์ Deno ์น์ฌ์ดํธ์ ์ง์นจ์ ๋ฐ๋ผ Deno๋ฅผ ์ค์นํ ์ ์์ต๋๋ค: https://deno.land/
Deno๋ฅผ ์ค์นํ ํ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ Fresh ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
deno run -A npm:create-fresh@latest
์ด ๋ช ๋ น์ ์ Fresh ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์๋ดํฉ๋๋ค. ํ๋ก์ ํธ ์ด๋ฆ์ ์ ํํ๊ณ ํ ํ๋ฆฟ์ ์ ํํ๋ผ๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. Fresh๋ ๊ธฐ๋ณธ ํ ํ๋ฆฟ, ๋ธ๋ก๊ทธ ํ ํ๋ฆฟ ๋ฐ ์ ์ ์๊ฑฐ๋ ํ ํ๋ฆฟ์ ํฌํจํ ์ฌ๋ฌ ํ ํ๋ฆฟ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์์ฑํ ํ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
deno task start
์ด๋ ๊ฒ ํ๋ฉด ํฌํธ 8000์์ ๊ฐ๋ฐ ์๋ฒ๊ฐ ์์๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8000์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
์์: ๊ฐ๋จํ ์นด์ดํฐ ๊ตฌ์ฑ ์์ ๊ตฌ์ถ
Fresh๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด ๊ฐ๋จํ ์นด์ดํฐ ๊ตฌ์ฑ ์์๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ค์ ์ฝ๋๋ก `routes/counter.tsx`๋ผ๋ ์ ํ์ผ์ ๋ง๋ญ๋๋ค.
import { useState } from "preact/hooks";
import { Head } from "$fresh/runtime.ts";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<>
<Head>
<title>Counter</title>
</Head>
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
<>
);
}
์ด ๊ตฌ์ฑ ์์๋ Preact์ `useState` ํ ์ ์ฌ์ฉํ์ฌ ์นด์ดํฐ ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ๊ตฌ์ฑ ์์๋ ํ์ฌ ์นด์ดํธ๋ฅผ ํ์ํ๋ ๋จ๋ฝ๊ณผ ํด๋ฆญ ์ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฒํผ์ ๋ ๋๋งํฉ๋๋ค. `Head` ๊ตฌ์ฑ ์์๋ ํ์ด์ง์ ์ ๋ชฉ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด์ ๋ค์ ์ฝ๋๋ก `routes/index.tsx`๋ผ๋ ์ ํ์ผ์ ๋ง๋ญ๋๋ค.
import Counter from "./counter.tsx";
export default function Home() {
return (
<>
<h1>Welcome to Fresh!</h1>
<Counter />
<>
);
}
์ด ๊ตฌ์ฑ ์์๋ ์ ๋ชฉ๊ณผ `Counter` ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ๋ฉด ์ ๋ชฉ๊ณผ ์นด์ดํฐ ๊ตฌ์ฑ ์์๊ฐ ํ์๋ฉ๋๋ค. ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์นด์ดํธ๊ฐ ์ฆ๊ฐํ์ฌ ๊ตฌ์ฑ ์์์ ๋ํํ ์์ ์ ๋ณด์ฌ์ค๋๋ค.
๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ๊ฐ๋
Fresh๋ ๋ณต์กํ๊ณ ์ ๊ตํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ๊ณผ ๊ฐ๋ ์ ์ ๊ณตํฉ๋๋ค.
1. ๋ฏธ๋ค์จ์ด
๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ ๋ฐ ์๋ต์ ๊ฐ๋ก์ฑ๊ณ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ธ์ฆ, ๊ถํ ๋ถ์ฌ, ๋ก๊น ๋ฐ ์์ฒญ ์์ ๊ณผ ๊ฐ์ ์์ ์ ์ ์ฉํ ์ ์์ต๋๋ค. Fresh๋ ๋ผ์ฐํธ ํธ๋ค๋ฌ ์ ํ์ ์คํ๋๋ ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ์ ์ํ ์ ์๋ ๊ฐ๋จํ๊ณ ์ ์ฐํ ๋ฏธ๋ค์จ์ด ์์คํ ์ ์ ๊ณตํฉ๋๋ค.
2. ํ๋ฌ๊ทธ์ธ
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด ์๋ก์ด ๊ธฐ๋ฅ, ํตํฉ ๋ฐ ์ฌ์ฉ์ ์ง์ ์ ์ถ๊ฐํ์ฌ Fresh์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค. Fresh๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฅ์์ํค๊ธฐ ์ํด ํ๋ฌ๊ทธ์ธ์ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์๋ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์ ๊ณตํฉ๋๋ค.
3. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
Fresh๋ API, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํฌํจํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ฌ๋ฌ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. `fetch` API ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๊ตฌ์ฑ ์์์์ ๋ ๋๋งํ ์ ์์ต๋๋ค.
4. ์ํ ๊ด๋ฆฌ
๋ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ณด๋ค ์ ๊ตํ ์ํ ๊ด๋ฆฌ ์๋ฃจ์ ์ด ํ์ํ ์ ์์ต๋๋ค. Fresh๋ Redux ๋ฐ Zustand์ ๊ฐ์ ์ธ๊ธฐ ์๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํตํฉ๋ฉ๋๋ค.
Fresh vs. ๊ธฐํ ํ๋ ์์ํฌ
Fresh๋ ์๋ฒ ์ธก ๋ ๋๋ง๊ณผ ์์ผ๋๋ ์ํคํ ์ฒ๋ฅผ ์ ๊ณตํ๋ ์ ์ผํ ์น ํ๋ ์์ํฌ๊ฐ ์๋๋๋ค. Next.js ๋ฐ Remix์ ๊ฐ์ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ Fresh๋ ํด๋ผ์ด์ธํธ ์ธก JavaScript๋ฅผ ์ต์ํํ๊ณ Deno์ ํตํฉํ๋ ๋ฐ ์ค์ ์ ๋์ด ์ฐจ๋ณํ๋ฉ๋๋ค.
Next.js: ์๋ฒ ์ธก ๋ ๋๋ง, ์ ์ ์ฌ์ดํธ ์์ฑ ๋ฐ ํ๋ถํ ํ๋ฌ๊ทธ์ธ ๋ฐ ๋๊ตฌ ์ํ๊ณ๋ฅผ ์ ๊ณตํ๋ ์ธ๊ธฐ ์๋ React ๊ธฐ๋ฐ ํ๋ ์์ํฌ์ ๋๋ค. Next.js๋ ๋์ ์์ค์ ์ฌ์ฉ์ ์ง์ ์ด ํ์ํ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
Remix: ์น ํ์ค์ ์ค์ ์ ๋๊ณ ์ํํ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ ํ ์คํ ์น ํ๋ ์์ํฌ์ ๋๋ค. Remix๋ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ฐ์ ์ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
Astro: ์์ผ๋๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ์ ์ ์ฌ์ดํธ ์์ฑ๊ธฐ์ ๋๋ค. Astro๋ ๋ธ๋ก๊ทธ ๋๋ ๋ฌธ์ ์ฌ์ดํธ์ ๊ฐ์ด ์ฝํ ์ธ ๊ฐ ๋ง์ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํฉ๋๋ค.
ํ๋ ์์ํฌ ์ ํ์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ฑ๋ฅ, ์ต์ํ์ JavaScript ๋ฐ Deno ๊ธฐ๋ฐ ํ๊ฒฝ์ ์ฐ์ ์ํ๋ ๊ฒฝ์ฐ Fresh๊ฐ ํ์ํ ์ ํ์ ๋๋ค. ๋ณด๋ค ์ฑ์ํ ์ํ๊ณ๊ฐ ํ์ํ๊ฑฐ๋ React๋ฅผ ์ ํธํ๋ ๊ฒฝ์ฐ Next.js๊ฐ ๋ ๋์ ์ต์ ์ผ ์ ์์ต๋๋ค. Remix๋ ๋ฐ์ด๋ ์ฑ๋ฅ๊ณผ ์น ํ์ค์ ์ค์ ์ ๋ก๋๋ค.
Fresh์ ์ฌ์ฉ ์ฌ๋ก
Fresh๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํฉ๋๋ค.
- ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ: Fresh์ ์ฑ๋ฅ ๋ฐ SEO ์ด์ ์ ๋น ๋ฅด๊ฒ ๋ก๋๋๊ณ ๊ฒ์ ๊ฒฐ๊ณผ์์ ๋์ ์์๋ฅผ ์ฐจ์งํด์ผ ํ๋ ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ด์์ ์ธ ์ ํ์ ๋๋ค.
- ๋ธ๋ก๊ทธ ๋ฐ ์ฝํ ์ธ ์น์ฌ์ดํธ: Fresh์ ์๋ฒ ์ธก ๋ ๋๋ง ๋ฐ ์์ผ๋๋ ์ํคํ ์ฒ๋ ๋น ๋ฅด๊ณ SEO ์นํ์ ์ธ ๋ธ๋ก๊ทธ ๋ฐ ์ฝํ ์ธ ์น์ฌ์ดํธ๋ฅผ ์ฝ๊ฒ ๊ตฌ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
- ์น ์ ํ๋ฆฌ์ผ์ด์ : Fresh์ TypeScript ์ง์, ๋ด์ฅ ๋ผ์ฐํ ์์คํ ๋ฐ Deno ํตํฉ์ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
- ๋๋ฉ ํ์ด์ง: Fresh๋ ์ ํ์ ์ค์ ์ ๋ ๊ณ ์ฑ๋ฅ ๋๋ฉ ํ์ด์ง๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํฉ๋๋ค.
Fresh์ ๋ฏธ๋
Fresh๋ ๋น๊ต์ ์๋ก์ด ํ๋ ์์ํฌ์ด์ง๋ง ์ด๋ฏธ ์น ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์์ ์๋นํ ๊ด์ฌ์ ์ป๊ณ ์์ต๋๋ค. ์ฑ๋ฅ, SEO ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ค์ ์ ๋ ์ด ํ๋ ์์ํฌ๋ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ ๋งํ ์ต์ ์ ๋๋ค. ํ๋ ์์ํฌ๊ฐ ์ฑ์ํ๊ณ Deno ์ํ๊ณ๊ฐ ๊ณ์ ์ฑ์ฅํจ์ ๋ฐ๋ผ Fresh๋ ์น ๊ฐ๋ฐ์์๊ฒ ๋์ฑ ์ธ๊ธฐ ์๋ ์ ํ์ด ๋ ๊ฒ์ ๋๋ค.
Fresh ํ์ ํ๋ ์์ํฌ๋ฅผ ๊ฐ์ ํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์ ๊ทน์ ์ผ๋ก ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๊ณํ๋ ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ์ ๋ ๋๊ตฌ: Fresh ํ์ ๋๋ฒ๊ฑฐ ๋ฐ ์ฝ๋ ํธ์ง๊ธฐ ํตํฉ๊ณผ ๊ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
- ๋ ๋ง์ ํ๋ฌ๊ทธ์ธ: Fresh ํ์ ํ๋ ์์ํฌ์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ธฐ ์ํด ์ปค๋ฎค๋ํฐ์์ ๋ ๋ง์ ํ๋ฌ๊ทธ์ธ์ ๋ง๋ค๋๋ก ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
- ๊ฐ์ ๋ ๋ฌธ์: Fresh ํ์ ๊ฐ๋ฐ์๊ฐ ํ๋ ์์ํฌ๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ฌธ์๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
๊ฒฐ๋ก
Fresh๋ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ํ ๊ณ ์ ํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ ์ ๋งํ ์น ํ๋ ์์ํฌ์ ๋๋ค. ์๋ฒ ์ธก ๋ ๋๋ง, ์์ผ๋๋ ์ํคํ ์ฒ ๋ฐ ์ต์ํ์ JavaScript์ ์ค์ ์ ๋์ด ํ์ํ ์ฑ๋ฅ, ํฅ์๋ SEO ๋ฐ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์น์ฌ์ดํธ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. Deno ์ํ๊ณ๊ฐ ์ฑ์ฅํจ์ ๋ฐ๋ผ Fresh๋ ์น ๊ฐ๋ฐ์ ์ ๋ ์ฃผ์๊ฐ ๋ ๊ฒ์ ๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ: Fresh ๋ฌธ์๋ฅผ ์ดํด๋ณด๊ณ ์๊ท๋ชจ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ์ฌ ํ๋ ์์ํฌ์ ๊ฐ๋ ๊ณผ ์ด์ ์ ์ง์ ์ดํดํด ๋ณด์ธ์. ์ฑ๋ฅ๊ณผ SEO๊ฐ ์ค์ํ ์๊ตฌ ์ฌํญ์ธ ๊ฒฝ์ฐ ๋ค์ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์ Fresh๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.