TIL_221117 โœ…๐Ÿšฉ Firebase

์ •์œค์ˆ™ยท2022๋…„ 11์›” 17์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
18/192

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ 4๊ธฐ ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉ React B๋ฐ˜


๐Ÿ“’ ์˜ค๋Š˜์˜ ๊ณต๋ถ€

1. Firebase ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ ๊ตฌํ˜„

  • ์ฐธ๊ณ  https://youtu.be/tPqTE14DEUg

  • submit์œผ๋กœ ์„œ๋ฒ„์— ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ˆœ๊ฐ„ ์ƒˆ๋กœ๊ณ ์นจ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— preventDefault()ํ•จ์ˆ˜๋กœ ์ƒˆ๋กœ๊ณ ์นจ ๋ฐฉ์ง€

  • ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ -> ๋นŒ๋“œ -> ์ธ์ฆ์—์„œ ์ฝ”๋“œ ์ฐธ์กฐํ•˜๊ธฐ

  • SignUpButton / SignInutton ๋“ฑ id๊ฐ’ ๊ตฌ๋ถ„ํ•˜๊ธฐ

  • document 2๊ฐœ(ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ)์˜ ๊ณตํ†ต ์ฝ”๋“œ์ธ
    const auth = getAuth();๋Š” document์œ„๋กœ ๋นผ์„œ ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค์–ด ์ฃผ๊ธฐ


โœ…

ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ํšŒ์›๊ฐ€์ž… ํ•˜๊ธฐ ๋ˆ„๋ฅด๋ฉด 404 error๊ฐ€ ๋œฌ๋‹ค.
    • ์ฝ”๋“œ๋„ ์ญ‰ ์‚ดํŽด๋ณด๊ณ  404 error๋„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ํ˜น์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธธ์ด๊ฐ€ ๋„ˆ๋ฌด ์งง์•„์„œ ๊ทธ๋Ÿฐ ๊ฑด๊ฐ€ ์‹ถ์–ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ข€ ๊ธธ๊ฒŒ ์ž…๋ ฅํ•˜๋‹ˆ firebase์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋“ค์–ด๊ฐ”๋‹ค!!
    • ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž๋ฆฟ์ˆ˜ ์‹คํ—˜ํ•ด ๋ณด๋‹ˆ 6์ž๋ฆฌ ์ด์ƒ์œผ๋กœ ํ•ด์•ผ ํšŒ์›๊ฐ€์ž…์ด ๋œ๋‹ค.

2. Youtube ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ_2

  • ํ•  ๊ฒƒ
  1. CSS์ ์šฉ ํ•˜๋ฉด์„œ HTML ์ˆ˜์ •ํ•˜๊ธฐ
  2. ๊ฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ ๊ฑธ๊ธฐ
  • Font Awesome
    • ํšŒ์›๊ฐ€์ž…ํ•ด์„œ kit code๋ฅผ ๋ฐ›์•„ < head >์— ๋„ฃ๊ฑฐ๋‚˜
    • cdnjs์—์„œ fontawesome ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ธฐ
    • icon ์ค‘ pro icon์€ ์‚ฌ์šฉ์ด ์•ˆ ๋จ!
  • ์ฒ˜์Œ๋ถ€ํ„ฐ ํ˜ผ์ž์„œ ๋งŒ๋“ค์–ด ๋ณด๋Š”๋ฐ CSS ์†์„ฑ์„ ์ง€์ •ํ•  ๋•Œ ์ƒ,ํ•˜์œ„ class์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ๊นจ๋‹ฌ์•˜๋‹ค.
    • ๊ธ€์”จ๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” headcontainclass์—๋งŒ display๋ฅผ flex๋กœ ํ–ˆ๋”๋‹ˆ ๊ธ€์”จ๊ฐ€ ์œ„์— ๋ถ™์—ˆ๋‹ค.
    • ์ƒ์œ„ class head์— display๋ฅผ flex, headcontain์—๋Š” display: inherit์œผ๋กœ ํ•˜๋‹ˆ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ๊ธ€์”จ๊ฐ€ ๊ฐ€์šด๋ฐ๋กœ ์ •๋ ฌ๋๋‹ค.
  • icon ์ƒ‰์ƒ ๋ณ€๊ฒฝ
    • class="fa-brands fa-youtube" ์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ๋Š”๋ฐ fa-brands์™€ fa-youtube ์ค‘ ํ•˜๋‚˜๋งŒ ์“ฐ๋‹ˆ ์ƒ‰์ƒ ๋ณ€๊ฒฝ ์ž˜ ๋จ!
  • icon ํฌ๊ธฐ ๋ณ€๊ฒฝ
    • fa-brands fa-youtube fa-xl ์ฝ”๋“œ์— ์ง์ ‘ ์‚ฌ์ด์ฆˆ ๊ธฐ์žฌ
    • CSS: font-size: x-large;
  • ์›น ํŽ˜์ด์ง€๋ณด๋‹ค ์•ฑ ํ™”๋ฉด ๋จผ์ €!
    • ์™ผ์ชฝ user, ์˜ค๋ฅธ์ชฝ video๋กœ ๊ตฌ์—ญ ๋‚˜๋ˆด๋‹ค๊ฐ€ ์•ฑ์ฒ˜๋Ÿผ ์ˆ˜์ง ์ •๋ ฌ๋œ ๊ฒƒ ๋จผ์ € ๋งŒ๋“ค๋ ค๊ณ  wireframe, html ๋‹ค์‹œ ์ˆ˜์ •
  • ๋™์˜์ƒ์€ < video>ํƒœ๊ทธ๋กœ!
  • ์ ์  ๊ฐ ๊ตฌ์—ญ๊ณผ ๊ตฌ์—ญ ์•ˆ์˜ ์š”์†Œ๋“ค ๋ฐฐ์น˜๊ฐ€ ๋Šฅ์ˆ™ํ•ด์ง€๊ณ  ์žˆ๋‹ค!

3. Firebase ํŠน๊ฐ•

  • Firebase : ๋ณ„๋„์˜ ์„œ๋ฒ„๋‚˜ DB๊ด€๋ฆฌ ์—†์ด ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฑ์—”๋“œ ํ”Œ๋žซํผ

  • ์ฃผ๋กœ ์ด์šฉํ•  ์„œ๋น„์Šค

    • Authentication : ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ํ”„๋กœํ•„๊ด€๋ฆฌ
    • Firestore : CRUD API๋ฅผ ์ œ๊ณต ๋ฐ NoSQL DB ์ œ๊ณต
    • Storage : ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ๋‹ค์šด๋กœ๋“œ URL
  • ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์˜ API๋Š” ๊ฐœ๋ฐœ์ž ๋ฌธ์„œ์— ์›ฌ๋งŒํ•˜๋ฉด ๋‹ค ์žˆ์Œ

  • ์›น ์•ฑ์— Friebase ์ถ”๊ฐ€

    • Firebase SDK ์ถ”๊ฐ€
      -> nmp: React์—์„œ ์‚ฌ์šฉ
      -> < script>: Vanilla JS์—์„œ ์‚ฌ์šฉ
      -> ๊ฐ•์˜์ž๋ฃŒ์˜ 'Firebase ์—ฐ๊ฒฐ ์Šค๋‹ˆํŽซ' ์ด์šฉ
  • Authentication ๋กœ๊ทธ์ธ ์„ค์ •

    • ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ : ์ด๋ฉ”์ผ ๋งํฌ(์‚ฌ์šฉ ์„ค์ • ์•ˆ ํ•จ)
    • Google
      -> ํ”„๋กœ์ ํŠธ ์ง€์› ์ด๋ฉ”์ผ(๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธ ํ–ˆ์œผ๋ฉด ์ž๋™ ์™„์„ฑ ์ฃผ์†Œ๊ฐ€ ๋œธ)
    • Git
      -> Git hub์˜ Profile - setting - developer settings - OAuth Apps - new OAuth app
      -> Authorization callback url: firebase์˜ git hub ๋กœ๊ทธ์ธ ์„ค์ •์— ์žˆ๋Š” url
      -> Homepage URL: firebase์˜ call back url์˜ '.com' ๊นŒ์ง€๋งŒ ์ž…๋ ฅ
      -> firebase์— git hub์˜ client ID ์ž…๋ ฅ
      -> git hub์—์„œ 'client secret' ์ƒ์„ฑ ํ›„
      firebase์— ๋ณด์•ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ
    • ๋„ค์ด๋ฒ„, ์นด์นด์˜ค๋Š” ๋ณ„๋„์˜ ์ปค์Šคํ…€ ์„ค์ •์ด ํ•„์š”
  • cloud firestore ์„ค์ •

    • ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค -> ํ…Œ์ŠคํŠธ ๋ชจ๋“œ๋กœ๋„ ์ถฉ๋ถ„
  • storage ์„ค์ •

    • ์‹œ์ž‘ํ•˜๊ธฐ -> ํ…Œ์ŠคํŠธ ๋ชจ๋“œ๋กœ๋„ ์ถฉ๋ถ„
  • Authentication ์„ค์ •

    • settings
      ->'ID๊ณต๊ธ‰์—…์ฒด๋ณ„๋กœ ์—ฌ๋Ÿฌ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ' ์„ค์ •์„ ํ•ด์•ผ ๊ฐ™์€ ์ด๋ฉ”์ผ๋กœ ๊ตฌ๊ธ€, gitgub ๋ชจ๋‘ ๋กœ๊ทธ์ธ ๊ฐ€๋Šฅ
      -> ๊ตฌ๋งคํ•œ ๋„๋ฉ”์ธ์„ '์Šน์ธ๋œ ๋„๋ฉ”์ธ'์— ์ถ”๊ฐ€๋ฅผ ํ•ด์•ผ ํ•จ(localhost๋กœ ์ž‘์—…ํ•œ ๊ฑด ์ถ”๊ฐ€๊ฐ€ ํ•„์š”์—†์ง€๋งŒ ๋ณ„๋„์˜ ๋„๋ฉ”์ธ์€ ์ถ”๊ฐ€๋ฅผ ๊ผญ ํ•ด์•ผ ์—ฐ๊ฒฐ์ด ๋จ)

์ฝ”๋“œ ๋ถ„์„

main.js

โ‘  DOMcontentLoaded : html, js, css ๋ชจ๋‘ ๋‹ค์šด ๋ฐ›์•˜์„ ๋•Œ ์‹คํ–‰ํ•˜๋ผ๋Š” ๊ฒƒ
โ‘ก ์œ ์ € ์ •๋ณด๊ฐ€ ๋‹ด๊ธด authSerivce๋ผ๋Š” ๊ฐ์ฒด์— EventListner์ธ onAuthStateChanged๋ฅผ ๋‹ฌ์•„ user์˜ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ€๋Šฅ
โ‘ข handleLocation์€ ํ˜„์žฌ url์— ํ•ด๋‹นํ•˜๋Š” ํŒŒ์ผ์„ ๋„์šฐ๋Š” ์—ญํ•  = innerHTML์„ ๊ฐ€์ง€๊ณ  ํ™”๋ฉด์„ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
โ‘ฃ hash๋ฅผ ์„ค์ •ํ•˜๋Š” ์ด์œ  : hash๊ฐ’์„ ํ†ตํ•ด ์–ด๋–ค ํ™”๋ฉด์„ ๋„์šธ์ง€ ์„ ํƒ
โ‘ค hash ๊ฐ’์„ ํ†ตํ•ด์„œ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•ด ์˜ฌ๋ฐ”๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ด
-> if(hash === "") user๊ฐ€ ๋กœ๊ทธ์ธํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฉด window.location.replace("#fanLog") ํŒฌ๋ช…๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚จ๋‹ค

  • window ๊ฐ์ฒด
    ๋ฒ„ํŠผ ์ด๋ฒคํŠธ(onclick...)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค html์— ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• 

  • index.html์—์„œ type="module"๋กœ ํ•ด์•ผ ES6d์˜ module import export ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    -> ๋ชจ๋“ˆ๋กœ ์„ ์–ธ์ด ๋œ js ํŒŒ์ผ์€ ๋ฒฝ์ด ์„ธ์›Œ์ ธ ์ „์—ญ์œผ๋กœ ์“ธ ์ˆ˜ ์—†์Œ(์ง€์—ญ์  ์‚ฌ์šฉ)
    -> ์–ด๋””์„œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ window ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด main.js์—์„œ import๋กœ ๋ถˆ๋Ÿฌ์˜จ 'update_commnet' ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ method๋กœ์จ ํ• ๋‹น ์‹œ์ผœ์ค€๋‹ค.

  • ๋ชจ๋“ˆ์„ ์“ฐ์ง€ ์•Š์œผ๋ ค๋ฉด main.js ํŒŒ์ผ์— ๋ชจ๋“  js ๋‚ด์šฉ์„ ๋‹ค ๋„ฃ์–ด์•ผ ํ•œ๋‹ค.(๋น„ํšจ์œจ์ )

firebase.js

โ‘  firebaseConfig์— ํ”„๋กœ์ ํŠธ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค
(firebase์˜ ํ”„๋กœ์ ํŠธ ๊ฐœ์š” - ํ”„๋กœ์ ํŠธ ์„ค์ • ์ •๋ณด)
โ‘ก initailizeApp๋ฅผ ํ†ตํ•ด firebase์˜ ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐ(์ฝ”๋“œ๋ฅผ ๊ผฝ์•˜๋‹ค)
app์ด๋ผ๋Š” ๋ณ€์ˆ˜ ์ž์ฒด๊ฐ€ firebase์—์„œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ(ํ”„๋กœ์ ํŠธ์˜ ์œ„์น˜๋ฅผ ์ง€์ •)
โ‘ข app์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋‹ด์•„ ํ”„๋กœ์ ํŠธ์˜ ์„œ๋น„์Šค 3๊ฐ€์ง€๋ฅผ ์—ฐ๊ฒฐ
-> Authentication, Firestore, Storage์˜ ๋ชจ๋“  API๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

auth.js

  • matchedEmail : match() method๊ฐ€ ๋ฌธ์ž์—ด์ด ์ด๋ฉ”์ผ regex์™€ ๋งค์น˜๋˜๋Š” ๋ถ€๋ถ„์„ ๊ฒ€์ƒ‰
  • ๋’ค๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ฒŒ return์œผ๋กœ ๋ฐ˜๋“œ์‹œ ๋Š์–ด์ค˜์•ผ ํ•จ
  • ํšŒ์›๊ฐ€์ž… ํ›„ ๋ฐ”๋กœ ํŒฌ๋ช…๋ก ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ
    -> main.js์˜ onAuthStateChanged ๋กœ ์ธํ•ด user๊ฐ€ ์žˆ๋Š”๊ฒŒ ํ™•์ธ ๋˜์–ด ํŒฌ๋ช…๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ ๊ฒƒ

util.js

  • regex(regular expression) ์ •๊ทœํ‘œํ˜„์‹
    -> emailRegex = email ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๊ทœ์น™
    -> pwRegex = ๋Œ€์†Œ๋ฌธ์ž, ์ˆซ์ž, ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์ด์šฉํ•ด 8์ž ์ด์ƒ ๋งŒ๋“ค๋ผ๋Š” ๊ทœ์น™
  • email regex js ๊ตฌ๊ธ€๋ง

router.js

โ‘  fanLog.html์—์„œ๋Š” "๋‹‰๋„ค์ž„"์ธ๋ฐ ํ™”๋ฉด์—” "๋‹‰๋„ค์ž„ ์—†์Œ"์ด ๋œฌ๋‹ค.
- Dom์€ ํ™”๋ฉด์— ๋„์›Œ์ง„ ๊ฒƒ๋งŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ
- ํŒฌ๋ช…๋ก ํŽ˜์ด์ง€๊ฐ€ ๋„์›Œ์ง€์ž๋งˆ์ž ํŒฌ๋ช…๋ก์— ์žˆ๋Š” ๊ฒƒ๋งŒ JS DOM์œผ๋กœ ์„ ํƒ (ํŒŒ์ผ์ด ์žˆ๋‹ค๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ ์•„๋‹˜)
- ํ™”๋ฉด์— ๋„์›Œ์ง„ DOM๋งŒ ์„ ํƒํ•˜๋ ค๋ฉด handlelocation ์•ˆ์—์„œ if๋ฌธ์œผ๋กœ ์ œ์•ฝ์„ ์ค˜์•ผ ํ•œ๋‹ค.
โ‘ก ๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ด
โ‘ข null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž : ??
-> currentUser์˜ photoURL์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์“ฐ๊ณ  ์—†์œผ๋ฉด ํ”„๋กœํ•„ ์‚ฌ์ง„(asset์— ๋„ฃ์€ ์‚ฌ์ง„)์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค.
-> response์— ๊ฐ’์ด ์—†์œผ๋ฉด ๋ณดํ†ต null / undefined์ด๋ผ null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŽ์ด ์”€

profile.js

โ‘  disabled = true ๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
-> ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ๋ฒ„ํŠผ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ฒŒ ๋จ
โ‘ก ํ”„๋กœํ•„ ์ด๋ฏธ์ง€๊ฐ€ ํด๋”(authService.currentuser.uid)์—
ํŒŒ์ผ(uuidv4)๋กœ ์ €์žฅ

  • uuid:
    -> ์ „์„ธ๊ณ„ ์–ด๋Š ์•„์ด๋””์™€๋„ ์ค‘๋ณต๋˜์ง€ ์•Š์•„ ๋‹ค๋ฅธ DB์™€ ํ•ฉ์น  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
    โ‘ข uploadString์ด๋ผ๋Š” firestorage์˜ api๋ฅผ ํ†ตํ•ด response๋ฅผ ๋ฐ›๋Š”๋‹ค.
    -> imgRef : ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜๋Š” ์œ„์น˜
    -> getDownloadURL์„ ํ†ตํ•ด response์˜ ref๊ฐ€ downloadUrl์— ๋‹ด๊ธด๋‹ค = '์ด๋ฏธ์ง€ ๋งํฌ'(์˜๊ตฌ์ )
    -> ํ™”๋ฉด์— ์ด๋ฏธ์ง€๋ฅผ ๋ฟŒ๋ฆด ๋•Œ ์ด downloadUrl์„ ์ด์šฉ
    -> imgDataUrl์€ ์ž„์‹œ์ ์ธ ๊ฒƒ

profile.html

โ‘  label๋กœ ๊ฐ์‹ธ๊ณ  input์˜ id="imgInput"์„ css์—์„œ display:none์œผ๋กœ ์„ค์ •
-> label์„ ํด๋ฆญํ•ด๋„ "imgInput"์ด ์„ ํƒ๋จ
โญlabel ์•ˆ์˜ ์–ด๋Š ๋ถ€๋ถ„์„ ๋ˆŒ๋Ÿฌ๋„ onfileChange ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด label๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ
โ‘ก input type="file"๋กœ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํŒŒ์ผ ์„ ํƒ ์ฐฝ์ด ๋œฌ๋‹ค.

profile.js

โ‘  onFileChange ํ”„๋กœํ•„ ๊ด€๋ฆฌ์—์„œ ์‚ฌ์ง„์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค๋ฅธ ์‚ฌ์ง„์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํŒ์—…์ด ๋œจ๋Š” ๋™์ž‘
โ‘ก JS ์ž์ฒด API์ธ FileReader๋ผ๋Š” ํด๋ž˜์Šค๋กœ reader๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
โ‘ข readAsDataURL์ด๋ผ๋Š” reader์˜ method๋ฅผ ํ†ตํ•ด the file์„ ์ธ์ž๋กœ ๋„ฃ์œผ๋ฉด file๊ฐ์ฒด๊ฐ€ DataUrl๋กœ ๋ณ€ํ™˜
-> onloadend event. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์ด ๋๋‚ฌ์„ ๋•Œ ์ด ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰์ด ๋จ
โ‘ฃ localStorage ํ”„๋กœํ•„ ๋ณ€๊ฒฝ์„ ๋ˆ„๋ฅด๊ธฐ ์ „๊นŒ์ง€๋Š” ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ๋ฐ”๋€Œ์ง€ ์•Š๊ฒŒ imgDataUrl์„ ์ž„์‹œ ๋ณด๊ด€
-> downloadrul์„ ์–ป๋Š” ์ค‘๊ฐ„ ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐ

  • ํ”„๋กœํ•„ ์‚ฌ์ง„ ์‚ญ์ œ: ๊ฐ•์˜ ์ž๋ฃŒ 'Storage API'

CRUD

fanLog.js

โ‘  add doc Firestore DB์— ์ €์žฅํ•˜๋Š” ํ•จ์ˆ˜
-> "comments"๋ผ๋Š” collection์— ์•„๋ž˜ ํ˜•์‹์˜ documents๋ฅผ ์ €์žฅ.
โ‘ก createId ์ˆ˜์ •, ์‚ญ์ œ๋ฅผ ํ•ด๋‹น ์œ ์ €id์— ํ•ด๋‹นํ•˜๋Š” ๋Œ“๊ธ€์—๋งŒ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ!
โ‘ข ์ƒˆ๋กœ๊ณ ์นจ์„ ์•ˆ ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž๋งˆ์ž getCommentList๋ฅผ ํ†ตํ•ด ์‹น ์ง€์šฐ๊ณ  ์—…๋ฐ์ดํŠธ ๋œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

โ‘  query(firestore์—์„œ ์ œ๊ณตํ•˜๋Š” api)
โ‘กquerySnapshot์ด๋ผ๋Š” ๋ฐฐ์—ด์„ response๋กœ ๋ฐ›๋Š”๋‹ค
โ‘ข forEach = querySnapshot์ด๋ผ๋Š” ๊ฐ์ฒด์˜ method(๋ฐฐ์—ด์˜ for each์™€ ๋‹ค๋ฅด๋‹ค)
-> method: ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜

โ‘  innerHTML = "" ์ดˆ๊ธฐํ™”
โ‘ก ๋ฐฐ์—ด์˜ foreach
-> ๋ฐฐ์—ด์„ ๋ถ™์ผ ๋•Œ(๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์™€ ๋ถ™์ด๋Š” ๊ฒƒ) jquery๋ณด๋‹ค๋Š” vanillaJS ์“ฐ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ
-> ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜ ๋” ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ํ˜„์—…์—์„œ jquery ์ž˜ ์•ˆ ์”€
โ‘ข ๋‚ ์งœ: 0๋ฒˆ์งธ๋ถ€ํ„ฐ 24(25-1)๋ฒˆ์งธ ๊นŒ์ง€ ์ถœ๋ ฅ

  • update_comment(event)๋ฌธ์ž์—ด๋กœ ์žˆ์–ด๋„ DOM์œผ๋กœ ์ธํ•ด document ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์ธ์‹์ด ๋จ

โ‘ 
-> parentNode.children[0]
= input.newCmtInput(์ˆ˜์ •ํ•  ๋Œ“๊ธ€ ์ž…๋ ฅ์ฐฝ)
-> parentNode.children[1]
= button.updateBtn(์™„๋ฃŒ ๋ฒ„ํŠผ)

  • remove add๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ ์—ฌ๋ถ€์ž„
    -> ์œ—๋ถ€๋ถ„ ์ฝ”๋“œ์˜ ๊ธฐ๋ณธ ๊ฐ’์€ add๋กœ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ update_comment์•ˆ์—์„œ ์ˆ˜์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•จ
    -> ๋Œ“๊ธ€ ์ˆ˜์ •์„ ๋ˆ„๋ฅด๋ฉด ์ˆ˜์ •ํ•  ๋‚ด์šฉ์„ ์ž…๋ ฅํ•˜๋Š” ์ฐฝ(d-flex)์ด ๊ธฐ์กด ๋Œ“๊ธ€์„ ๊ฐ€๋ฆฌ๊ฒŒ ๋˜์–ด ์žˆ์œผ๋‹ˆ remove
  • 'd-flex'๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์ด๋ผ CSS์—์„œ ์•ˆ ๋ณด์ด๋Š” ๊ฒƒโ‘ก ์ƒˆ๋กœ์šด ๋Œ“๊ธ€๋กœ ๋ฐ”๊พธ๊ณ  ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด getCommentList๋กœ ์‹น ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ด

AWS S3

  • Storage Service
  • ์ •์  ์›น ์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…
  • ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ
    • '๋ฒ„ํ‚ท ์ด๋ฆ„ = ๋„๋ฉ”์ธ ์ด๋ฆ„'์œผ๋กœ ํ•ด์•ผ Route53์—์„œ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ ๋จ
    • ๋ชจ๋“  ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ ์ฒดํฌ ํ’€๊ธฐํ•˜๊ณ  ํ™•์ธ๋งŒ ์ฒดํฌ ํ›„ ๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ
  • ์†์„ฑ์˜ ์ •์  ์›น ์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…์„ ํ™œ์„ฑํ™”
    • ์ธ๋ฑ์Šค ๋ฌธ์„œ: ๊ฐ€์žฅ ์ฒ˜์Œ์— ์ œ๊ณตํ•  ํŒŒ์ผ(index.html)
    • ์˜ค๋ฅ˜ ๋ฌธ์„œ : index.html
  • ์†์„ฑ์˜ ๊ฐ์ฒด
    • ํŒŒ์ผ์„ ์—…๋กœ๋“œ
  • ๊ถŒํ•œ์˜ ๋ฒ„ํ‚ท์ •์ฑ…
    • ์ •์ฑ… ์ƒ์„ฑ๊ธฐ
      -> S3 bucket policy ํƒ€์ž…
      -> allow
      -> principal: *
      -> actions: GetObject
      -> ARN: ๋ฒ„ํ‚ท ์ •์ฑ… ํŽธ์ง‘ ํŽ˜์ด์ง€์˜ ๋ฒ„ํ‚ท ARN ๋ณต๋ถ™+/*
      -> add statement
      -> general policy ๋ˆŒ๋Ÿฌ ์ƒ์„ฑ๋œ ์ฝ”๋“œ ๋ณต์‚ฌํ•ด์„œ ์ •์ฑ…์— ๋ถ™์—ฌ๋„ฃ๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ
      -> ๋ฐฐํฌ ๋

๋„๋ฉ”์ธ ์ ์šฉ ๊ณผ์ •

  • ๋ธŒ๋ผ์šฐ์ €์— www.yunny.com์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด dns์— ip ์ฃผ์†Œ๋ฅผ ์š”์ฒญ
    • ๋ธŒ๋ผ์šฐ์ €๋Š” DNS ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ip์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ ํ˜ธ์ŠคํŒ… ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ index.html์„ ๋‹ค์šด ๋ฐ›์Œ
  • ๋„ค์ž„ ์„œ๋ฒ„๊ฐ€ 'www.yunny.com = 123.123.123(ip)'๋กœ ๋งตํ•‘์ด ๋๋‹ค๋Š” Original data๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ
    • DNS ์„œ๋ฒ„๋Š” ์‚ฌ๋ณธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ ๋„ค์ž„์„œ๋ฒ„์— ์š”์ฒญํ•ด์„œ data๋ฅผ ๋ฐ›์€ ๋‹ค์Œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ „๋‹ฌ
  • Gabia(EC2)๋Š” ๋„๋ฉ”์ธ ๊ตฌ๋งค,์‚ฌ์šฉ์ฒ˜๊ฐ€ ๊ฐ™๋‹ค
  • S3์˜ ๊ฒฝ์šฐ
    • AWS Route 53์ด๋ผ๋Š” ๋ฉ”๋‰ด์— DNS ์„ค์ •์„ ํ•ด์ค˜์•ผ ํ•จ
    • ํ˜ธ์ŠคํŒ… ์˜์—ญ ์ƒ์„ฑ - ๊ตฌ๋งคํ•  ๋„๋ฉ”์ธ์„ ๋„ฃ์Œ(๋ฒ„ํ‚ท์ด๋ฆ„๊ณผ ๋˜‘๊ฐ™์ด!!)
    • ์œ ํ˜•: NS(name server)๊ฐ€ ๋œธ.
    • '๊ฐ’/ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋Œ€์ƒ(name server ์ฃผ์†Œ)'๋ฅผ ๋ชจ๋‘ ๋„๋ฉ”์ธ์„ ๊ตฌ์ž…ํ•œ ๊ฐ€๋น„์•„์— 1์ฐจ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋“ฑ๋ก์‹œ์ผœ์ค˜์•ผ ํ•จ(๊ฐ€๋น„์•„ = Name server)
    • ๊ฐ€๋น„์•„ ๋„๋ฉ”์ธ - ๊ด€๋ฆฌ - ๋„ค์ž„์„œ๋ฒ„ ์„ค์ •(1์ฐจ~)

    โญ์ฃผ์˜ํ•  ์  : Name server ์ฃผ์†Œ ๋’ค์˜ '.'์€ ๋นผ์„œ ๋“ฑ๋ก!

  • Route53์—์„œ ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ
    • ๋ณ„์นญ ํ™œ์„ฑํ™”
    • ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋Œ€์ƒ: S3์›น ์‚ฌ์ดํŠธ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ณ„์นญ
    • ์„œ์šธ
    • S3 ์—”๋“œํฌ์ธํŠธ ์ž…๋ ฅ์— ์ž๋™์™„์„ฑ์ด ๋– ์•ผ ์ •์ƒ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒƒ -> ๋ ˆ์ฝ”๋“œ ์ƒ์„ฑ

๐Ÿšฉ

๊ฐ‘์ž๊ธฐ?!

  • ์˜ค๋Š˜ ๊ฐ‘์ž๊ธฐ ๋‹ค๋ฉดํ‰๊ฐ€๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค.
    • ๊ธฐ์ดˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚˜๊ณ  ํ•  ์ค„ ์•Œ์•˜๋Š”๋ฐ ํŒ€์›๋ณ„๋กœ ํ‰๊ฐ€ํ•  ๊ฒƒ๋„ ์—†๊ณ  ๋งŽ์ด ๋‹นํ™ฉ์Šค๋Ÿฌ์›Œ ๋ฏธ๋‹ˆํ”„๋กœ์ ํŠธ ๋๋‚˜๊ณ  ํ–ˆ๋˜ ๋‹ค๋ฉดํ‰๊ฐ€์™€๋Š” ์–‘์ ์œผ๋กœ๋„ ์งˆ์ ์œผ๋กœ๋„ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ๋‚ด์šฉ์„ ์ œ์ถœํ•ด์•ผ ํ–ˆ๋‹ค.
  • ๋‚ด์ผ ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘์ด๋‹ค!!
    • ํ”„๋กœ์ ํŠธ ํ•˜๋ฃจ ์ „์ธ ์˜ค๋Š˜ ํŠน๊ฐ•์œผ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ๋“ค์„ ๋ดค๋Š”๋ฐ ์ฃฝ์–ด๋„ ๋ชปํ•  ๊ฒƒ ๊ฐ™์ง„ ์•Š์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ฐฐ์šธ ์‹œ๊ฐ„์ด ๋งŽ์•˜๋Š”๋ฐ ์ œ์ผ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š” ๊ฑธ ์ด์ œ์•ผ ์•Œ๋ ค์ค€ ๊ฒƒ ๊ฐ™์•„์„œ ๋งŽ์ด ์•„์‰ฝ๋‹ค.
    • ์ด๋ฒˆ์—” ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค ๋‹ค ์ •๋ฆฌํ•˜๊ณ  ๋ถ„๋‹ดํ•  ๊ฑฐ ํ•˜๊ณ  Git ์ž˜ ์‚ฌ์šฉํ•ด๋ณด์ž!! ํŒ€์›๋“ค์ด ๋‹ค ์ข‹์•„์„œ ์ž˜ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค!!
profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€