๐Ÿง 2023๋…„ 10์›” ํšŒ๊ณ 

@Troy ยท October 31, 2023 ยท 26 min read

10์›”์€ 9์›”๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์Šค์ฟผ๋“œ ์—…๋ฌด๋ณด๋‹ค๋Š” ์ฑ•ํ„ฐ ์—…๋ฌด์— ์ฃผ๋œ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋˜ ํ•œ๋‹ฌ์ด์—ˆ์ง€๋งŒ, ๋ณด๋‹ค ๊ธฐ์ˆ ์ ์œผ๋กœ ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์„ฑ๋Šฅ ์ธก์ •์„ ์œ„ํ•œ ์œ ํ‹ธ์„ ๊ตฌํ˜„ํ•ด๊ธฐ๋„ ํ•˜๊ณ , ์ธก์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ๋” ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…ํ•ด ์ฃผ์š” ๋„๋ฉ”์ธ์„ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…์— ์ฐธ์—ฌํ–ˆ๋‹ค. ์—…๋ฌด ์™ธ์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๊ฐ€์žฅ ํฐ ํ–‰์‚ฌ์ธ FECONF์— ์— ๋ฒ„์„œ๋”๋กœ ์ฐธ์—ฌํ•˜๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ง€๋‚œ ํ•œ๋‹ฌ๊ณผ๋Š” ๋˜ ๋‹ค๋ฅธ ํ•œ๋‹ฌ์„ ๋ณด๋‚ธ 10์›”์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ คํ•œ๋‹ค.

๐Ÿ˜๋“œ๋””์–ด ์ฐธ์—ฌํ•ด๋ณธ ์ปจํผ๋Ÿฐ์Šค, FEConf

10์›” 21์ผ ๊ตญ๋‚ด ์ตœ๋Œ€ Front-end ์ปจํผ๋Ÿฐ์Šค์ธ FEConf์— ์ˆจ๊ณ ์˜ ์— ๋ฒ„์„œ๋”๋กœ์จ ์ฐธ์—ฌํ–ˆ๋‹ค. ๋‚˜๋Š” ๋ชจ๋ฐ”์ผ ์—”์ง€๋‹ˆ์–ด์ด์ง€๋งŒ ๊ธฐ์ˆ  ์Šคํƒ์œผ๋กœ React-Native์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์— ๋ฒ„์„œ๋”๋กœ์จ ํ–‰์‚ฌ๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ ๋ถ€์Šค์— ์˜ค์‹ค ๋ถ„๋“ค์„ ์œ„ํ•œ ๊ตฟ์ฆˆ๋“ค์— ๋Œ€ํ•œ ์•„์ด๋””์–ด ํšŒ์˜์— ์ฐธ์—ฌํ•˜๊ณ , ๋‚˜๋Š” ์ฑ„์šฉ๊ฒฝํ—˜์ด ์—†์–ด์„œ ์ฐธ์—ฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ํ”„๋ก ํŠธ์—”๋“œ ์ฑ•ํ„ฐ๋ถ„๋“ค๊ณผ ์›น ๊ฒฝ๋ ฅ์ด ์žˆ์œผ์‹  ๋ชจ๋ฐ”์ผ ์—”์ง€๋‹ˆ์–ด ๋ถ„๋“ค์€ ์‚ฌ์ „์— ์ „๋‹ฌ๋ฐ›์€ ์ด๋ ฅ์„œ๋“ค์— ๋Œ€ํ•œ ์ฝ”์นญ์„ ์œ„ํ•œ ์ค€๋น„ ๋“ฑ ์ˆจ๊ณ ๋ฅผ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด ์ค€๋น„๋ฅผ ํ–ˆ๋‹ค. (๊ทธ๋ž˜์„œ ์‚ฌ์‹ค ๋‚ด๊ฐ€ ํ•œ ์ผ์€... ํ˜„์žฅ์—์„œ ํ™๋ณด๊ฐ€ ์ฃผ๋œ ์ผ์ด์—ˆ๋‹ค.)

์— ๋ฒ„์„œ๋”๋กœ ์ฐธ์—ฌํ–ˆ์ง€๋งŒ ํƒ€์ž„๋ณ„๋กœ ๋‚˜๋ˆ ์„œ ์ผ์„ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚จ๋Š” ์‹œ๊ฐ„๋“ค์— ๋‹ค์–‘ํ•œ ์„ธ์…˜๋“ค์„ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ABC๋กœ ๋‚˜๋‰œ ๊ณต๊ฐ„์—์„œ ๊ฐ๊ฐ์˜ ์„ธ์…˜์ด ๋”ฐ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ „๋ถ€๋ฅผ ๋“ค์„ ์ˆ˜๋Š” ์—†์–ด ๋‚ด๊ฐ€ ๊ด€์‹ฌ์žˆ๋Š” ์ฃผ์ œ๋“ค์— ๋Œ€ํ•œ ์„ธ์…˜๋“ค์„ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‚ด๊ฐ€ ๋“ค์—ˆ๋˜ ์„ธ์…˜์€ ํ† ์Šค์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค์ด ์ผํ•˜๋Š” ๋ฐฉ์‹์„ ์„ค๋ช…ํ•ด์ฃผ์‹  ํ† ์Šค ํ›„์›์‚ฌ ์„ธ์…˜, ๋ฐ๋ธŒ ์‹œ์Šคํ„ฐ์ฆˆ ๋ถ„๊ป˜์„œ ๋ฐœํ‘œํ•ด์ฃผ์‹  use ํ›…์ด ๋ฐ”๊ฟ€ ๋ฆฌ์•กํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋ฏธ๋ž˜ ๋ง›๋ณด๊ธฐ, ์ˆจ๊ณ ๋ฅผ ๋Œ€ํ‘œํ•ด์„œ ๋ฐœํ‘œํ•ด์ฃผ์‹  ํ™€๋ž€๋“œ์˜ vue์—์„œ Next JS๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ธ์…˜, ๊ทธ๋ฆฌ๊ณ  RN ๊ฐœ๋ฐœ์ž๋กœ์จ ๊ฐ€์žฅ ๊ธฐ๋Œ€ํ–ˆ์—ˆ๋˜ ํ† ์Šค์˜ React Native, Metro๋ฅผ ๋„˜์–ด์„œ ์„ธ์…˜๊นŒ์ง€ ์ด 4๊ฐ€์ง€ ์„ธ์…˜์— ์ฐธ์—ฌํ•ด์„œ ๋“ค์—ˆ๊ณ , ๋งˆ์ง€๋ง‰ ํƒ€์ž„์—๋Š” ์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ€ ์ค€๋น„ํ•œ ์ด๋ ฅ์„œ ์„ธ์…˜์—์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค๊ณผ ๋„คํŠธ์›Œํ‚นํ•˜๋Š” ์‹œ๊ฐ„์— ์ฐธ์—ฌํ–ˆ๋‹ค.

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

useํ›…์ด ๋ฐ”๊ฟ€ ๋ฆฌ์•กํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๋ฏธ๋ž˜๋Š” ํ˜„์žฌ ๋ฆฌ์•กํŠธ์—์„œ ์‹คํ—˜๋‹จ๊ณ„์— ์žˆ๋Š” use ํ›…์— ๋Œ€ํ•ด ๋ฐœํ‘œํ•ด์ฃผ์…จ๋‹ค. use ํ›…์€ context๋‚˜ promise๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ๊ธฐ์กด hook๋“ค๊ณผ ๋‹ฌ๋ฆฌ ์กฐ๊ฑด๋ถ€๋กœ ํ˜ธ์ถœ๋„ ๊ฐ€๋Šฅํ•œ ํŠน์ง•์ด ์žˆ์—ˆ๋‹ค. RN๊ณผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด์„œ ๊ด€์‹ฌ์ด ๋งŽ์€ ๋‚˜์—๊ฒŒ ๋น„๋™๊ธฐ๋ฅผ ์ž˜ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‚˜๋ฟ๋งŒ ์ด ์•„๋‹ˆ๋ผ ๋งŽ์€ ๋ถ„๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ๋ผ๋Š” ์ ๊ณผ ๋ฆฌ์•กํŠธ์—์„œ ์‹œ๋„ํ•˜๊ณ  ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•๋“ค์—๋„ ๋” ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋˜ ์„ธ์…˜์ด์—ˆ๋‹ค.

[use ํ›…์— ๋Œ€ํ•œ ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ ์„ค๋ช…]

usehook
usehook

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

ํ† ์Šค์˜ ๋ฐœํ‘œ ์„ธ์…˜์€ ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ณผ์ •๊ณผ RN์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ค‘์ธ metro ๋ฒˆ๋“ค๋Ÿฌ ๋Œ€์‹  esBuild๋ฅผ ์ด์šฉํ•จ์œผ๋กœ์จ ๋นŒ๋“œ์‹œ๊ฐ„ ๋‹จ์ถ•๊ณผ, ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ค„์ธ ๊ณผ์ •์„ ๋‹ด๊ณ  ์žˆ์—ˆ๋‹ค. RN ๊ฐœ๋ฐœ์ž๋กœ์จ ์šฐ๋ฆฌ ํŒ€ ๋‚ด์—์„œ๋„ ๋งŽ์€ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ฃผ์ œ์˜€๊ณ , ํŒ€์›๋ถ„๋“ค์ด ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ์ „ํ™˜ํ•˜๊ธฐ์— ์•„์ง ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์–ด์„œ ์ด๋ฒˆ ๋ฐœํ‘œ๋กœ ์šฐ๋ฆฌ ์ œํ’ˆ์—๋„ ์ ์šฉํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ๋œ ๋‚ด์šฉ์€ ๋ฒˆ๋“ค๋Ÿฌ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ง€์‹์„ ์ „๋‹ฌํ•˜๋Š” ๋‚ด์šฉ์ด์—ˆ๊ณ , ์‹ค์ œ metro์—์„œ ์–ด๋–ป๊ฒŒ esBuild ๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ๋งŽ์•„ ์•„์‰ฌ์› ๋‹ค. ์ดํ›„ ํŒ€์›์ค‘ ํ•œ๋ถ„์ด ์—ฌ์ญค๋ดค์„ ๋•Œ esBuild๋Š” HMR์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฐœ๋ฐœ์‹œ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜์ด ๋˜์ง€์•Š๋Š” ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ† ์ŠคํŒ€์—๋„ ํ˜„์žฌ๋Š” PROD๋ฅผ ์œ„ํ•ด์„œ ์ด์šฉ์ค‘์ด๋ผ๋Š” ๋‹ต๋ณ€์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฐœํ‘œ๋‚ด์šฉ์„ ์šฐ๋ฆฌ ์ œํ’ˆ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ๋ชจํ˜ธํ–ˆ๋˜ ๋ฒˆ๋“ค๋Ÿฌ๋ผ๋Š” ๊ฒƒ์ด ์–ด๋–ค ์ผ์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์‹œ๊ฐ„์ด์—ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์šฐ๋ฆฌ ํšŒ์‚ฌ์˜ ์ด๋ ฅ์„œ ์ฝ”์นญ ์„ธ์…˜์—๋Š”, ์ข‹์€ ์ด๋ ฅ์„œ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ฐ ํ…Œ์ด๋ธ”๋ณ„๋กœ ๋„คํŠธ์›Œํ‚น ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. ๋‚ด๊ฐ€ ์ฐธ์—ฌํ•œ ํ…Œ์ด๋ธ”์—๋Š” ์„ธ๋ถ„์ด ๊ณ„์…จ๊ณ , ๊ฐ๊ฐ ํšŒ์‚ฌ๋ฅผ ๋‹ค๋‹ˆ๊ณ  ๊ณ„์‹œ๋Š” ๋ถ„๋“ค๋กœ ์ด๋ ฅ์„œ ์ฝ”์นญ ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ๋„ ํ•˜๊ณ , ํšŒ์‚ฌ์—์„œ ์–ด๋–ป๊ฒŒ ์ผํ•˜๊ณ  ๊ณ„์‹ ์ง€์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. ํšŒ์‚ฌ-์ง‘๋งŒ ๋ฐ˜๋ณตํ•˜๋Š” ๋‚˜์—๊ฒŒ ๋‹ค๋ฅธ ํšŒ์‚ฌ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์˜ ๊ฒฝํ—˜์„ ๋“ค์„ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ธฐํšŒ์˜€๋‹ค.

๋“ค์„์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์„ธ์…˜์„ ๋“ฃ๊ณ  ์ค‘๊ฐ„์ค‘๊ฐ„ ํ™๋ณด๋„ ํ•˜๋ฉด์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ผํ•˜๊ณ  ์žˆ๊ณ , ๋‹ค์–‘ํ•œ ํšŒ์‚ฌ๋“ค์ด ์ •๋ง ์„ธ์ƒ์˜ ๋งŽ์€ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์• ์“ฐ๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ž‘๋…„๋งŒํ•ด๋„ ์ง€๋ง์ƒ์—์„œ ์ผ์„ ๋งŽ์ด ํ•˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ด์ œ๋Š” ํšŒ์‚ฌ ์— ๋ฒ„์„œ๋”๋กœ, ๊ฐœ๋ฐœ์ž๋กœ ๊ฐ™์ด ์žˆ๋‹ค๋Š” ๊ฒŒ ์ข‹๊ณ  ๋งŽ์ด ์ž๊ทน์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค.

[ํšŒ์‚ฌ ๊ตฟ์ฆˆ์˜€๋˜ ์ˆจ์‹์ด ์Šคํ‹ฐ์ปค]

๊ตฟ์ฆˆ
๊ตฟ์ฆˆ

[๋ญ ๋“ฃ๊ณ  ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ํ˜ผ์ž ์‹ฌ๊ฐํ•˜๊ฒŒ ๋“ฃ๋‹ค๊ฐ€ ์ฐํžŒ ๋‚˜]

๐Ÿคฉ Firebase Peformance๋ฅผ ์ด์šฉํ•ด ๊ฒฌ์ ๋ฐœ์†ก์„ ๊ฐœ์„ ํ•ด๋ณด์ž

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

๊ทธ๋Ÿฌ๋ฉด ๊ธฐ์กด์—๋Š” ์–ด๋• ์„๊นŒ? ๐Ÿค”

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

๋‹ค์‹œ ๋ณด๊ฒŒ๋œ ๊ฒฌ์ ๋ฐœ์†ก ํ™”๋ฉด์˜ ์ฝ”๋“œ๋“ค ์ค‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋ˆˆ์— ๋ณด์˜€๋˜ ์ ์€ ๊ฒฌ์  ๋ฐœ์†ก API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „ ๊ฒฌ์ ๋ฐœ์†ก ๊ฐ€๋Šฅ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค. ๋‹ค๋ฅธ useCase๋“ค์— ๋Œ€ํ•œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ ํ™•์ธํ•ด๋ณด๋‹ˆ ๋˜‘๊ฐ™์€ API๋“ค์— ๋Œ€ํ•ด์„œ ์ค‘๋ณตํ•ด์„œ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ์ค‘๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋Š” API์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ๋ณด๋ฉด ๊ฒฌ์ ๋ฐœ์†ก ์‹œ๊ฐ„์ด ์ค„์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์ฒซ๋ฒˆ์งธ ๋ชฉํ‘œ๋กœ ์‚ผ์•„ ์ผ๊ฐ์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

[๊ฐ„๋žตํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ธ ๊ธฐ์กด ๊ฒฌ์ ๋ฐœ์†ก ์ฝ”๋“œ]

function use_๊ฒฌ์ ๋ฐœ์†ก(...arg){
  try{
    if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCase1()===false){
      return 
    }
  	...

   if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCaseN()==false){
      return 
   }
    
    const ๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ=await ๊ฒฌ์ ๋ฐœ์†ก(...)
    
    await ๊ฒฌ์ ๋ฐœ์†ก_ํ›„์ž‘์—…(๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ)
    
  } catch(e){
      if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌ1()
      }
      ...
      if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌN()
      }
  }
}

์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์ž ๐Ÿคฅ

๋ฐ”๋กœ ๊ฐœ์„  ์ž‘์—…์— ๋“ค์–ด๊ฐ€๊ธฐ ์œ ์ € ๋””๋ฐ”์ด์Šค์—์„œ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ before/after์— ๋Œ€ํ•ด ๊ธฐ๋กํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ค ํˆด์„ ์ด์šฉํ•ด์„œ ์‹œ๊ฐ„์„ ์ธก์ •ํ• ์ง€๋ฅผ ๊ณ ๋ฏผํ–ˆ์„ ๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด๋ณด์˜€๋‹ค. ABํ…Œ์ŠคํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š”๋ฐ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” Amplitude๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋งˆ์ง€๋ง‰์œผ๋กœ ์ œํ’ˆ์—์„œ FPS์™€ TTI๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋˜ Firebase Performance๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ Amplitude์˜ ๋ฐ์ดํ„ฐ๋Š” ํ…ŒํฌํŒ€์—์„œ๋งŒ ๋ณด๋Š” ์ง€ํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ”„๋กœ๋•ํŠธ ํŒ€๊ณผ ํ•จ๊ป˜ ๋ณด๋Š” ์ง€ํ‘œ์ด๋‹ค๋ณด๋‹ˆ, ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ๊ฒƒ์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ๊ณ , ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๋ชจ๋ฐ”์ผ ์ฑ•ํ„ฐ only๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘๋ฒˆ์งธ ํˆด์„ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Firebase Performance๋Š” ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ์—์„œ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ React-native-firebase๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ์กด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์™€ ios ํ”„๋กœ์ ํŠธ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๊ณ  ์žˆ์—ˆ๊ณ , ๊ธฐ์กด ํ™”๋ฉด ๋ Œ๋”๋ง ์†๋„๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•˜๋˜ ์œ ํ‹ธ๊ณผ React-native-firebase docs๋ฅผ ์ฐธ๊ณ ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ คํ–ˆ๋‹ค.

[์ฒ˜์Œ ๊ตฌํ˜„ํ•œ ๊ฒฌ์  ๋ฐœ์†ก ์ธก์ • util]

import perf from '@react-native-firebase/perf';

const trace = perf().newTrace('๊ฒฌ์ ๋ฐœ์†ก');

const startTrace = async () => {
    await trace.start();
    trace.putMetric('start', new Date().getTime());
};

const stopTrace = async () => {
    trace.removeMetric('start');
    await trace.stop();
};

const addCheckPoint = async (name: string) => {
    const startTime = trace.getMetric('start');
    trace.putMetric(name, new Date().getTime() - startTime);
};

export const ๊ฒฌ์ ๋ฐœ์†กTrace = {
    start: startTrace,
    stop: stopTrace,
    addCheckPoint,
};

์œ„ ์ฝ”๋“œ๋Š” ๊ธฐ์กด ์œ ํ‹ธ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ค‘๊ฐ„์ง€์ ์„ ๊ธฐ๋กํ•˜๋Š” addCheckPointํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ค‘๊ฐ„ ์ง€์ ์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‹œ์ž‘ํ•œ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ–ˆ๊ณ , ์ค‘๊ฐ„์ง€์ ์— ๋Œ€ํ•œ ๊ธฐ๋ก๋„ ํ•จ๊ป˜ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด์„œ Firebase Performance๊ฐ€ ๊ฐ€์ง€๋Š” Attribute์™€ Metric ๋‘๊ฐ€์ง€ metadata์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. attribute๋Š” ์‚ฌ์šฉ๊ธฐ๊ธฐ, OS์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜์žˆ๊ณ  metrics์€ ์‹œ๊ฐ„์ด๋‚˜ ์ˆซ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š”๋ฐ ์šฉ์ดํ•ด๋ณด์˜€๋‹ค. attribute๋ณด๋‹ค metric์ด ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํƒญ์œผ๋กœ ๋ฐ”๋กœ ๋ฐ”๋กœ ๋ณผ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์–ด metric์— ์ค‘๊ฐ„์ง€์ ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

[์„ฑ๋Šฅ ์ธก์ •์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒฌ์ ๋ฐœ์†ก ์ฝ”๋“œ]

function use_๊ฒฌ์ ๋ฐœ์†ก(...arg){
  try{
    await ๊ฒฌ์ ๋ฐœ์†กTrace.start();
    if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCase1()===false){
      return 
    }
  	...

   	if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCaseN()===false){
      	return 
   	}
    
   	await ๊ฒฌ์ ๋ฐœ์†กTrace.addCheckPoint('๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ');
    
    const ๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ=await ๊ฒฌ์ ๋ฐœ์†ก(...)
    
    await ๊ฒฌ์ ๋ฐœ์†ก_ํ›„์ž‘์—…(๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ)
    
    await ๊ฒฌ์ ๋ฐœ์†กTrace.stop();
    
  } catch(e){
     	if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌ1()
      }
      ...
      if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌN()
      }
  }
}

๊ตฌํ˜„ํ•œ ์œ ํ‹ธ์€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ๋ฌธ์ œ์ƒํ™ฉ์€ ๋‘๊ฐ€์ง€๋กœ ํ•ญ์ƒ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋งŒ ์Œ“์ด๊ฒŒ ๋œ๋‹ค๋Š” ์ ๊ณผ ์ธก์ •์‹œ๋„ ๋„์ค‘์— ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์— stop์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„ ๋‹ค์‹œ ์‹œ๋„ํ–ˆ์„ ๋•Œ ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€์˜ ์‹œ๊ฐ„์ด ์ธก์ •๋œ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋œ ์Œ“์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ , ๋‘๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋’ค์ฃฝ๋ฐ•์ฃฝ์ด ๋˜์–ด ์‹ ๋ขฐ๋„๋ฅผ ๋–จ์–ด๋œจ๋ ธ๋‹ค.

๋‘๊ฐ€์ง€ ๋ฌธ์ œ์ ์˜ ์›์ธ์„ ์ฐพ๊ธฐ์œ„ํ•ด์„œ RN Debugger์˜ ๋กœ๊ทธ๋กœ ์ฐพ์•„๋ณด๋ คํ–ˆ์ง€๋งŒ Firebase Performance์™€ ๊ด€๋ จ๋œ ๋กœ๊ทธ๋ฅผ ๋ณผ์ˆ˜ ์—†์–ด ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์ฐพ์•„๋ณด๋‹ค ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์˜ LogCat์„ ์ด์šฉํ•ด ์•ˆ๋“œ๋กœ์ด๋“œ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” Firebase Performance ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ–ˆ๋‹ค.

LogCat์œผ๋กœ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ, ์ฒซ๋ฒˆ์งธ ๊ธฐ๋ก์— ๋Œ€ํ•œ ๋กœ๊ทธ๋Š” ์ •์ƒ๋™์ž‘ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋‘๋ฒˆ์งธ ๊ฒฌ์ ๋ฐœ์†ก ์‹œ๋„์‹œ์—๋Š” ์•„๋ฌด ๊ธฐ๋ก์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ์‹œ๋„ํ•˜๋ฉด์„œ Trace๋ฐ์ดํ„ฐ์˜ ํŠน์ง•์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

  • ํ•œ๋ฒˆ ์‹œ์ž‘๋œ Trace๋Š” stop์„ ํ• ๋•Œ๊นŒ์ง€ ๊ธฐ๋ก์ด ๋œ๋‹ค.
  • stop๋œ Trace๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ–ˆ๋˜ ์œ ํ‹ธ์€ ํ•˜๋‚˜์˜ Trace์— ๊ณ„์†ํ•ด์„œ ๊ธฐ๋กํ•˜๋ คํ•˜๋‹ค๋ณด๋‹ˆ ์ฒซ๋ฒˆ์งธ ์„ฑ๊ณตํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ธฐ๋ก์ด ๋˜๊ณ , ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ณ„์† ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ๊ธฐ๋ก์ด ๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๊ณตํ•  ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์ธก์ •๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋””๋ฒ„๊น…์„ ํ•˜๊ณ ๋‚˜์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ–ˆ๋Š”๋ฐ ์ธก์ •์‹œ์ž‘์‹œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Trace๋กœ ์ธก์ •์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ ๊ตฌ์กฐ์ƒ์—๋Š” ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Trace๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ let์ด์šฉํ•ด์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Trace๋ฅผ ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ์—ˆ์ง€๋งŒ, Firebase Performance ์ธก์ •๊ณผ ๊ด€๋ จ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒŒ ์ข€ ๋” ์‘์ง‘๋„๋ฅผ ๋†’์ธ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

[์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•œ ์„ฑ๋Šฅ์ธก์ • ์œ ํ‹ธ]

export class ๊ฒฌ์ ๋ฐœ์†กTrace {
    constructor(private trace: null | FirebasePerformanceTypes.Trace = null, private startTime = 0) {}
    async start() {
        if (this.trace === null) {
            this.trace = perf().newTrace('๊ฒฌ์ ๋ฐœ์†ก');
        }
        await this.trace.start();
        this.startTime = new Date().getTime();
    }

    async stop() {
        if (this.trace === null) {
            return;
        }
        this.trace.putAttribute('result', value);
        await this.trace.stop();
    }

    addCheckPoint(name: string) {
        if (this.trace === null) {
            return;
        }
        this.trace.putMetric(name, new Date().getTime() - this.startTime);
    }
}

export const ๊ฒฌ์ ๋ฐœ์†กTracker = ๊ฒฌ์ ๋ฐœ์†กTrace.getInstance();

์œ„์˜ ์ฝ”๋“œ๋Š” ํด๋ž˜์Šค๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•œ ์„ฑ๋Šฅ์ธก์ • ์œ ํ‹ธ์ด๋‹ค. instance์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•œ ์Šค์ฝ”ํ”„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๊ณ„์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์–ด, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์„ ์ด์šฉํ•ด ํ•˜๋‚˜์˜ instance๋ฅผ exportํ•ด์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์•ž์„œ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด start์‹œ ์ƒˆ๋กœ์šด Trace๋ฅผ ํ• ๋‹นํ•˜๊ณ , stop์‹œ์—๋Š” Trace๋ฅผ ์‚ญ์ œํ•ด ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค. ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์ดํ›„ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ ์ข€ ๋” ๋ฒ”์šฉ์„ฑ ๋†’์€ ์œ ํ‹ธ๋กœ ๊ฐœ์„ ๋˜์–ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด์ œ ์ง„์งœ ๊ฐœ์„  ์ž‘์—…์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ ๐Ÿ˜Ž

์ธก์ •์ž‘์—…์„ ์„ ๋ฐฐํฌ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๋Š” ๋™์•ˆ์— ๊ฐœ์„ ์ž‘์—…์— ๋“ค์–ด๊ฐ”๋‹ค. ๊ฐœ์„ ์ž‘์—… ๋™์•ˆ์— ๊ฒฌ์ ๋ฐœ์†ก์ด ์‹คํŒจํ•˜๋Š” ๋ชจ๋“  ์œ ์Šค์ผ€์ด์Šค๋“ค์„ ํ™•์ธํ•˜๋ฉด์„œ ์‹ค์ œ๋กœ ์ค‘๋ณต๋œ API๋“ค์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฒฌ์ ๋ฐœ์†ก์ด๋ผ๋Š” ์•„์ฃผ ํ•ต์‹ฌ์ ์ธ ๋„๋ฉ”์ธ์— ์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๋ฉด์„œ ์ƒ๊ธด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ •์ฑ…๋“ค์ด useCase๋กœ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŒŒ์ผ๋กœ ๋‚˜๋‰˜์–ด ๋“ค์–ด๊ฐ€๋‹ค๋ณด๋‹ˆ ๋ฐ˜๋ณต๋˜๋Š” API๋ผ๋Š” ์ ์„ ์ฒดํฌ๋˜๊ธฐ ์–ด๋ ค์› ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ useCase๋“ค์— ํ•„์š”ํ•œ API๋“ค์„ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด์„œ ๊ฐ useCase ํ•จ์ˆ˜์— param์œผ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ค‘๋ณต๋œ ํ˜ธ์ถœ๋ถ€๋ฅผ ์ œ๊ฑฐํ–ˆ๋‹ค. ๋˜ํ•œ ํ•„์š”ํ•œ API๋“ค์€ Promise.All()์„ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ํ˜ธ์ถœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์‘๋‹ต์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผฐ๋‹ค.

[๊ฐœ์„ ํ•œ ๊ฒฌ์ ๋ฐœ์†ก ์ฝ”๋“œ]

function use_๊ฒฌ์ ๋ฐœ์†ก(...arg){
  try{
    const [ํ•„์š”์ •๋ณด1,...,ํ•„์š”์ •๋ณดN]=await Promise.all([...ํ•„์š”์ •๋ณด_์กฐํšŒ_API๋“ค])
    
    await ๊ฒฌ์ ๋ฐœ์†กTrace.start();
    if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCase1(ํ•„์š”์ •๋ณด)===false){
      return 
    }
  	...

   	if(๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ_useCaseN(ํ•„์š”์ •๋ณด)===false){
      	return 
   	}
    
   	๊ฒฌ์ ๋ฐœ์†กTrace.addCheckPoint(, '๊ฒฌ์ ๋ฐœ์†ก_๊ฐ€๋Šฅ์—ฌ๋ถ€_์ฒดํฌ');

    
    const ๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ= await ๊ฒฌ์ ๋ฐœ์†ก(...)
    
    await ๊ฒฌ์ ๋ฐœ์†ก_ํ›„์ž‘์—…(๊ฒฌ์ ๋ฐœ์†ก๊ฒฐ๊ณผ)
    
    await ๊ฒฌ์ ๋ฐœ์†กTrace.stop();
    
  } catch(e){
      if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์Šค1์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌ1()
      }
      ...
      if(e instanceof ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN){
        ๊ฒฌ์ ๋ฐœ์†ก์‹คํŒจ_์—๋Ÿฌ์ผ€์ด์ŠคN์—๋Œ€ํ•œ_์˜ˆ์™ธ์ฒ˜๋ฆฌN()
      }
  }
}

์ด๋ ‡๊ฒŒ ๋‹จ์ถ•ํ•œ ๊ฒฐ๊ณผ ํ˜„์žฌ ๊ธฐ์กด 90ํ”„๋กœ ์œ ์ €๊ฐ€ ๊ฒช๊ณ  ์žˆ๋˜ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • ๊ฒฌ์ ๋ฐœ์†ก๊ฐ€๋Šฅ์—ฌ๋ถ€ ์ฒดํฌ: 4.5์ดˆ -> 0.763์ดˆ (83%)
  • ์ „์ฒด ๊ฒฌ์ ๋ฐœ์†ก ์‹œ๊ฐ„: 7.11์ดˆ -> 2.98์ดˆ (58%)

๊ฐœ์„  ์ž‘์—…์ž์ฒด๋ฅผ ๋ดค์„ ๋•Œ ์ฝ”๋“œ์ ์œผ๋กœ ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๊ฐœ์„ ํ•  ๋ถ€๋ถ„์„ ์ฐพ๊ณ , ์ „ํ›„ ๋น„๊ต๋ฅผ ์œ„ํ•œ ์ธก์ • ์œ ํ‹ธ์„ ๋งŒ๋“ค์–ด๋ณด๊ณ , ๋งŒ๋“œ๋Š” ๊ณผ์ •์—์„œ ์ƒ๊ธด ๋ฌธ์ œ๋ฅผ ์œ„ํ•ด์„œ ๋„ค์ดํ‹ฐ๋ธŒ์˜์—ญ์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์˜๋ฏธ์žˆ๋Š” ๊ฒฐ๊ณผ๊นŒ์ง€ ๋ณผ ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ์ž๋กœ์จ ๋ฟŒ๋“ฏํ•˜๊ณ  ์˜๋ฏธ์žˆ๋Š” ์ผ๊ฐ์ด์—ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

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

@Troy
๋งค์ผ์˜ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฐœ๋ฐœ์ผ์ง€์ž…๋‹ˆ๋‹ค.