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 ํ ์ ๋ํ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์ ์ค๋ช ]
์ฐ๋ฆฌ ํ์ฌ ๋ํ๋ก ํ๋๋๊ป์ ์ค๋นํด์ฃผ์ 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์ ํ๋ฌ์ ๋ค๋ฅธ ๊ฐ์ธ ์ฌ์ (์๋น๊ตฐ ๋ฑ)๋ ๋ง์์ง๋ง, ์ฌ๋ฌ๊ฐ์ง ์ ๋ฌด์ ์ฐธ์ฌํ๋ฉด์ ์๋ฏธ์๋ ๊ฒฐ๊ณผ๊น์ง ๋ณผ ์ ์์๋ ํ๋ฌ์ด์๋ค. ์ปจํผ๋ฐ์ค์ ์ฐธ์ฌํด์ ๋๋ฃ๊ฐ ๋ฐํํ๋ ๋ชจ์ต์ ๋ณด๋ฉด์ ๋๋ ๋ด๋ ์ ๋ฐํํ ์ ์์ ๋งํผ ๋ง์ ๊ธฐ์ฌ๋ฅผ ํ๊ณ ์ถ์ ์์ฌ๊ณผ ์ด์ ๋ ๋์ด์ค๋ฅด๊ธฐ๋ ํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด ๋ฌธ์ ์ ๋ถํฐ ๊ฐ์ ๊น์ง ๋ณด๋ฉด์ ์ฌํ๊น์ง ์ค ๊ฐ๋ฐ์๋ก์จ ๋ง์ ๋ฟ๋ฏํจ์ ๋๋ ํ๋ฌ์ด์๋ค. ๊ฐ์ ์์ ๊ณผ์ ์์์ ๋ง์ ๋๋ฃ๋ค๊ณผ ์ด์ผ๊ธฐํ๊ณ ๋ ์ข์ ๋ฐฉ๋ฒ๋ค์ ๋ํด ์๋ ผํ๋ฉด์ ๋ง์ด ๋ฐฐ์ฐ๊ณ , ๋ด๊ฐ ๊ฐ์ง ๋ถ์กฑํจ์ ๋ค๋ฅธ ๋๋ฃ๊ฐ ์ฑ์์ฃผ๋ ๊ฒ์ ๊ฒฝํํ ์ ์์๋ค. ์ ๋ง ์ข์ ํ๊ณผ ํ๊ฒฝ์์ ์ผํ๊ณ ์๋ค๋ ์ ์ด ๋ ์ด์ฌํ ํ๊ณ ์ถ์ ๋ง์ ๊ฐ๊ฒ ํ๋ ๊ฒ ๊ฐ๋ค. ๋ ๋ํ ๊ทธ๋ฐ ๋๋ฃ๊ฐ ๋๊ธฐ ์ํด ๊ณ์ํด์ ์ฑ์๋๊ฐ๋ ํ๋ฃจํ๋ฃจ๋ฅผ ๋ณด๋ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ ํ๋ฌ์ด์๋ค.