Skip to content

Last-Survivors-3-8/VanilLog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

VanilLog: ์ผ์ƒ์„ ๊ธฐ๋กํ•˜๋Š” ๊ฐ€์žฅ ์‹ฌํ”Œํ•œ ๋ธ”๋กœ๊ทธ ๐Ÿ““

๐Ÿ’โ€โ™€๏ธ ์†Œ๊ฐœ

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

๐Ÿ‘€ ๋ชฉ์ฐจ


๐Ÿ’ก ํ”„๋กœ์ ํŠธ ๋™๊ธฐ

1. ํ•™์Šต ๋ชฉํ‘œ

  • JavaScript๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ ๋ฐฑ์—”๋“œ๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ ํ•™์Šต ์‹ฌํ™”
  • ๊ธฐ์กด์— ํ•™์Šตํ•œ ๊ธฐ์ˆ  ์Šคํƒ์˜ ํšจ๊ณผ์  ํ™œ์šฉ
  • ์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ์›น์„œ๋น„์Šค ๊ฐœ๋ฐœ

2. ๋ธ”๋กœ๊ทธ ์•„์ด๋””์–ด

๋ธ”๋กœ๊ทธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๋ชจ๋‘์—์„œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„ ์„œ๋น„์Šค ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด์— ๋ฐฐ์šด ๊ธฐ์ˆ ๋“ค์„ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฉด์—์„œ ํ™œ์šฉํ•˜๋ฉด์„œ ์‹ค๋ ฅ์„ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ 'VanilLog'

ํ•™์Šต ๋ชฉํ‘œ์™€ ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ์‚ฌ์šฉ์ž๋“ค์ด ์ž์‹ ์˜ ์ผ์ƒ์„ ์ž์œ ๋กญ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ 'VanilLog'๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿšง ๋„์ „ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

3์ฃผ ๋™์•ˆ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฒช์—ˆ๋˜ ํ•ต์‹ฌ์ ์ธ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

1. Next JS 13 + App Router

1) ์–ด๋–ค ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ํ• ๊นŒ?

๋ธ”๋กœ๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์˜€์„ ๋•Œ, ์ด ๋ธ”๋กœ๊ทธ์˜ ๊ฒŒ์‹œ๊ธ€์„ ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋†’์€ ๋นˆ๋„๋กœ ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•ด SEO ์ ์šฉ์ด ํ•„์š”
  • ๋ฐฑ์—”๋“œ์—์„œ ํ•˜๋Š” ์—ญํ• ์„ ์‚ดํŽด๋ณด๋‹ˆ apiํ˜ธ์ถœ ์™ธ์˜ ๋ณ„๋‹ค๋ฅธ ์ž‘์—…์ด ์—†์Œ

๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ CSR์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— SEO์— ์ทจ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด SEO๋ฅผ ์œ„ํ•œ SSR์„ ์ œ๊ณตํ•˜๊ณ , api๋ฅผ ํด๋ผ์ด์–ธํŠธ์™€ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 'Next.js'๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

2) ํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ:

'Next.js'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ์šด์˜์‚ฌ์˜ ๊ถŒ๊ณ ๋กœ 'Next.js' 13๋ฒ„์ „ App Router ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ดˆ๊ธฐ์—๋Š” ๋ชฐ๋ž์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. 'Next.js' 13 ๋ฒ„์ „์€ 2022๋…„์— ์ถœ์‹œ๋˜์–ด, ๊ด€๋ จ ์ž๋ฃŒ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ๋ผ์šฐํ„ฐ์™€์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜์˜€๊ณ , ์ด๋กœ ์ธํ•œ ๋Ÿฌ๋‹ ์ปค๋ธŒ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋น„๊ต์  ์ƒˆ๋กœ ๋‚˜์˜จ ๋ฐฉ์‹์ด๋‹ค ๋ณด๋‹ˆ ์ €ํฌ๊ฐ€ ์“ฐ๋ ค๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์—์„œ App Router๋ฐฉ์‹์„ ์ง€์›ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ด๋ฏธ ์ง„ํ–‰์ด ๋œ ์ƒํƒœ์—์„œ Pages Router ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„์„ ๊ณ ๋ คํ•˜์—ฌ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  App Router ๋ฐฉ์‹์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

3) ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฃผ๋กœ ์ฐธ๊ณ ํ•˜์—ฌ ํ•™์Šตํ•˜์˜€๊ณ , Next.js github issues๋“ค์„ ์ฐพ์•„๋ณด๋ฉฐ ํ•ด๊ฒฐ ๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์™€ ๋‹ค๋ฅธ ์œ ์ €๋“ค์ด ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์ฐพ์•„๋ณด๋ฉฐ ์‚ฌ์šฉ๋ฒ•์„ ์ˆ™๋‹ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ App Router ๋ฐฉ์‹์„ ์œ ์ง€ํ•˜๊ณ ์„œ ๋ธ”๋กœ๊ทธ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


2. ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…

1) ์ดˆ๊ธฐ ๊ธฐํš๊ณผ ๋ฌธ์ œ์ :

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๋ฅผ ์ œ๊ฑฐํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์กด์˜ ์ธ์ฆ ๋ฐฉ๋ฒ•(์„œ๋ฒ„ ์ธก์—์„œ ์ด ๊ฐ’๋“ค์„ ํ†ตํ•ด ์ธ์ฆ ์ƒํƒœ๋ฅผ ์„ค์ •)๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํŒŒ์•…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2) ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๋ชจ์ƒ‰:

  • NextAuth ๋„์ž…์˜ ํ•„์š”์„ฑ: ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ์‚ฌ ๋ฐ ํšŒ์˜๋ฅผ ๊ฑฐ์ณ NextAuth๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. NextAuth๋Š” 64๊ฐ€์ง€์˜ ์ฃผ์š” ํšŒ์‚ฌ๋“ค์˜ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ providers ์˜ต์…˜ ์ถ”๊ฐ€๋ฅผ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋ฉด์—์„œ๋Š”, ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ผœ์ฃผ๋„๋ก ์ฟ ํ‚ค ์ •์ฑ… ์ œํ•œ, JWT encryption, CSRF ๋ฐฉ์ง€ ํ† ํฐ ์‚ฌ์šฉ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ Next.js์™€ Serverless๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ”„๋กœ์ ํŠธ์™€ ํ˜ธํ™˜์ด ์ž˜ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3) NextAuth๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ ๊ตฌํ˜„:

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…: ํ”„๋กœ์ ํŠธ์— NextAuth ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์„ธ์…˜ ๊ด€๋ฆฌ: โ€˜next-auth/reactโ€™์—์„œ ์ œ๊ณตํ•˜๋Š” useSession์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ € ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ UI ๋ฐ ๊ธฐ๋Šฅ์— ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ๋กœ๊ทธ์ธ & ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ๊ตฌํ˜„: โ€˜next-auth/reactโ€™์—์„œ ์ œ๊ณตํ•˜๋Š” signIn ๋ฐ signOut ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ๋ฐ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์ธ์ฆ ์ฒ˜๋ฆฌ: ์„œ๋ฒ„์—์„œ์˜ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด NextAuth๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Google Provider๋ฅผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Google ๋กœ๊ทธ์ธ์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๋กœ์ง๋„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๋ฏธ๋“ค์›จ์–ด ์„ค์ •: ํŠน์ • ๊ฒฝ๋กœ์—์„œ ๋กœ๊ทธ์ธ ์ธ์ฆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด โ€˜next-auth/middlewareโ€™๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€๋‚˜ ํฌ์ŠคํŠธ ์—๋””ํ„ฐ ๋“ฑ์˜ ํŠน์ • ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • SessionProvider ์ ์šฉ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์„ธ์…˜ ์ •๋ณด์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด โ€˜next-auth/reactโ€™์—์„œ ์ œ๊ณตํ•˜๋Š” SessionProvider๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฐ์‹ธ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

4) ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฒฐ๊ณผ:

App Router ๋ฐฉ์‹ ๋„์ž…์œผ๋กœ 'next-firebase-auth' ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž…์ด ์–ด๋ ค์› ๋˜ ์ƒํ™ฉ์—์„œ, NextAuth์˜ ๋„์ž…์„ ํ†ตํ•ด ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์ด ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ Firebase์˜ authentication์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ ์†๋„๋กœ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…์ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์™ธ์—๋„ ์„ธ์…˜ ๊ฐ’์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ ธ์„œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


3. ์ด๋ฏธ์ง€ ์ €์žฅ: AWS S3

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค

1) ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ• ๊นŒ?

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

ํ”„๋กœ์ ํŠธ์˜ ํ™•์žฅ์„ฑ๊ณผ ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ •์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜์„ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2) CORS ์ •์ฑ… ์ œํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ:

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ S3 ๋ฒ„ํ‚ท์˜ ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ (CORS) ์ •์ฑ…์œผ๋กœ ์ธํ•ด ์ ‘๊ทผ์ด ์ œํ•œ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

3) ํ•ด๊ฒฐ ๋ฐฉ์•ˆ:

(a) ํŒŒ์ผ ์—…๋กœ๋“œ

์‚ฌ์šฉ์ž๊ฐ€ ์ œ์ถœํ•œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ถ”์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํŒŒ์ผ์„ ๋ฒ„ํผ๋กœ ๋ณ€ํ™˜ํ•œ ํ›„, 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);

(b) CORS ์„ค์ •

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์ฃผ์ฐจ ~
  • ์›น ์‚ฌ์ดํŠธ ๊ตฌํ˜„
  • ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๋ฒ„๊ทธ ํ”ฝ์Šค
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  • ํŒ€ ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ
  • ๋ฆฌ๋“œ๋ฏธ ์ž‘์„ฑ
  • ๋ฐฐํฌ

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

React Next.js Next Auth AWS SDK Axios TailwindCSS ESLint Prettier


๐Ÿ— ์„ธํŒ… ๋ฐฉ๋ฒ•

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .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 ๋ฒ„ํ‚ท์˜ ์ด๋ฆ„

๐Ÿ‘ฅ ํŒ€ ๋ฉค๋ฒ„

๋ฌธ์˜ ์‚ฌํ•ญ์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด, ์•„๋ž˜์˜ ์ด๋ฉ”์ผ๋กœ ์—ฐ๋ฝ์ฃผ์„ธ์š”.


๐Ÿ”— Repository Link


๐Ÿ“Œ ๊ธฐํƒ€ ์‚ฌํ•ญ

  • ๋ผ์ด์„ผ์Šค

    ์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages