Frontend ๊ฐœ๋ฐœ์ž - hyo.loui

Project : MZL - ๋กœ๊ทธ์•„์›ƒ, ๋งˆ์ดํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์—๋Ÿฌํ•ด๊ฒฐ ๋ณธ๋ฌธ

Project

Project : MZL - ๋กœ๊ทธ์•„์›ƒ, ๋งˆ์ดํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์—๋Ÿฌํ•ด๊ฒฐ

hyo.loui 2023. 1. 11. 20:41

๐ŸŽฏ๋ชฉ์  :

๋งˆ์ดํŽ˜์ด์ง€์— ๊ตฌํ˜„ํ•œ ๋กœ์ง๊ณผ

authentication API ๋ณต์Šต,

 

๐Ÿคข ์˜ค๋ฅ˜ ํ•ด๊ฒฐ :

  • ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋งˆ์ดํŽ˜์ด์ง€, ๊ฒŒ์‹œ๊ธ€์“ฐ๊ธฐ component ์ด๋™ ์‹œ ์—๋Ÿฌ (useEffect ์™€ useFocusEffect ์—์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ํ•ด๊ฒฐ)

1. ๋‹‰๋„ค์ž„ ์ˆ˜์ •

UI ๋ถ€๋ถ„์—์„œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ

์ˆ˜์ • ๋ฒ„ํŠผ์ด onPress๋˜์–ด onPressUpdate()ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰์ด ๋˜๋ฉด

setState๊ฐ€ ๋˜์–ด onEdit์ด๋ผ๋Š” state๋Š” ๋ถˆ๋ฆฌ์–ธํƒ€์ž…์ด๋ฉฐ ํ† ๊ธ€(true or false)์ด ๋œ๋‹ค!

 

์ดํ›„ onEdit์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ false๊ฐ€ ๋œ๋‹ค๋ฉด

๊ธฐ์กด์— ์žˆ๋Š” ๋‹‰๋„ค์ž„์„ ๊ฐ์‹ผ ํƒœ๊ทธ๊ฐ€ TextInput์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ 

์ˆ˜์ •๋ฒ„ํŠผ๋„ ์™„๋ฃŒ๋ฒ„ํŠผ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค!

 

์™„๋ฃŒ๋ฒ„ํŠผ์ด ๊ฐ€์ง„ ํ•จ์ˆ˜๋Š” onSubmitEdit()์œผ๋กœ

updateProfile API๋ฅผ ์‹คํ–‰ํ•ด ๋กœ๊ทธ์ธ๋˜์–ด์žˆ๋Š” ์œ ์ €์˜ displayName์„

TextInput์—์„œ ๋ฐ›์•„์˜จ state์ธ editText๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค!

TextInput์—์„œ๋Š” value๋กœ ๊ธฐ์กด๊ฐ’์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด state์—๋Š” 

displayName์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค

 

ํ•ด๋‹น ๊ณผ์ •์—์„œ CRUD ์˜ update๋ถ€๋ถ„๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅธ์ ์ด ์—†์–ด

๋งŽ์ด ๊ฒฝํ—˜ํ–ˆ๋˜ ํ„ฐ๋ผ, ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


2. ๋กœ๊ทธ์•„์›ƒ 

์œ„์— ๋‹‰๋„ค์ž„ ์ˆ˜์ •์˜ ๋กœ์ง์— ๋น„ํ•ด

๋กœ๊ทธ์•„์›ƒ์€ firebase API๊ฐ€ ์•„์ฃผ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค

 

auth๋ผ๋Š” ๋ณ€์ˆ˜๋Š” firebase ์—์„œ getAuthํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ export >> import ํ•˜์—ฌ ๊ฐ€์ ธ์™”๊ณ ,

signOut() API ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋ฐ”๋กœ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋กœ ์ „ํ™˜๋œ๋‹ค

 

์ดํ›„ reset()ํ•จ์ˆ˜๋กœ Tabs์˜ Home์œผ๋กœ ์ด๋™์‹œ์ผœ์ค€๋‹ค

 

์œ„ ๊ณผ์ •์—์„œ ๋‹ค์‹œํ•œ๋ฒˆ reset์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 


3. ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ์—์„œ ๋งˆ์ดํŽ˜์ด์ง€ ์ ‘๊ทผ

์œ„ ์กฐ๊ฑด๋ฌธ์€

๋…ผ๋ฆฌ ๋ถ€์ •์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜ ์ฐธ์กฐ ๋งํฌ๋ฅผ ๋ณด๋ฉด ์ž์„ธํžˆ ๊ณต๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

auth์˜ currentUser(๋กœ๊ทธ์ธ์ƒํƒœ ์œ ์ €์˜ ์ •๋ณด)๊ฐ€ false์ผ ๊ฒฝ์šฐ,

๋ฐ˜๋Œ€๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ•ด๋‹น ์กฐ๊ฑด๋ฌธ์ด ์‹คํ–‰๋˜๋ฉฐ

 

reset์œผ๋กœ login screen์„ ์œ ๋„ํ–ˆ๋‹ค

 

ํ•ด๋‹น ์ฝ”๋“œ๋กœ ๋…ผ๋ฆฌ๋ถ€์ •์—ฐ์‚ฐ์ž๋ฅผ ๋‹ค์‹œ ๊ณต๋ถ€ํ–ˆ๊ณ ,

return์œผ๋กœ ์ข…๋ฃŒ์‹œ์ผœ์ฃผ์ง€ ์•Š์€ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜ ์•„๋ž˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ์— ์ž‘์„ฑํ–ˆ๋‹ค

 


4. useFocusEffect useCallback

์šฐ๋ฆฌ๊ฐ€ ๊ณต๋ถ€ํ•œ React์™€๋Š” ๋‹ค๋ฅด๊ฒŒ RN์—์„œ๋Š” 

๋งˆ์šดํŠธ์™€ ์–ธ๋งˆ์šดํŠธ์˜ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ

์ƒˆ๋กญ๊ฒŒ ๋žœ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค

 

์‰ฝ๊ฒŒ ๋งํ•ด useEffect๋Š”

 

react == ๊ฐ€์ƒ๋” ๋งˆ์šดํŠธ, ์–ธ๋งˆ์šดํŠธ

react-native == ์Šคํฌ๋ฆฐ(์ปดํฌ๋„ŒํŠธ) ๋ Œ๋”๋ง

 

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€

RN์—์„œ๋Š” useEffect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

1ํšŒ์„ฑ์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ useFocusEffect ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค

useFocusEffect == ์Šคํฌ๋ฆฐ์ด ํฌ์ปค์Šค(ํ™”๋ฉด์— ์žˆ๊ฑฐ๋‚˜ ์—†๊ฑฐ๋‚˜๋ฅผ ๊ฐ์ง€!

์œ„์—์„œ ์„ค๋ช…ํ•œ ์กฐ๊ฑด๋ฌธ์— ๋”ฐ๋ผ Mypage๊ฐ€ ๋ Œ๋”๋ง์ด๋˜๋ฉด ์šฐ์„ 

์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋ถ€ํ„ฐ ๊ฐ์ง€ํ•œ๋‹ค!

 

๋งŒ์•ฝ ์กฐ๊ฑด์— ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฐ”๋กœ ์ฟผ๋ฆฌ์— ์œ ์ €์™€, firebase์˜ DB์ธ firestore์˜
Words๋ผ๋Š” ์ปฌ๋ ‰์…˜์— ์ ‘๊ทผํ•ด where API๋ฅผ ํ†ตํ•ด

์œ ์ €์˜ ์•„์ด๋””์™€, ๋ฐ์ดํ„ฐ์— ์žˆ๋Š” ์•„์ด๋””๋ฅผ ๋Œ€์กฐํ•˜์—ฌ, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜์–ด

 

๋งˆ์ดํŽ˜์ด์ง€์—์„œ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€ ๋ณด๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค!

 

๋˜ return ์œผ๋กœ myPosts()๋ฅผ ์‹คํ–‰ํ•œ ์ด์œ ๋Š”

onSnapshot ํ•จ์ˆ˜๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์† ์ฟผ๋ฆฌ์˜ ๋ณ€๋™์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์—

์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ,

 

Mypage์—์„œ ๋‹ค๋ฅธ screen์œผ๋กœ ์ด๋™ ํ–ˆ์„ ๋•Œ onSnapshot์ด

๊ณ„์† ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋‚จ์•„์žˆ๋‹ค๋ฉด,

๋ฉ”๋ชจ๋ฆฌ๋‚˜ ์›น ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋ฏ€๋กœ return ์„ ์‚ฌ์šฉํ•ด onSnapshot์„ ์ข…๋ฃŒ์‹œ์ผœ ์ฃผ์—ˆ๋‹ค

 

์œ„ ๊ณผ์ •์—์„œ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜๊ณ ,

whereํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์— ์กฐ๊ฑด์„ ๋‹ฌ์•„ filter์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘์•„ ์˜ฌ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋˜ useFocusEffect์™€ useCallback ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ์Œ“์•˜๋‹ค.


+ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ :

 

before - ํ•ด๊ฒฐ ์ „

RN firebase authentication signOut() ํ•จ์ˆ˜ ์‹คํ–‰ ํ›„ ๋งˆ์ดํŽ˜์ด์ง€, ํฌ์ŠคํŠธ ํŽ˜์ด์ง€์— ์ ‘๊ทผ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์—๋Ÿฌ ๋‚ด์šฉ์€

 

Render Error
null is not an object (evaluating
'_firebase.auth.currentUser.displayName')


+ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ :

๋กœ์ง์˜ ์ˆœ์„œ๋ฅผ ์ž˜ ๋”ฐ๋ผ๊ฐ€ ๋ณด๊ฒ ๋‹ค

  1. ๋กœ๊ทธ์•„์›ƒ ์‹คํ–‰
  2. ํ™ˆ ํ™”๋ฉด์œผ๋กœ ์ด๋™
  3. ๋งˆ์ดํŽ˜์ด์ง€ ํด๋ฆญ
  4. useEffectFocus ๊ตฌ๋ฌธ ์‹คํ–‰
  5. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์šฐ์„  ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ๋‚˜์„œ ๋ Œ๋”๋ง์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
    ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ณผ์ •์—์„œ currentUser์˜ ์ •๋ณด๋“ค์ด ์—†๋‹ค๊ณ  ์—๋Ÿฌ ๋ฐœ์ƒ

์›์ธํŒŒ์•… ํ•˜๋Š”๋ฐ ๊นŒ์ง€ ์•ฝ 2-3์‹œ๊ฐ„ ์ด์ƒ ์†Œ์š”๋œ ๊ฒƒ ๊ฐ™๋‹ค.

 

myPosts๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ์ฟผ๋ฆฌ์—์„œ ๋จผ์ € ์„ ์–ธํ•ด๋‘” ๋ณ€์ˆ˜์ธ uid(currentUser.uid)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

ํ•ด๋‹น๋‚ด์šฉ์—์„œ error๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„ ์ ์œผ๋กœ null๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž ์ด์šฉํ•˜์—ฌ

์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ–ˆ์—ˆ์ง€๋งŒ ๊ทผ๋ณธ์  ์›์ธ์ด ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ

์šฐ์„  if ๋ฌธ์œผ๋กœ ๋’ค์— ์žˆ๋Š” ๋กœ์ง์ด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ฐ˜ํ™˜๋˜๊ฒŒ๋” return์„ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ๊ณ ,

useFocusEffect ์˜ ๋‚ด๋ถ€ return์„ ์‚ฌ์šฉํ•ด myPosts๋ฅผ ๋„ฃ์–ด ์Šคํฌ๋ฆฐ์ด ๋ฐ”๋€๋‹ค๋ฉด, ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ฒŒ๋”

๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค!

 


 

 ์ตœ์ข… ์ •๋ฆฌ 

  1. ํšŒ์› ์ •๋ณด๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณด์—ฌ์ฃผ๊ณ , ๋ฐ”๊ฟ”์ฃผ๊ณ , ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„์€ CRUD์™€ api๋งŒ ๋‹ค๋ฅผ ๋ฟ ๋กœ์ง์€ ๊ฑฐ์˜ ํก์‚ฌํ–ˆ๋‹ค
  2. ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜ ์–ด๋– ํ•œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„ return์„ ํ•ด์ฃผ์–ด ์ฝ”๋“œ๋ฅผ ์ข…๋ฃŒํ•ด ์ฃผ์ž
  3. ๋…ผ๋ฆฌ๋ถ€์ •์—ฐ์‚ฐ์ž๋กœ true์™€ false ๋ฐ˜ํ™˜
  4. RN์—์„œ๋Š” useEffect๊ฐ€ 1ํšŒ์„ฑ์ด๋ฏ€๋กœ useFocusEffect์™€ useCallback์„ ์‚ฌ์šฉํ•˜์ž
  5. ์—๋Ÿฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๊ฒƒ ๋ณด๋‹ค ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค!
  6. useFocusEffect ๋‚ด๋ถ€์—์„œ return์œผ๋กœ ์Šคํฌ๋ฆฐ์ด ํฌ์ปค์Šค์•„์›ƒ์ด ๋  ๋•Œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

์ฐธ์กฐ:

https://medium.com/์˜ค๋Š˜์˜-ํ”„๋กœ๊ทธ๋ž˜๋ฐ/์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ-์œ ์šฉํ• -์ˆ˜๋„-์žˆ๋Š”-์—ฐ์‚ฐ์ž๋“ค-๋ชจ์Œ-3450083838fb

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์œ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋Š” ์—ฐ์‚ฐ์ž๋“ค ๋ชจ์Œ

์‹ ๋ฐ•ํ•ด๋ณด์ผ ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ž ๋ช‡ ๊ฐœ๋ฅผ ์ถ”๋ ค๋ณด์•˜๋‹ค.

medium.com

https://velog.io/@chltjdrhd777/RN-useFocusEffect%EC%9D%98-%ED%96%89%EB%8F%99%EC%96%91%EC%8B%9D

 

[RN] useFocusEffect์˜ ํ–‰๋™์–‘์‹

์ตœ๊ทผ React native ์•ฑ ๊ด€๋ จ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋˜ ๋„์ค‘, ํƒญ์˜ ์ด๋™์—์„œ ๋ฏธ์„ธํ•œ ๋™์ž‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์—ˆ๋‹ค.๊ทธ๋Ÿฌ๋˜ ๋„์ค‘, useFocusEffec

velog.io