VanilLog๋ ๊ฐ์ธ์ ๋ธ๋ก๊ทธ ๊ธ์ ๊ด๋ฆฌํ๊ณ ๊ณต์ ํ ์ ์๋ ํ๋ซํผ์ ๋๋ค. NextJS 13์ ์ต์ ๊ธฐ๋ฅ๊ณผ ํจ๊ป, ์ฌ์ฉ์๋ ์์ ์ ๋ธ๋ก๊ทธ์์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฒ์๊ธ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
๐น VanilLog ์์ฐ ์์
-
๋ฉ์ธํ๋ฉด
-
๋ก๊ทธ์ธํ์ง ์์ ๊ฒฝ์ฐ, ํฌ์คํธ ์กฐํ ๋ฐ ๊ฒ์ ๊ธฐ๋ฅ๋ง ์ด์ฉํ ์ ์์ต๋๋ค.
2023-10-13.10.49.03.mov
-
-
๋ก๊ทธ์ธ
-
์๋จ๋ฐ์ 'Login' ๋ฒํผ์ด๋ ์ฌ์ด๋๋ฐ์ '๋ก๊ทธ์ธ์ ํด์ฃผ์ธ์.' ๋ฒํผ์ ํด๋ฆญํด ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
-
๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ ์๋์ผ๋ก ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ๋ฉ๋๋ค.
-
๊ฐ์ ์ด๊ธฐ์ ์ค์ ๋๋ ๋๋ค์๊ณผ ํ๋กํ ์ด๋ฏธ์ง๋, ์ฐ๊ณ๋ ๊ตฌ๊ธ ๊ณ์ ์์ ๊ฐ์ ธ์จ ๋๋ค์๊ณผ ์ด๋ฏธ์ง์ ๋๋ค.
2023-10-13.10.43.40.mov
-
-
ํฌ์คํธ ์์ฑํ๊ธฐ
-
์ ๋ชฉ์ ์์ฑํฉ๋๋ค.
-
๋ด์ฉ์๋ ํ ์คํธ๋ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํฉ๋๋ค.
-
'์ ์ฅํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ์ฌ ํฌ์คํธ๋ฅผ ๊ฒ์ํฉ๋๋ค.
-
MyLog์์ ์์ฑํ ํฌ์คํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.10.56.15.mov
-
-
ํฌ์คํธ ์์ ํ๊ธฐ
-
ํฌ์คํธ ์์ธ ํ์ด์ง์์ '์์ ํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํด ์์ ํ๋ฉด์ผ๋ก ์ด๋ํฉ๋๋ค.
-
์ ๋ชฉ์ด๋ ๋ด์ฉ์ ๋ณ๊ฒฝํฉ๋๋ค.
-
'์ ์ฅํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ์ฌ ์์ ์ฌํญ์ ์ ์ฅํฉ๋๋ค.
-
MyLog์์ ์์ ๋ ํฌ์คํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.10.58.02.mov
-
-
ํฌ์คํธ ์ญ์ ํ๊ธฐ
-
ํฌ์คํธ ์์ธ ํ์ด์ง์์ '์ญ์ ํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
'ํ์ธ' ๋ฒํผ์ ํด๋ฆญํ์ฌ ํฌ์คํธ๋ฅผ ์ญ์ ํฉ๋๋ค.
-
MyLog์์ ์ญ์ ๋ ํฌ์คํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.10.59.32.mov
-
-
๋๊ธ ์์ฑ
-
ํฌ์คํธ ์์ธ ํ์ด์ง ํ๋จ์ ๋๊ธ์ ์ ๋ ฅํ ํ '๋๊ธ ์์ฑ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
์์ฑํ ๋๊ธ์ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.11.03.08.mov
-
-
๋๊ธ ์์ , ์ญ์
-
์์ ํ๊ณ ์ ํ๋ ๋๊ธ์ '์์ ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
๋๊ธ์ ์์ ํ ํ 'ํ์ธ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
์์ ๋ ๋๊ธ์ ํ์ธํ ์ ์์ต๋๋ค.
-
์ญ์ ํ๊ณ ์ ํ๋ ๋๊ธ์ '์ญ์ ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
์ญ์ ๋ ๋๊ธ์ ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.11.04.05.mov
-
-
ํตํฉ ๊ฒ์
-
๋ฉ์ธํ๋ฉด ๋ด ์ฐ์ธก ์๋จ ๊ฒ์๋์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ํ ์ํฐ๋ฅผ ๋๋ฆ ๋๋ค.
-
๊ฒ์์ด์ ๊ด๋ จ๋ ํฌ์คํธ๋ค์ด ํ์๋ฉ๋๋ค.
2023-10-13.11.10.22.mov
-
-
๋ธ๋ก๊ทธ๋ด ๊ฒ์
-
ํน์ ๋ธ๋ก๊ทธ ๋ด ์ฐ์ธก ์๋จ ๊ฒ์๋์ ๊ฒ์์ด๋ฅผ ์ ๋ ฅํ ํ ์ํฐ๋ฅผ ๋๋ฆ ๋๋ค.
-
ํด๋น ๋ธ๋ก๊ทธ ๋ด์์ ๊ฒ์์ด์ ๊ด๋ จ๋ ํฌ์คํธ๋ค์ด ํ์๋ฉ๋๋ค.
2023-10-13.11.09.11.mov
-
-
ํ๋กํ
-
์ข์ธก ์๋จ์ ํ๋ฒ๊ฑฐ ์์ด์ฝ์ ํด๋ฆญํฉ๋๋ค.
-
์ฌ์ด๋๋ฐ์์ 'ํ๋กํ ์ ๋ณด/์์ ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
2023-10-13.11.11.43.mov
-
-
ํ๋กํ ์ฌ์ง ๋ณ๊ฒฝ
-
'์ฌ์ง ์ ๋ก๋/๋ณ๊ฒฝ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
์ฌ์ง ๋ณ๊ฒฝ๋์์๋ ๋ณ๊ฒฝ๋ ํ๋กํ ์ฌ์ง์ด ๋ฐ๋ก ๋ฐ์๋๊ณ , ์๋จ๋ฐ์ ํ๋กํ ์ฌ์ง์ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.11.12.53.mov
-
-
๋๋ค์ ๋ณ๊ฒฝ
-
๋ด ๋๋ค์์ ์๋ '๋ณ๊ฒฝํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
-
๋๋ค์์ ๋ณ๊ฒฝํ ํ '์ ์ฅ' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. (๋ค๋ฅธ ์ ์ ์ ์ค๋ณต๋๋ ๋๋ค์์ผ๋ก๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.)
-
๋ด ๋๋ค์๋์์๋ ๋ณ๊ฒฝ๋ ๋๋ค์์ด ๋ฐ๋ก ๋ฐ์๋๊ณ , ์๋จ๋ฐ์ ๋๋ค์์ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ํ์ธํ ์ ์์ต๋๋ค.
2023-10-13.11.13.49.mov
-
- ๐ก ํ๋ก์ ํธ ๋๊ธฐ
- ๐ง ๋์ ๋ฐ ๋ฌธ์ ํด๊ฒฐ
- ๐ ์ผ์
- ๐ ๏ธ ๊ธฐ์ ์คํ
- ๐ ์ธํ ๋ฐฉ๋ฒ
- ๐ฅ ํ ๋ฉค๋ฒ
- ๐ Repository ์ฃผ์
- ๐ ๊ธฐํ ์ฌํญ
- JavaScript๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก ํธ์๋ ๋ฐ ๋ฐฑ์๋๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ฉฐ ํ์ต ์ฌํ
- ๊ธฐ์กด์ ํ์ตํ ๊ธฐ์ ์คํ์ ํจ๊ณผ์ ํ์ฉ
- ์ฌ์ฉ์ ์ค์ฌ์ ์น์๋น์ค ๊ฐ๋ฐ
๋ธ๋ก๊ทธ๋ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๋ชจ๋์์ ๋ค์ํ ๊ธฐ๋ฅ๊ณผ ์๊ตฌ์ฌํญ์ ๊ฐ์ง ์๋น์ค ์ค ํ๋์ ๋๋ค. ๊ธฐ์กด์ ๋ฐฐ์ด ๊ธฐ์ ๋ค์ ๋ค์ํ ๋ฐฉ๋ฉด์์ ํ์ฉํ๋ฉด์ ์ค๋ ฅ์ ํฅ์ ์ํฌ ์ ์๋ ์ข์ ์์ด๋์ด๋ผ๊ณ ํ๋จํ์์ต๋๋ค.
ํ์ต ๋ชฉํ์ ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์ฌ์ฉ์๋ค์ด ์์ ์ ์ผ์์ ์์ ๋กญ๊ฒ ๊ณต์ ํ ์ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ธ 'VanilLog'๊ฐ ํ์ํ๊ฒ ๋์์ต๋๋ค.
3์ฃผ ๋์ ๊ฐ๋ฐ์ ์งํํ๋ฉด์ ๊ฒช์๋ ํต์ฌ์ ์ธ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
๋ธ๋ก๊ทธ๋ฅผ ๊ตฌํํ๋๋ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ด ์์์ต๋๋ค.
- ๊ฒ์ ์์ง์์ ์ฌ์ฉ์๊ฐ ํค์๋๋ฅผ ๊ฒ์ํ์์ ๋, ์ด ๋ธ๋ก๊ทธ์ ๊ฒ์๊ธ์ ๋ ๋ง์ ์ฌ์ฉ์์๊ฒ ๋ ๋์ ๋น๋๋ก ๋ ธ์ถ์ํค๊ธฐ ์ํด SEO ์ ์ฉ์ด ํ์
- ๋ฐฑ์๋์์ ํ๋ ์ญํ ์ ์ดํด๋ณด๋ apiํธ์ถ ์ธ์ ๋ณ๋ค๋ฅธ ์์ ์ด ์์
๋ฆฌ์กํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก CSR์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ SEO์ ์ทจ์ฝํ์ต๋๋ค. ๋ฐ๋ผ์ ์์ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด SEO๋ฅผ ์ํ SSR์ ์ ๊ณตํ๊ณ , api๋ฅผ ํด๋ผ์ด์ธํธ์ ํ๋ฒ์ ๊ด๋ฆฌํ๊ธฐ ์ํด 'Next.js'๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
'Next.js'๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ์์ ์ด์์ฌ์ ๊ถ๊ณ ๋ก 'Next.js' 13๋ฒ์ App Router ๋ฐฉ์์ ์ฌ์ฉํ๋๋ฐ ์ด๊ธฐ์๋ ๋ชฐ๋์ง๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. 'Next.js' 13 ๋ฒ์ ์ 2022๋ ์ ์ถ์๋์ด, ๊ด๋ จ ์๋ฃ๊ฐ ์๋์ ์ผ๋ก ๋ถ์กฑํ์ต๋๋ค. ํ์ด์ง ๋ผ์ฐํฐ์์ ์ฐจ์ด๋ฅผ ๋ช ํํ๊ฒ ์ธ์งํ์ง ๋ชปํ์๊ณ , ์ด๋ก ์ธํ ๋ฌ๋ ์ปค๋ธ๊ฐ ์์์ต๋๋ค. ๋ํ ๋น๊ต์ ์๋ก ๋์จ ๋ฐฉ์์ด๋ค ๋ณด๋ ์ ํฌ๊ฐ ์ฐ๋ ค๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์์ App Router๋ฐฉ์์ ์ง์ํ์ง ์์ ๊ฒฝ์ฐ๋ ๋ง์์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ด๋ฏธ ์งํ์ด ๋ ์ํ์์ Pages Router ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ์๋ ์๊ฐ์ด ๋ง์ด ์์๋ ๊ฒ์ผ๋ก ์์๋์์ต๋๋ค. ๊ธฐ๊ฐ์ ๊ณ ๋ คํ์ฌ ๋ณ๊ฒฝํ์ง ์๊ณ App Router ๋ฐฉ์์์ ํด๊ฒฐํ ์ ์๊ฒ ์งํํ์์ต๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ์ฃผ๋ก ์ฐธ๊ณ ํ์ฌ ํ์ตํ์๊ณ , Next.js github issues๋ค์ ์ฐพ์๋ณด๋ฉฐ ํด๊ฒฐ ๋์ง ์์ ๋ฌธ์ ์ ๋ค๋ฅธ ์ ์ ๋ค์ด ํด๊ฒฐํ ๋ฐฉ๋ฒ๋ค์ ์ฐพ์๋ณด๋ฉฐ ์ฌ์ฉ๋ฒ์ ์๋ฌํ์์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ App Router ๋ฐฉ์์ ์ ์งํ๊ณ ์ ๋ธ๋ก๊ทธ ๊ฐ๋ฐ์ ์๋ฃํ ์ ์์์ต๋๋ค.
Firebase์ 'next-firebase-auth': ์ด๊ธฐ ๊ธฐํ ๋จ๊ณ์์, ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ๊ธฐ๋ฅ์ Firebase์ authentication ๊ธฐ๋ฅ๊ณผ โnext-firebase-authโ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๊ธฐ๋ก ๊ธฐํํ์์ต๋๋ค. ํ์ง๋ง ๋ ๋ฐฉ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
-
Firebase: ์ด์ ์ Firebase๋ฅผ ์ด์ฉํ DB ์์ ์ ํด๋ณด์๊ธฐ์ ๋ฌ๋ ์ปค๋ธ๊ฐ ๋ฎ์ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์์ผ๋ฉฐ 'firebase-auth'์ npm install ํ์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ณด๋ค ์๋ฑํ ๋์์ ์ ๋ขฐํ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค. Firebase๋ ์ ํด id ๊ณต๊ธ์ ์ฒด์ ํตํฉํ์ฌ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ฉฐ ์ธ์ฆ SDK๋ ๊ตฌ๊ธ, ์ ํ, ๊นํ๋ธ ๋ฑ์ ์ง์ํ๋ ๊ฒ์ผ๋ก ํ์ธํ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ฌ์ฉํ๋ ค๊ณ ํ์ผ๋, ํด๊ฒฐ๋์ง ์์ ์ด์๋ฅผ ๋ฐ๊ฒฌํ์์ต๋๋ค. ์ด์๋ฅผ ์ฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ์ ํด๋ณธ ๊ฒฐ๊ณผ, ๋ก๊ทธ์ธ ๊ณผ์ ์ด ๋งค์ฐ ๋๋ฆฌ๋ค๋ ๋จ์ ์ ๋ฐ๊ฒฌํ์์ต๋๋ค.
-
next-firebase-auth: Next.js 13 + App Router์์ โnext-firebase-authโ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋๋ก ์๋ํ์ง ์์์ต๋๋ค. ์ด์ ๋ํด ๋ ผ์ ์ค์ธ PR(๋งํฌ)์ ํ์ธํ๊ณ ๊ทธ ์ด์ ๋ฅผ ์ ์ ์์์ต๋๋ค. ์๋ก์ด App Router ์ ๊ทผ ๋ฐฉ์์ ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ค์ฌ์ผ๋ก ํ์ด์ง๋ ๋ ์ด์์์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์์ ์ ์งํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฒด ์ฑ์์ ์ธ์ฆ ์ํ๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ๊ฐ๋ฐ๋์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๋ณํ๋ก ์ธํด getServerSideProps, getStaticProps ๋ฐ getInitialProps๋ฅผ ์ ๊ฑฐํ๊ฒ ๋์ด ๊ธฐ์กด์ ์ธ์ฆ ๋ฐฉ๋ฒ(์๋ฒ ์ธก์์ ์ด ๊ฐ๋ค์ ํตํด ์ธ์ฆ ์ํ๋ฅผ ์ค์ )๊ณผ ํธํ๋์ง ์๋ ๊ฒ์ผ๋ก ํ์ ํ์์ต๋๋ค.
- NextAuth ๋์ ์ ํ์์ฑ: ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ชจ์ํด์ผ ํ์ต๋๋ค. ์กฐ์ฌ ๋ฐ ํ์๋ฅผ ๊ฑฐ์ณ NextAuth๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์์ต๋๋ค. NextAuth๋ 64๊ฐ์ง์ ์ฃผ์ ํ์ฌ๋ค์ ์์ ๋ก๊ทธ์ธ์ ์ง์ํ๊ณ ์์ผ๋ฉฐ providers ์ต์ ์ถ๊ฐ๋ฅผ ํตํด ๊ฐํธํ๊ฒ ์์ ๋ก๊ทธ์ธ์ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ๋ณด์ ๋ฉด์์๋, ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ง์ผ์ฃผ๋๋ก ์ฟ ํค ์ ์ฑ ์ ํ, JWT encryption, CSRF ๋ฐฉ์ง ํ ํฐ ์ฌ์ฉ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ํ ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์์๋ถํฐ Next.js์ Serverless๋ฅผ ์ง์ํ๋๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ์ด ํ๋ก์ ํธ์ ํธํ์ด ์ ๋ ๊ฒ์ผ๋ก ์์๋์์ต๋๋ค.
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ : ํ๋ก์ ํธ์ NextAuth ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์ต๋๋ค.
-
์ธ์ ๊ด๋ฆฌ: โnext-auth/reactโ์์ ์ ๊ณตํ๋
useSession
์ ์ฌ์ฉํ์ฌ ์ ์ ์ธ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ ๋ค์ํ UI ๋ฐ ๊ธฐ๋ฅ์ ์ ๊ทผ ๊ถํ์ ์ ์ดํ ์ ์์์ต๋๋ค. -
๋ก๊ทธ์ธ & ๋ก๊ทธ์์ ๋ฒํผ ๊ตฌํ: โnext-auth/reactโ์์ ์ ๊ณตํ๋
signIn
๋ฐsignOut
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ธ ๋ฐ ๋ก๊ทธ์์ ๋ฒํผ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์์ต๋๋ค. -
์๋ฒ ์ธ์ฆ ์ฒ๋ฆฌ: ์๋ฒ์์์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ์ํด NextAuth๋ฅผ ์ฌ์ฉํ์ฌ Google Provider๋ฅผ ์ค์ ํ์์ต๋๋ค. ์ด๋ฅผ ํตํด Google ๋ก๊ทธ์ธ์ ํตํ ์ฌ์ฉ์ ์ธ์ฆ์ด ๊ฐ๋ฅํ๊ฒ ๋์์ต๋๋ค. ๋ํ, ์ฌ์ฉ์๊ฐ ์ฒ์ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ, ํด๋น ์ ์ ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ก์ง๋ ๊ตฌํํ์์ต๋๋ค.
-
๋ฏธ๋ค์จ์ด ์ค์ : ํน์ ๊ฒฝ๋ก์์ ๋ก๊ทธ์ธ ์ธ์ฆ์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด โnext-auth/middlewareโ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ์ค์ ํ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋กํ ํ์ด์ง๋ ํฌ์คํธ ์๋ํฐ ๋ฑ์ ํน์ ํ์ด์ง์ ๋ํ ์ ๊ทผ ๊ถํ์ ์ ์ดํ์์ต๋๋ค.
-
SessionProvider ์ ์ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ธ์ ์ ๋ณด์ ์ฝ๊ฒ ์ ๊ทผํ๊ธฐ ์ํด โnext-auth/reactโ์์ ์ ๊ณตํ๋
SessionProvider
๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ ์ด์์์ ๊ฐ์ธ์ฃผ์์ต๋๋ค.
App Router ๋ฐฉ์ ๋์ ์ผ๋ก 'next-firebase-auth' ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ด ์ด๋ ค์ ๋ ์ํฉ์์, NextAuth์ ๋์ ์ ํตํด ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ๊ธฐ๋ฅ์ด ์ํํ๊ฒ ์๋ํ๊ฒ ๋์์ต๋๋ค. ๋ํ ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ธ์ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ผ๋ฉฐ Firebase์ authentication์ผ๋ก ๊ตฌํํ์ ๋๋ณด๋ค ํจ์ฌ ๋น ๋ฅธ ์๋๋ก ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ์ด ์งํ๋์์ต๋๋ค. ์ธ์๋ ์ธ์ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ ๊ฐ๊ฒฐํด์ ธ์ ๊ฐ๋ฐ ๊ณผ์ ์์ ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์์์ต๋๋ค.
์ด๋ฏธ์ง ์ ๋ก๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ์ ๋ค์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ด ์์์ต๋๋ค
- ์ฌ์ฉ์์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ์์ค ์์ด ์์ ํ๊ฒ ๋ณด๊ด๋์ด์ผ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ์ธ์ ๋ ์ง ๋น ๋ฅด๊ฒ ์ ๊ทผ ๋ฐ ๊ฒ์์ด ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
- ์์คํ ํ์ฅ์ฑ์ ๊ณ ๋ คํ์ฌ ๋๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ณด์ ๋ฐ ํ๋ผ์ด๋ฒ์๋ฅผ ์ํด ์ ์ ํ ์ ๊ทผ ์ ์ด ๋ฐ ์ํธํ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
ํ๋ก์ ํธ์ ํ์ฅ์ฑ๊ณผ ๋ฐ์ดํฐ์ ์์ ์ฑ์ ๊ณ ๋ คํ์ฌ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ์ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ ํํ๊ฒ ๋์์ต๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ S3 ๋ฒํท์ ์ด๋ฏธ์ง ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ๊ต์ฐจ ์ถ์ฒ ๋ฆฌ์์ค ๊ณต์ (CORS) ์ ์ฑ ์ผ๋ก ์ธํด ์ ๊ทผ์ด ์ ํ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ ์ถํ ํผ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ์ฌ ์ด๋ฏธ์ง ํ์ผ์ ์ถ์ถํ์ต๋๋ค. ํด๋น ํ์ผ์ ๋ฒํผ๋ก ๋ณํํ ํ, S3.putObject ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ S3์ ์ ๋ก๋ํ์ต๋๋ค. AWS S3๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ ์ ์๋ ์๋น์ค๋ก, ๋ฐ์ดํฐ์ ์์ค ์์ด ์ฅ๊ธฐ๊ฐ ๋ณด๊ด์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ํ, S3์ ํ์ฅ์ฑ๊ณผ ๋์ ๋ด๊ตฌ์ฑ์ผ๋ก ์ธํด ๋๊ท๋ชจ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋น ๋ฅธ ์๋๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก S3๋ฅผ ์ ํํ์ฌ ํ์ผ ์ ๋ก๋๋ฅผ ์ฒ๋ฆฌํ์์ต๋๋ค.
const fileStream = file.stream();
let fileBuffer = Buffer.alloc(0);
for await (const chunk of fileStream) {
fileBuffer = Buffer.concat([fileBuffer, chunk]);
}
const s3Params = {
Bucket: bucketName,
Key: fileName,
Body: fileBuffer,
ContentType: fileType,
ACL: 'public-read',
};
await s3Data.putObject(s3Params);
getSignedUrl ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ ์ ํ์ด ์๋ URL์ ์์ฑํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ S3 ๋ฒํท์ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๊ฒ ๋์์ต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ S3 ๋ฒํท์ ๋ค๋ฅธ ๋๋ฉ์ธ์์ ํธ์คํ ๋๋ฏ๋ก, ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํด ์ง์ ์ ์ธ ๋ฆฌ์์ค ์ ๊ทผ์ด ์ ํ๋ฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด URL์ ์์ฑํ์ฌ ์ผ์ ์๊ฐ ๋์๋ง ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฆฌ์์ค์ ๋ณด์์ ์ ์งํ๋ฉด์๋ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ ๊ทผ์ ํ์ฉํ๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
const signedUrl = await new Promise((resolve, reject) => {
s3Data.getSignedUrl('putObject', s3Params, (err, data) => {...});
});
1์ฃผ์ฐจ
- ์์ด๋์ด ํ์
- ๊ธฐ์ ์คํ ์กฐ์ฌ ๋ฐ ์ ์
- Git ์์ ํ๋ก์ฐ ๊ฒฐ์
- ํ์ ๊ท์น ์ ๋ฆฝ
- Mockup ์ ์ ๋ฐ ๋์์ธ ์ค๊ณ
- DB ์คํค๋ง ์ค๊ณ
- API Docs ์์
- ๊ฐ๋ฐ ์ผ์ ์นธ๋ฐ ๋ณด๋ ์์ฑ
- ๊ฐ๋ฐ ์ด๊ธฐ ์ธํ
2์ฃผ์ฐจ ~
- ์น ์ฌ์ดํธ ๊ตฌํ
- ๋ฆฌํฉํ ๋ง ๋ฐ ๋ฒ๊ทธ ํฝ์ค
- ํ ์คํธ ์ฝ๋ ์์ฑ
- ํ ํ๋ก์ ํธ ๋ฐํ
- ๋ฆฌ๋๋ฏธ ์์ฑ
- ๋ฐฐํฌ
์์ํ๊ธฐ ์ ์, ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ .env ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์ค์ ํด์ฃผ์ธ์.
MONGODB_URI= # MongoDB ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํ URI
NEXTAUTH_URL= # NextAuth๊ฐ ์ฌ์ฉํ ์ฝ๋ฐฑ URL ๋ฐ ์๋ฒ์ ์ฃผ์
GOOGLE_CLIENT_ID= # Google OAuth ์ธ์ฆ์ ์ํ ํด๋ผ์ด์ธํธ ID
GOOGLE_CLIENT_SECRET= # Google OAuth ์ธ์ฆ์ ์ํ ํด๋ผ์ด์ธํธ ํค
NEXTAUTH_SECRET= # NextAuth ์ธ์
์ ์ํธํํ๊ธฐ ์ํ ํค
AWS_ACCESS_KEY_ID= # AWS ์๋น์ค์ ์ก์ธ์คํ๊ธฐ ์ํ ์ฌ์ฉ์์ ์ก์ธ์ค ํค ID
AWS_SECRET_ACCESS_KEY= # AWS ์๋น์ค์ ์ก์ธ์คํ๊ธฐ ์ํ ์ฌ์ฉ์์ ์ก์ธ์ค ํค
AWS_REGION= # AWS S3 ๋ฒํท์ด ์์นํ ๋ฆฌ์ ์ ๋ณด
AWS_S3_BUCKET_NAME= # ์ด๋ฏธ์ง ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ์ฅํ AWS S3 ๋ฒํท์ ์ด๋ฆ
๋ฌธ์ ์ฌํญ์ด ์์ผ์๋ค๋ฉด, ์๋์ ์ด๋ฉ์ผ๋ก ์ฐ๋ฝ์ฃผ์ธ์.
- ์กฐ์ํ: [email protected]
- ์์ง์: [email protected]
- ์ฐ์งํ: [email protected]
-
๋ผ์ด์ผ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ผ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค. ๋ ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.