์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ๊ณ , ์ผ๊ด๋๊ฒ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ ํ ๋ฐฉ์ง: ์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋์งํธ ์ธ์์์ ์น์ฌ์ดํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ฌ์ฉ์ ๋ง์กฑ๋, ์ฐธ์ฌ๋, ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก ๋น์ฆ๋์ค ์ฑ๊ณต์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ก๋ฉ์ด ๋๋ฆฌ๊ฑฐ๋ ๋ฐ์์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์๋ฅผ ์ข์ ์ํค๊ณ , ๊ฑฐ๋๋ฅผ ํฌ๊ธฐํ๊ฒ ๋ง๋ค๋ฉฐ, ๋ธ๋๋ ํํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋ ์น ๊ฐ๋ฐ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ ์ ํ(์์์น ๋ชปํ ์ฑ๋ฅ ๊ฐ์)๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ ํ๋ ๋ฌด์์ธ๊ฐ?
์ฑ๋ฅ ์ ํ๋ ์๋ก์ด ์ฝ๋ ๋ณ๊ฒฝ์ด๋ ์ ๋ฐ์ดํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๊ฐ์๋ฅผ ์ ๋ฐํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๋ํ๋ ์ ์์ต๋๋ค.
- ํ์ด์ง ๋ก๋ ์๊ฐ ์ฆ๊ฐ: ์ฌ์ฉ์๋ ํ์ด์ง๊ฐ ์์ ํ ์ํธ์์ฉ ๊ฐ๋ฅํด์ง๊ธฐ๊น์ง ๋ ๊ธด ๋๊ธฐ ์๊ฐ์ ๊ฒฝํํฉ๋๋ค.
- ๋๋ฆฐ ๋ ๋๋ง: ์๊ฐ์ ์์๊ฐ ํ๋ฉด์ ๋ํ๋๋ ๋ฐ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฝ๋๋ค.
- ํ๋ ์ ์๋ ๊ฐ์: ์ ๋๋ฉ์ด์ ๊ณผ ์ ํ์ด ๋๋ ๋๊ธฐ๊ณ ๋ ๋ถ๋๋ฝ๊ฒ ๋ณด์ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์๋น ์ฆ๊ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ผ๋ก ์ถฉ๋์ด๋ ์๋ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค.
- CPU ์ฌ์ฉ๋ ์ฆ๊ฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ง์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์๋นํ์ฌ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ๋ฐฐํฐ๋ฆฌ ์๋ช ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ด๋ฌํ ์ฑ๋ฅ ์ ํ๋ ๋ฏธ๋ฌํ๊ณ ์๋ ํ ์คํธ ์ค์๋ ์ฝ๊ฒ ๊ฐ๊ณผ๋ ์ ์์ผ๋ฉฐ, ํนํ ์ํธ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์๊ฐ ๋ง์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ด๋ ํ๋ก๋์ ์ ๋ฐฐํฌ๋ ํ์์ผ ๋ช ๋ฐฑํด์ ธ ๋ง์ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ์ ์ค์์ฑ
์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ํตํด ์ฑ๋ฅ ์ ํ๊ฐ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ์ ์ ์ ์ ์ผ๋ก ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๊ณ ๋ฏธ๋ฆฌ ์ ์๋ ์๊ณ๊ฐ์ด๋ ๊ธฐ์ค์ ๊ณผ ๋น๊ตํ๋ ์๋ํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ์กฐ๊ธฐ ๋ฐ๊ฒฌ: ๊ฐ๋ฐ ์ฃผ๊ธฐ ์ด๊ธฐ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ์ฌ ํ๋ก๋์ ์ ๋๋ฌํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ผ๊ด์ฑ ๋ฐ ์ ๋ขฐ์ฑ: ์๋ํ๋ ํ ์คํธ๋ ์ผ๊ด๋๊ณ ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ์ฌ ์ธ์ ์ค๋ฅ์ ์ฃผ๊ด์ฑ์ ์ ๊ฑฐํฉ๋๋ค.
- ๋ ๋น ๋ฅธ ํผ๋๋ฐฑ: ์ฝ๋ ๋ณ๊ฒฝ์ด ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๋ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ๋ฐ์ ๋น ๋ฅธ ๋ฐ๋ณต๊ณผ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋น์ฉ ์ ๊ฐ: ๊ฐ๋ฐ ๊ณผ์ ์ด๊ธฐ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ฌ ์์ ์ ํ์ํ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ํฌ๊ฒ ์ค์ ๋๋ค.
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ : ์ผ๊ด๋๊ฒ ๋น ๋ฅด๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๋ง์กฑ๋์ ์ฐธ์ฌ๋๋ฅผ ๋์ ๋๋ค.
- ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง: ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ(CI/CD) ํ์ดํ๋ผ์ธ์ ํตํฉํ์ฌ ์ง์์ ์ธ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ํํฉ๋๋ค.
๋ชจ๋ํฐ๋งํด์ผ ํ ์ฃผ์ ์ฑ๋ฅ ์งํ
์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ๊ตฌํํ ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ ์ฃผ์ ์ฑ๋ฅ ์งํ์ ์ง์คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ์งํ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ต์ด ์ฝํ ์ธ ํ ํ์ธํธ (FCP): ์ฒซ ๋ฒ์งธ ์ฝํ ์ธ (ํ ์คํธ, ์ด๋ฏธ์ง ๋ฑ)๊ฐ ํ๋ฉด์ ๋ํ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ์ต๋ ์ฝํ ์ธ ํ ํ์ธํธ (LCP): ๊ฐ์ฅ ํฐ ์ฝํ ์ธ ์์๊ฐ ํ๋ฉด์ ๋ํ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ์ต์ด ์ ๋ ฅ ์ง์ฐ (FID): ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ์ํธ์์ฉ(์: ๋ฒํผ ํด๋ฆญ)์ ์๋ตํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ์ํธ์์ฉ๊น์ง์ ์๊ฐ (TTI): ํ์ด์ง๊ฐ ์์ ํ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ๊ฒ ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ์ด ์ฐจ๋จ ์๊ฐ (TBT): ํ์ด์ง ๋ก๋ ์ค ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฐจ๋จ๋์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ตํ์ง ๋ชปํ๋ ์ด ์๊ฐ์ ์ธก์ ํฉ๋๋ค.
- ๋์ ๋ ์ด์์ ์ด๋ (CLS): ํ์ด์ง ๋ก๋ ์ค ๋ฐ์ํ๋ ์๊ธฐ์น ์์ ๋ ์ด์์ ์ด๋์ ์์ ์ธก์ ํ์ฌ ์๊ฐ์ ๋ถ์์ ์ฑ์ ์ ๋ฐํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์๊ฐ: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐ ์์๋๋ ์๊ฐ์ ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋๋ค.
- CPU ์ฌ์ฉ๋: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ์์ ๋๋ค.
- ๋คํธ์ํฌ ์์ฒญ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ํํ๋ ๋คํธ์ํฌ ์์ฒญ์ ์์ ํฌ๊ธฐ์ ๋๋ค.
์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ํ ๋๊ตฌ ๋ฐ ๊ธฐ์
์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ๋๊ตฌ์ ๊ธฐ์ ์ด ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ต์ ์ ๋๋ค.
- WebPageTest: ๋ค์ํ ์์น์ ๊ธฐ๊ธฐ์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ํ ์คํธํ๊ธฐ ์ํ ๋ฌด๋ฃ ์คํ์์ค ๋๊ตฌ์ ๋๋ค. ํญํฌ์ ์ฐจํธ, ํ๋ฆ ์คํธ๋ฆฝ, ์ฝ์ด ์น ๋ฐ์ดํ ์งํ ๋ฑ ์์ธํ ์ฑ๋ฅ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. WebPageTest๋ API๋ฅผ ํตํด ์๋ํํ ์ ์์ต๋๋ค.
- Lighthouse: ๊ตฌ๊ธ์ด ๊ฐ๋ฐํ ์คํ์์ค ๋๊ตฌ๋ก, ์น ํ์ด์ง์ ์ฑ๋ฅ, ์ ๊ทผ์ฑ, ๋ชจ๋ฒ ์ฌ๋ก, SEO๋ฅผ ๊ฐ์ฌํฉ๋๋ค. ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ์์ธํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค. Lighthouse๋ ๋ช ๋ น์ค, Chrome DevTools ๋๋ Node ๋ชจ๋๋ก ์คํํ ์ ์์ต๋๋ค.
- PageSpeed Insights: ๊ตฌ๊ธ์ด ์ ๊ณตํ๋ ๋๊ตฌ๋ก, ์น ํ์ด์ง์ ์๋๋ฅผ ๋ถ์ํ๊ณ ๊ฐ์ ์ ์ํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค. ๋ถ์ ์์ง์ผ๋ก Lighthouse๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Chrome DevTools: Chrome ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ฑ๋ฅ ํจ๋, ๋ฉ๋ชจ๋ฆฌ ํจ๋, ๋คํธ์ํฌ ํจ๋์ ํฌํจํ ํฌ๊ด์ ์ธ ์ฑ๋ฅ ๋ถ์ ๋๊ตฌ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ์ด ๋๊ตฌ๋ค์ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ , ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. Chrome DevTools๋ Puppeteer๋ Playwright๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํํ ์ ์์ต๋๋ค.
- Puppeteer ๋ฐ Playwright: ํค๋๋ฆฌ์ค Chrome ๋๋ Firefox ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ดํ๊ธฐ ์ํ ๊ณ ์์ค API๋ฅผ ์ ๊ณตํ๋ Node ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ํธ์์ฉ์ ์๋ํํ๊ณ , ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๋ฉฐ, ์ฑ๋ฅ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. Playwright๋ Chrome, Firefox, Safari๋ฅผ ์ง์ํฉ๋๋ค.
- Sitespeed.io: WebPageTest, Lighthouse, Browsertime๊ณผ ๊ฐ์ ์ฌ๋ฌ ์น ์ฑ๋ฅ ๋๊ตฌ์์ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๋จ์ผ ๋์๋ณด๋์ ํ์ํ๋ ์คํ์์ค ๋๊ตฌ์ ๋๋ค.
- Browsertime: Chrome ๋๋ Firefox๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ๋ Node.js ๋๊ตฌ์ ๋๋ค.
- Jest: ๋จ์ ํ ์คํธ ๋ฐ ํตํฉ ํ ์คํธ์ ์ฌ์ฉํ ์ ์๋ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. Jest๋ ์ฝ๋ ์ค๋ํซ์ ์คํ ์๊ฐ์ ์ธก์ ํ์ฌ ์ฑ๋ฅ ํ ์คํธ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Mocha ๋ฐ Chai: ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ ๋ฐ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด ๋๊ตฌ๋ค์ benchmark.js์ ๊ฐ์ ์ฑ๋ฅ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ (์: New Relic, Datadog, Sentry): ์ด๋ฌํ ๋๊ตฌ๋ ์ค์๊ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๊ฒฝ๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํ๋ก๋์ ์์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ณ ์ง๋จํ ์ ์๋๋ก ํฉ๋๋ค.
์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ ๊ตฌํ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
๋ค์์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ๋ณ ๊ฐ์ด๋์ ๋๋ค.
1. ์ฑ๋ฅ ์์ฐ ์ ์
์ฑ๋ฅ ์์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ค์ํด์ผ ํ๋ ์ฃผ์ ์ฑ๋ฅ ์งํ์ ๋ํ ํ๊ณ์น ์งํฉ์ ๋๋ค. ์ด ์์ฐ์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํ๊ณ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ๋ช ํํ ๋ชฉํ๋ฅผ ์ ์ํฉ๋๋ค. ์ฑ๋ฅ ์์ฐ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ด์ง ๋ก๋ ์๊ฐ: 3์ด ๋ฏธ๋ง์ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ์ต์ด ์ฝํ ์ธ ํ ํ์ธํธ (FCP): 1์ด ๋ฏธ๋ง์ FCP๋ฅผ ๋ชฉํ๋ก ํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ: ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ 500KB ๋ฏธ๋ง์ผ๋ก ์ ํํฉ๋๋ค.
- HTTP ์์ฒญ ์: HTTP ์์ฒญ ์๋ฅผ 50๊ฐ ๋ฏธ๋ง์ผ๋ก ์ค์ ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ ์ฌํญ๊ณผ ๋์ ๊ณ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ค์ ์ด๊ณ ๋ฌ์ฑ ๊ฐ๋ฅํ ์ฑ๋ฅ ์์ฐ์ ์ ์ํ์ธ์. ๋คํธ์ํฌ ์กฐ๊ฑด, ๊ธฐ๊ธฐ ์ฑ๋ฅ, ์ฌ์ฉ์ ๊ธฐ๋์น์ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์.
2. ์ฌ๋ฐ๋ฅธ ๋๊ตฌ ์ ํ
์์ ์ ํ์์ ์์ฐ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ์ ๊ธฐ์ ์ ์ ํํ์ธ์. ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์.
- ์ฌ์ฉ ์ฉ์ด์ฑ: ๋ฐฐ์ฐ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ๋ช ํํ ๋ฌธ์์ ์ง์ ์ปค๋ฎค๋ํฐ๊ฐ ์๋ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์.
- ๊ธฐ์กด ์ํฌํ๋ก์ฐ์์ ํตํฉ: ๊ธฐ์กด ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ์ํฌํ๋ก์ฐ์ ์ํํ๊ฒ ํตํฉ๋๋ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์.
- ๋น์ฉ: ๋ผ์ด์ ์ค ๋น์ฉ ๋ฐ ์ธํ๋ผ ๋น์ฉ์ ํฌํจํ ๋๊ตฌ์ ๋น์ฉ์ ๊ณ ๋ คํ์ธ์.
- ๊ธฐ๋ฅ: ์ฑ๋ฅ ํ๋กํ์ผ๋ง, ๋ณด๊ณ , ๊ฒฝ๊ณ ๋ฑ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋๊ตฌ๋ฅผ ์ ํํ์ธ์.
์์์ ๋๊ตฌ๋ก ์์ํ์ฌ ํ์์ ๋ฐ๋ผ ์ ์ฐจ ๋๊ตฌ ๋ชจ์์ ํ์ฅํ์ธ์.
3. ์ฑ๋ฅ ํ ์คํธ ์คํฌ๋ฆฝํธ ์์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ์ฌ์ฉ์ ํ๋ฆ๊ณผ ๊ตฌ์ฑ ์์์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ์๋ํ๋ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ์ธ์. ์ด ์คํฌ๋ฆฝํธ๋ ์ค์ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํด์ผ ํฉ๋๋ค.
Puppeteer๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ธก์ ํ๋ ์:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
const url = 'https://www.example.com';
const navigationPromise = page.waitForNavigation({waitUntil: 'networkidle0'});
await page.goto(url);
await navigationPromise;
const metrics = await page.metrics();
console.log(`Page load time for ${url}: ${metrics.timestamps.loadEventEnd - metrics.timestamps.navigationStart}ms`);
await browser.close();
})();
์ด ์คํฌ๋ฆฝํธ๋ Puppeteer๋ฅผ ์ฌ์ฉํ์ฌ ํค๋๋ฆฌ์ค Chrome ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ํ๊ณ , ์ง์ ๋ URL๋ก ์ด๋ํ์ฌ ํ์ด์ง ๋ก๋๋ฅผ ๊ธฐ๋ค๋ฆฐ ๋ค์, ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. `waitForNavigation`์ `networkidle0` ์ต์ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง ๋ก๋๊ฐ ์๋ฃ๋์๋ค๊ณ ๊ฐ์ฃผํ๊ธฐ ์ ์ ์ต์ 500ms ๋์ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ๋ณด์ฅํฉ๋๋ค.
Browsertime๊ณผ Sitespeed.io๋ฅผ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ์๋ ์ฝ์ด ์น ๋ฐ์ดํ์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
// ํ์ํ ํจํค์ง ์ค์น:
// npm install -g browsertime sitespeed.io
// ํ
์คํธ ์คํ (๋ช
๋ น์ค ์ฌ์ฉ ์):
// sitespeed.io https://www.example.com --browsertime.iterations 3 --browsertime.xvfb
// ์ด ๋ช
๋ น์ด๋ ๋ค์์ ์ํํฉ๋๋ค:
// 1. ์ง์ ๋ URL์ ๋ํด Browsertime์ 3๋ฒ ์คํํฉ๋๋ค.
// 2. ํค๋๋ฆฌ์ค ํ
์คํธ๋ฅผ ์ํด ๊ฐ์ X ์๋ฒ(xvfb)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// 3. Sitespeed.io๋ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํ๊ณ ์ฝ์ด ์น ๋ฐ์ดํ์ ํฌํจํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
// ๋ณด๊ณ ์์๋ LCP, FID, CLS ๋ฐ ๊ธฐํ ์ฑ๋ฅ ์งํ๊ฐ ํ์๋ฉ๋๋ค.
์ด ์๋ Sitespeed.io์ Browsertime์ ์ค์ ํ์ฌ ์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ฝ์ด ์น ๋ฐ์ดํ์ ๊ฒ์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ช ๋ น์ค ์ต์ ์ sitespeed.io๋ก browsertime ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ํนํ๋์ด ์์ต๋๋ค.
4. CI/CD ํ์ดํ๋ผ์ธ์ ์ฑ๋ฅ ํ ์คํธ ํตํฉ
์ฑ๋ฅ ํ ์คํธ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ์ด ์ปค๋ฐ๋ ๋๋ง๋ค ์๋์ผ๋ก ์คํ๋๋๋ก ํ์ธ์. ์ด๋ฅผ ํตํด ์ฑ๋ฅ์ด ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง๋๊ณ ์ฑ๋ฅ ์ ํ๊ฐ ์กฐ๊ธฐ์ ๊ฐ์ง๋ฉ๋๋ค.
Jenkins, GitLab CI, GitHub Actions, CircleCI์ ๊ฐ์ ๋๋ถ๋ถ์ CI/CD ํ๋ซํผ์ ๋น๋ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ์๋ํ๋ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ์ฌ ์ฑ๋ฅ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ , ์ฑ๋ฅ ์์ฐ์ ์ด๊ณผํ๋ฉด ๋น๋๊ฐ ์คํจํ๋๋ก ์ค์ ํ์ธ์.
GitHub Actions ์ฌ์ฉ ์:
name: Performance Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
performance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run performance tests
run: npm run performance-test
env:
PERFORMANCE_BUDGET_PAGE_LOAD_TIME: 3000 # milliseconds
์ด GitHub Actions ์ํฌํ๋ก์ฐ๋ Ubuntu์์ ์คํ๋๋ "performance"๋ผ๋ ์์ ์ ์ ์ํฉ๋๋ค. ์ฝ๋๋ฅผ ์ฒดํฌ์์ํ๊ณ , Node.js๋ฅผ ์ค์ ํ๊ณ , ์ข ์์ฑ์ ์ค์นํ ๋ค์ `npm run performance-test` ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค. `PERFORMANCE_BUDGET_PAGE_LOAD_TIME` ํ๊ฒฝ ๋ณ์๋ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๋ํ ์ฑ๋ฅ ์์ฐ์ ์ ์ํฉ๋๋ค. `npm run performance-test` ์คํฌ๋ฆฝํธ์๋ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ช ๋ น์ด(์: Puppeteer, Lighthouse ๋๋ WebPageTest ์ฌ์ฉ)๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค. `package.json` ํ์ผ์๋ ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ ์๋ ์์ฐ์ ๋ํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ `performance-test` ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋์ด์ผ ํ๋ฉฐ, ์์ฐ์ด ์๋ฐ๋๋ฉด 0์ด ์๋ ์ข ๋ฃ ์ฝ๋๋ก ์ข ๋ฃ๋์ด CI ๋น๋๊ฐ ์คํจํ๊ฒ ํฉ๋๋ค.
5. ์ฑ๋ฅ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐ ๋ณด๊ณ
์ฑ๋ฅ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์ ํ ์์ญ์ ์๋ณํ์ธ์. ์ฑ๋ฅ ์งํ๋ฅผ ์์ฝํ๊ณ ์ฑ๋ฅ ์ ํ๋ ์์ฐ ์๋ฐ์ ๊ฐ์กฐํ๋ ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ธ์.
๋๋ถ๋ถ์ ์ฑ๋ฅ ํ ์คํธ ๋๊ตฌ๋ ๋ด์ฅ๋ ๋ณด๊ณ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด ๋ณด๊ณ ์๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ถ์ธ๋ฅผ ์ถ์ ํ๊ณ ๊ทผ๋ณธ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ํ๋ผ ์ ์๋ ํจํด์ ์๋ณํ์ธ์.
์ฑ๋ฅ ๋ณด๊ณ ์ ์์ (๊ฐ์ํ๋จ):
์ฑ๋ฅ ๋ณด๊ณ ์:
URL: https://www.example.com
์งํ:
์ต์ด ์ฝํ
์ธ ํ ํ์ธํธ (FCP): 0.8s (ํต๊ณผ)
์ต๋ ์ฝํ
์ธ ํ ํ์ธํธ (LCP): 2.2s (ํต๊ณผ)
์ํธ์์ฉ๊น์ง์ ์๊ฐ (TTI): 2.8s (ํต๊ณผ)
์ด ์ฐจ๋จ ์๊ฐ (TBT): 150ms (ํต๊ณผ)
ํ์ด์ง ๋ก๋ ์๊ฐ: 2.9s (ํต๊ณผ) - ์์ฐ: 3.0s
์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ: 480KB (ํต๊ณผ) - ์์ฐ: 500KB
์ฑ๋ฅ ์ ํ ๊ฐ์ง๋์ง ์์.
์ด ๋ณด๊ณ ์๋ ํน์ URL์ ๋ํ ์ฑ๋ฅ ์งํ๋ฅผ ์์ฝํ๊ณ ์ ์๋ ์ฑ๋ฅ ์์ฐ์ ๋ฐ๋ผ ํต๊ณผ ๋๋ ์คํจ ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค. ๋ํ ์ฑ๋ฅ ์ ํ๊ฐ ๊ฐ์ง๋์๋์ง ์ฌ๋ถ๋ ๊ธฐ๋กํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ํ ์คํธ ์คํฌ๋ฆฝํธ ๋ด์์ ์์ฑ๋์ด CI/CD ์ถ๋ ฅ์ ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
6. ๋ฐ๋ณต ๋ฐ ์ต์ ํ
์ฑ๋ฅ ๊ฒฐ๊ณผ ๋ถ์์ ๊ธฐ๋ฐ์ผ๋ก ์ต์ ํํ ์์ญ์ ์๋ณํ๊ณ ์ฝ๋๋ฅผ ๋ฐ๋ณตํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ์ธ์. ์ผ๋ฐ์ ์ธ ์ต์ ํ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฝ๋ ๋ถํ (Code Splitting): ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฒญํฌ๋ก ๋๋์ด ํ์ํ ๋ ๋ก๋ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading): ์ค์ํ์ง ์์ ๋ฆฌ์์ค์ ๋ก๋ฉ์ ํ์ํ ๋๊น์ง ์ง์ฐ์ํต๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ , ์ ์ ํ ํฌ๊ธฐ๋ก ์กฐ์ ํ๋ฉฐ, WebP์ ๊ฐ์ ์ต์ ์ด๋ฏธ์ง ํ์์ ์ฌ์ฉํ์ฌ ์ต์ ํํฉ๋๋ค.
- ์บ์ฑ(Caching): ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํ์ฉํ์ฌ ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ ๋๋ค.
- ์ถ์ ๋ฐ ๋๋ ํ(Minification and Uglification): ๋ถํ์ํ ๋ฌธ์์ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ CSS ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค.
- ๋๋ฐ์ด์ฑ ๋ฐ ์ค๋กํ๋ง(Debouncing and Throttling): ์ฌ์ฉ์ ์ด๋ฒคํธ์ ์ํด ํธ๋ฆฌ๊ฑฐ๋๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋น๋๋ฅผ ์ ํํฉ๋๋ค.
- ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ: ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๊ฐ์ฅ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ํํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง: ์ฝ๋๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋๋ก ํด์ ํ๋๋ก ํฉ๋๋ค.
- ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ต์ ํ: ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ ์ํฅ์ ํ๊ฐํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋์์ ์ ํํฉ๋๋ค. ํ์ฌ ์คํฌ๋ฆฝํธ์ ์ง์ฐ ๋ก๋ฉ์ ๊ณ ๋ คํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ํ์์ ๋ฐ๋ผ ํ ์คํธ ๋ฐ ์ต์ ํ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํ์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ํ ์คํธ ๋ชจ๋ฒ ์ฌ๋ก
์๋ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ๊ตฌํํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ์ค์ ์ธ ํ๊ฒฝ์์ ํ ์คํธ: ํ๋ก๋์ ํ๊ฒฝ๊ณผ ์ ์ฌํ ํ๊ฒฝ์์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์คํํ์ธ์. ์ฌ๊ธฐ์๋ ๋คํธ์ํฌ ์กฐ๊ฑด, ๊ธฐ๊ธฐ ์ฑ๋ฅ, ์๋ฒ ๊ตฌ์ฑ๊ณผ ๊ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
- ์ผ๊ด๋ ํ ์คํธ ๋ฐฉ๋ฒ๋ก ์ฌ์ฉ: ์ผ๊ด๋ ํ ์คํธ ๋ฐฉ๋ฒ๋ก ์ ์ฌ์ฉํ์ฌ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ ์ ์๋๋ก ํ์ธ์. ์ฌ๊ธฐ์๋ ๋ฐ๋ณต ํ์, ์๋ฐ์ ๊ธฐ๊ฐ, ์ธก์ ๊ฐ๊ฒฉ๊ณผ ๊ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
- ํ๋ก๋์ ์์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ธ์. ์ด๋ฅผ ํตํด ํ ์คํธ ์ค์ ๋ฐ๊ฒฌ๋์ง ์์ ์ ์๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ณ ์ง๋จํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๊ฒ์ ์๋ํ: ํ ์คํธ ์คํ, ๊ฒฐ๊ณผ ๋ถ์, ๋ณด๊ณ ์ ์์ฑ์ ํฌํจํ์ฌ ์ฑ๋ฅ ํ ์คํธ ํ๋ก์ธ์ค๋ฅผ ์ต๋ํ ์๋ํํ์ธ์.
- ํ ์คํธ๋ฅผ ์ต์ ์ํ๋ก ์ ์ง: ์ฝ๋ ๋ณ๊ฒฝ์ด ์์ ๋๋ง๋ค ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ์ธ์. ์ด๋ฅผ ํตํด ํ ์คํธ๊ฐ ํญ์ ๊ด๋ จ์ฑ์ด ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ํํ๊ฒ ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ ์ฒด ํ ์ฐธ์ฌ: ์ ์ฒด ๊ฐ๋ฐํ์ ์ฑ๋ฅ ํ ์คํธ ํ๋ก์ธ์ค์ ์ฐธ์ฌ์ํค์ธ์. ์ด๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ธ์์ ๋์ด๊ณ ์ฑ๋ฅ ์ต์ ํ ๋ฌธํ๋ฅผ ์กฐ์ฑํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๊ฒฝ๊ณ ์ค์ : ์ฑ๋ฅ ์ ํ๊ฐ ๊ฐ์ง๋์์ ๋ ์๋ฆผ์ ๋ฐ๋๋ก ๊ฒฝ๊ณ ๋ฅผ ๊ตฌ์ฑํ์ธ์. ์ด๋ฅผ ํตํด ์ฑ๋ฅ ๋ฌธ์ ์ ์ ์ํ๊ฒ ๋์ํ๊ณ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ฐฉ์งํ ์ ์์ต๋๋ค.
- ํ ์คํธ ๋ฐ ํ๋ก์ธ์ค ๋ฌธ์ํ: ์ฑ๋ฅ ํ ์คํธ, ์ฑ๋ฅ ์์ฐ, ํ ์คํธ ํ๋ก์ธ์ค๋ฅผ ๋ฌธ์ํํ์ธ์. ์ด๋ฅผ ํตํด ํ์ ๋ชจ๋ ๊ตฌ์ฑ์์ด ์ฑ๋ฅ ์ธก์ ๋ฐ ๋ชจ๋ํฐ๋ง ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ํด๊ฒฐ
์๋ํ๋ ์ฑ๋ฅ ํ ์คํธ๋ ์๋ง์ ์ด์ ์ ์ ๊ณตํ์ง๋ง ๋ช ๊ฐ์ง ์ด๋ ค์๋ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฅ์ ๋ฌผ์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ณ๋์ค๋ฌ์ด ํ ์คํธ(Flaky Tests): ์ฑ๋ฅ ํ ์คํธ๋ ๋๋๋ก ๋ณ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. ์ฆ, ๋คํธ์ํฌ ํผ์ก์ด๋ ์๋ฒ ๋ถํ์ ๊ฐ์ด ํต์ ํ ์ ์๋ ์์ธ์ผ๋ก ์ธํด ๊ฐํ์ ์ผ๋ก ํต๊ณผํ๊ฑฐ๋ ์คํจํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํํ๋ ค๋ฉด ํ ์คํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ๊ท ๋ด์ธ์. ํต๊ณ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ด์์น๋ฅผ ์๋ณํ๊ณ ํํฐ๋งํ ์๋ ์์ต๋๋ค.
- ํ ์คํธ ์คํฌ๋ฆฝํธ ์ ์ง ๊ด๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ฑ๋ฅ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋๋ก ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ์ด๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ํ๋ก์ธ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ชจ๋์์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ํ ์คํธ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๊ณ ํ ์คํธ ์คํฌ๋ฆฝํธ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ ์ ์๋ ํ ์คํธ ์๋ํ ๋๊ตฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
- ๊ฒฐ๊ณผ ํด์: ์ฑ๋ฅ ํ ์คํธ ๊ฒฐ๊ณผ๋ ๋ณต์กํ๊ณ ํด์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ณด๊ณ ๋ฐ ์๊ฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ๊ธฐ์ค ์ฑ๋ฅ ์์ค์ ์ค์ ํ๊ณ ํ์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํด๋น ๊ธฐ์ค์ ๊ณผ ๋น๊ตํ๋ ๊ฒ๋ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ํ์ฌ ์๋น์ค ์ฒ๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ํต์ ํ ์ ์๋ ํ์ฌ ์๋น์ค์ ์์กดํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋น์ค์ ์ฑ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋ฌํ ์๋น์ค์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ฑ๋ฅ ํ ์คํธ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๋ชจ์(mocking) ๋๋ ์คํฐ๋น(stubbing) ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
๊ฒฐ๋ก
์๋ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ํ ์คํธ๋ ์ผ๊ด๋๊ฒ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํ ์ค์ํ ๊ดํ์ ๋๋ค. ์๋ํ๋ ํ ์คํธ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ์ ์ ์ผ๋ก ์๋ณํ๊ณ ํด๊ฒฐํ๋ฉฐ, ๊ฐ๋ฐ ๋น์ฉ์ ์ค์ด๊ณ , ๊ณ ํ์ง ์ ํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ ํํ๊ณ , ๋ช ํํ ์ฑ๋ฅ ์์ฐ์ ์ ์ํ๊ณ , ํ ์คํธ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ต์ ํํ์ธ์. ์ด๋ฌํ ๊ดํ์ ์์ฉํจ์ผ๋ก์จ ๊ธฐ๋ฅ์ ์ผ ๋ฟ๋ง ์๋๋ผ ์ฑ๋ฅ๋ ๋ฐ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด ์ฌ์ฉ์๋ฅผ ๋ง์กฑ์ํค๊ณ ๋น์ฆ๋์ค ์ฑ๊ณต์ ์ด๋ ์ ์์ต๋๋ค.
์ฑ๋ฅ์ ์ผํ์ฑ ์์ ์ด ์๋ ์ง์์ ์ธ ๊ณผ์ ์์ ๊ธฐ์ตํ์ธ์. ์ ์ธ๊ณ ์ด๋์ ์๋ ์ฌ์ฉ์์๊ฒ ์ต์์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง, ํ ์คํธ ๋ฐ ์ต์ ํํ์ธ์.