์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ์ดํด์ ๊ตฌํ์ ์ํ ์ข ํฉ ๊ฐ์ด๋. ์ฃผ์ ์งํ, ๋๊ตฌ, ๊ฒฌ๊ณ ํ๊ณ ์ ๋ขฐ์ฑ ์๋ ์ฝ๋๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง: ํ ์คํธ ์งํ ์ค๋ช
์ญ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธ๊ณ์์ ์ฝ๋์ ์ ๋ขฐ์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํนํ ๋ชจ๋์ ์ํคํ ์ฒ ์ฑํ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ปค์ง๋ฉด์ ํฌ๊ด์ ์ธ ํ ์คํธ ์ ๋ต์ด ํ์์ ์ ๋๋ค. ์ด๋ฌํ ์ ๋ต์ ์ค์ํ ๊ตฌ์ฑ ์์ ์ค ํ๋๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ก, ํ ์คํธ ์ค์ํธ๊ฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ด๋ ์ ๋ ์คํํ๋์ง๋ฅผ ์ธก์ ํ๋ ์งํ์ ๋๋ค.
์ด ๊ฐ์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ๋ํ ์ฌ์ธต์ ์ธ ํ๊ตฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ทธ ์ค์์ฑ, ์ฃผ์ ์งํ, ์ธ๊ธฐ ์๋ ๋๊ตฌ ๋ฐ ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค๋ช ํฉ๋๋ค. ๋ค์ํ ํ ์คํธ ์ ๋ต์ ๋ค๋ฃจ๊ณ , ์ ์ธ๊ณ ์ฌ๋ฌ ํ๋ ์์ํฌ์ ํ๊ฒฝ์ ์ ์ฉ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ ๋ฐ์ ์ธ ํ์ง์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค ๊ฒ์ ๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ฌด์์ธ๊ฐ?
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ๋ก๊ทธ๋จ์ ์์ค ์ฝ๋๊ฐ ์ด๋ ์ ๋ ํ ์คํธ๋์๋์ง๋ฅผ ์ ๋ํํ๋ ์ํํธ์จ์ด ํ ์คํธ ์งํ์ ๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ํ ์คํธ๊ฐ ์คํ๋ ๋ ์ฝ๋์ ์ด๋ค ๋ถ๋ถ์ด ์คํ๋๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋น์จ์ ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ๊ฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฒ ์ ํ๊ฒ ์คํํ๊ณ ์์์ ๋ํ๋ด๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ์ ๋ํ ์ ๋ขฐ๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
๊ฒฝ์ฐฐ์ด ๋์์ ์ด๋ ๋ถ๋ถ์ ์ ์์ฐฐํ๊ณ ์๋์ง ๋ณด์ฌ์ฃผ๋ ์ง๋๋ผ๊ณ ์๊ฐํด๋ณด์ญ์์ค. ์์ฐฐ๋์ง ์๋ ๋์ ์ง์ญ์ด ์๋ค๋ฉด ๋ฒ์ฃ ํ๋์ด ๋ฒ์ฑํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ ์ ํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์์ผ๋ฉด ํ ์คํธ๋์ง ์์ ์ฝ๋ ์ธ๊ทธ๋จผํธ๋ ํ๋ก๋์ ํ๊ฒฝ์์๋ง ๋๋ฌ๋ ์ ์๋ ์จ๊ฒจ์ง ๋ฒ๊ทธ๋ฅผ ํ๊ณ ์์ ์ ์์ต๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ค์ํ ์ด์
- ํ ์คํธ๋์ง ์์ ์ฝ๋ ์๋ณ: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ถ์กฑํ ์ฝ๋ ์น์ ์ ๊ฐ์กฐํ์ฌ ๊ฐ์ฅ ํ์ํ ๊ณณ์ ํ ์คํธ ๋ ธ๋ ฅ์ ์ง์คํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์ฝ๋ ํ์ง ํฅ์: ๋ ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ๋ ธ๋ ฅํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ ๋ ํฌ๊ด์ ์ด๊ณ ์๋ฏธ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌ๋ฐ๊ฒ ๋๋ฉฐ, ์ด๋ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฒ ์ด์ค๋ก ์ด์ด์ง๋๋ค.
- ๋ฒ๊ทธ ์ํ ๊ฐ์: ์ฒ ์ ํ๊ฒ ํ ์คํธ๋ ์ฝ๋๋ ํ๋ก๋์ ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ฏธ๋ฐ๊ฒฌ ๋ฒ๊ทธ๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง ์ฉ์ด: ์ข์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ถ๋ฉด, ํ ์คํธ๊ฐ ๊ทธ ๊ณผ์ ์์ ๋์ ๋ ๋ชจ๋ ํ๊ท(regression)๋ฅผ ์ก์๋ผ ๊ฒ์ด๋ผ๋ ํ์ ์ ๊ฐ์ง๊ณ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.
- ํ์ ๊ฐํ: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ ํ ์คํธ ํ์ง์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ด์ ์ธ ์ธก์ ์น๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์ ๊ฐ์ ๋ ๋์ ์์ฌ์ํต๊ณผ ํ์ ์ ์ด์งํฉ๋๋ค.
- CI/CD(์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ) ์ง์: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ CI/CD ํ์ดํ๋ผ์ธ์ ๊ฒ์ดํธ(gate)๋ก ํตํฉ๋์ด, ๋ถ์ถฉ๋ถํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ์ฝ๋๊ฐ ํ๋ก๋์ ์ ๋ฐฐํฌ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์งํ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์งํ๊ฐ ์์ผ๋ฉฐ, ๊ฐ ์งํ๋ ํ ์คํธ ๋์ ์ฝ๋์ ๋ค๋ฅธ ์ธก๋ฉด์ ์ค์ ์ ๋ก๋๋ค. ์ด๋ฌํ ์งํ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ํด์ํ๊ณ ํ ์คํธ ์ ๋ต์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ค์ํฉ๋๋ค.
1. ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง (Line Coverage)
๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์งํ์ ๋๋ค. ์ด๋ ํ ์คํธ ์ค์ํธ์ ์ํด ์คํ๋ ์คํ ๊ฐ๋ฅ ์ฝ๋ ๋ผ์ธ์ ๋น์จ์ ์ธก์ ํฉ๋๋ค.
๊ณต์: (์คํ๋ ๋ผ์ธ ์) / (์ด ์คํ ๊ฐ๋ฅ ๋ผ์ธ ์) * 100
์์: ๋ชจ๋์ 100๊ฐ์ ์คํ ๊ฐ๋ฅ ์ฝ๋ ๋ผ์ธ์ด ์๊ณ ํ ์คํธ๊ฐ ๊ทธ ์ค 80๊ฐ๋ฅผ ์คํํ๋ค๋ฉด, ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ 80%์ ๋๋ค.
๊ณ ๋ ค์ฌํญ: ์ดํดํ๊ธฐ ์ฝ์ง๋ง, ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ ์คํด์ ์์ง๊ฐ ์์ ์ ์์ต๋๋ค. ํ ๋ผ์ธ์ด ์คํ๋์๋๋ผ๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋์์ ์์ ํ ํ ์คํธํ์ง ์์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์กฐ๊ฑด์ด ์๋ ๋ผ์ธ์ ํน์ ์๋๋ฆฌ์ค ํ๋์ ๋ํด์๋ง ํ ์คํธ๋์์ ์ ์์ต๋๋ค.
2. ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง (Branch Coverage)
๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง(๊ฒฐ์ ์ปค๋ฒ๋ฆฌ์ง๋ผ๊ณ ๋ ํจ)๋ ํ ์คํธ ์ค์ํธ์ ์ํด ์คํ๋ ๋ถ๊ธฐ(`if` ๋ฌธ, `switch` ๋ฌธ, ๋ฃจํ ๋ฑ)์ ๋น์จ์ ์ธก์ ํฉ๋๋ค. ์ด๋ ์กฐ๊ฑด๋ฌธ์ `true` ๋ฐ `false` ๋ถ๊ธฐ ๋ชจ๋๊ฐ ํ ์คํธ๋์๋์ง ํ์ธํฉ๋๋ค.
๊ณต์: (์คํ๋ ๋ถ๊ธฐ ์) / (์ด ๋ถ๊ธฐ ์) * 100
์์: ๋ชจ๋์ `if` ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ, ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง๋ `if` ๋ธ๋ก๊ณผ `else` ๋ธ๋ก(๋๋ `else`๊ฐ ์๋ ๊ฒฝ์ฐ `if` ๋ค์์ ์ฝ๋)์ ๋ชจ๋ ์คํํ๋ ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
๊ณ ๋ ค์ฌํญ: ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ชจ๋ ๊ฐ๋ฅํ ์คํ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋๋ก ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ณด๋ค ๋ ํฌ๊ด์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
3. ํจ์ ์ปค๋ฒ๋ฆฌ์ง (Function Coverage)
ํจ์ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ชจ๋์ ํจ์ ์ค ํ ์คํธ ์ค์ํธ์ ์ํด ์ต์ ํ ๋ฒ ์ด์ ํธ์ถ๋ ํจ์์ ๋น์จ์ ์ธก์ ํฉ๋๋ค.
๊ณต์: (ํธ์ถ๋ ํจ์ ์) / (์ด ํจ์ ์) * 100
์์: ๋ชจ๋์ 10๊ฐ์ ํจ์๊ฐ ์๊ณ ํ ์คํธ๊ฐ ๊ทธ ์ค 8๊ฐ๋ฅผ ํธ์ถํ๋ค๋ฉด, ํจ์ ์ปค๋ฒ๋ฆฌ์ง๋ 80%์ ๋๋ค.
๊ณ ๋ ค์ฌํญ: ํจ์ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ชจ๋ ํจ์๊ฐ ํธ์ถ๋์์์ ๋ณด์ฅํ์ง๋ง, ๋ค๋ฅธ ์ ๋ ฅ๊ฐ๊ณผ ์ฃ์ง ์ผ์ด์ค(edge case)๋ก ์ฒ ์ ํ ํ ์คํธ๋์์์ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค.
4. ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง (Statement Coverage)
๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์ฝ๋ ๋ด์์ ์คํ๋ ๊ตฌ๋ฌธ์ ๋น์จ์ ์ธก์ ํฉ๋๋ค.
๊ณต์: (์คํ๋ ๊ตฌ๋ฌธ ์) / (์ด ๊ตฌ๋ฌธ ์) * 100
์์: ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง์ ์ ์ฌํ๊ฒ, ๊ฐ ๊ตฌ๋ฌธ์ด ์ต์ ํ ๋ฒ ์คํ๋์๋์ง ํ์ธํฉ๋๋ค.
๊ณ ๋ ค์ฌํญ: ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง์ ๋ง์ฐฌ๊ฐ์ง๋ก, ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง๋ ๋๋ฌด ๋จ์ํ ์ ์์ผ๋ฉฐ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๋ฅผ ์ก์๋ด์ง ๋ชปํ ์ ์์ต๋๋ค.
5. ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง (Path Coverage)
๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง๋ ๊ฐ์ฅ ํฌ๊ด์ ์ด์ง๋ง ๋ฌ์ฑํ๊ธฐ ๊ฐ์ฅ ์ด๋ ค์ด ์งํ์ ๋๋ค. ์ฝ๋๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ๊ฐ๋ฅํ ์คํ ๊ฒฝ๋ก ์ค ํ ์คํธ๋ ๊ฒฝ๋ก์ ๋น์จ์ ์ธก์ ํฉ๋๋ค.
๊ณต์: (์คํ๋ ๊ฒฝ๋ก ์) / (์ด ๊ฐ๋ฅํ ๊ฒฝ๋ก ์) * 100
์์: ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ๋ `if` ๋ฌธ์ด ์๋ ํจ์๋ฅผ ์๊ฐํด๋ณด์ญ์์ค. ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง๋ ํด๋น ๋ฌธ์ ๋ํ `true` ๋ฐ `false` ๊ฒฐ๊ณผ์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ํ ์คํธํด์ผ ํฉ๋๋ค.
๊ณ ๋ ค์ฌํญ: ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ณต์กํ ์ฝ๋๋ฒ ์ด์ค์์ 100% ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ ์ข ์ข ๋นํ์ค์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ๋ ธ๋ ฅํ๋ฉด ์ฝ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
6. ํจ์ ํธ์ถ ์ปค๋ฒ๋ฆฌ์ง (Function Call Coverage)
ํจ์ ํธ์ถ ์ปค๋ฒ๋ฆฌ์ง๋ ์ฝ๋ ๋ด์ ํน์ ํจ์ ํธ์ถ์ ์ค์ ์ ๋ก๋๋ค. ํน์ ํจ์ ํธ์ถ์ด ํ ์คํธ ์ค์ ์คํ๋์๋์ง ์ถ์ ํฉ๋๋ค.
๊ณต์: (์คํ๋ ํน์ ํจ์ ํธ์ถ ์) / (ํด๋น ํน์ ํจ์ ํธ์ถ์ ์ด ์) * 100
์์: ์ค์ํ ์ปดํฌ๋ํธ์์ ํน์ ์ ํธ๋ฆฌํฐ ํจ์๊ฐ ํธ์ถ๋๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด, ํจ์ ํธ์ถ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๊ณ ๋ ค์ฌํญ: ํนํ ๋ชจ๋ ๊ฐ์ ๋ณต์กํ ์ํธ ์์ฉ์์ ํน์ ํจ์ ํธ์ถ์ด ์์๋๋ก ๋ฐ์ํ๋์ง ํ์ธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ
์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํ๋ฅญํ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ๊ณ์ธก(instrument)ํ์ฌ(๋ฐํ์ ๋๋ ๋น๋ ๋จ๊ณ์์) ํ ์คํธ ์ค์ ์ด๋ค ๋ผ์ธ, ๋ถ๊ธฐ ๋ฐ ํจ์๊ฐ ์คํ๋๋์ง ์ถ์ ํฉ๋๋ค. ๋ค์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ช ๊ฐ์ง ์ต์ ์ ๋๋ค:
1. Istanbul/NYC
Istanbul์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ๋๋ค. NYC๋ Istanbul์ ์ปค๋งจ๋ ๋ผ์ธ ์ธํฐํ์ด์ค๋ก, ํ ์คํธ๋ฅผ ์คํํ๊ณ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
ํน์ง:
- ๋ผ์ธ, ๋ถ๊ธฐ, ํจ์ ๋ฐ ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ง์ํฉ๋๋ค.
- ๋ค์ํ ๋ณด๊ณ ์ ํ์(HTML, text, LCOV, Cobertura)์ ์์ฑํฉ๋๋ค.
- Mocha, Jest, Jasmine๊ณผ ๊ฐ์ ์ธ๊ธฐ ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ํตํฉ๋ฉ๋๋ค.
- ๊ณ ๋๋ก ๊ตฌ์ฑ ๊ฐ๋ฅํฉ๋๋ค.
์์ (Mocha์ NYC ์ฌ์ฉ):
npm install --save-dev nyc mocha
`package.json` ํ์ผ์์:
"scripts": {
"test": "nyc mocha"
}
๊ทธ๋ฐ ๋ค์ ์คํ:
npm test
์ด๋ ๊ฒ ํ๋ฉด Mocha ํ ์คํธ๊ฐ ์คํ๋๊ณ `coverage` ๋๋ ํ ๋ฆฌ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๊ฐ ์์ฑ๋ฉ๋๋ค.
2. Jest
Jest๋ Facebook์์ ๊ฐ๋ฐํ ์ธ๊ธฐ ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ด ์ถ๊ฐ ๋๊ตฌ ์์ด๋ ์ฝ๊ฒ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
ํน์ง:
- ์ ๋ก ๊ตฌ์ฑ ์ค์ (๋๋ถ๋ถ์ ๊ฒฝ์ฐ).
- ์ค๋ ์ท ํ ์คํ .
- ๋ชจ์(Mocking) ๊ธฐ๋ฅ.
- ๋ด์ฅ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง.
์์:
npm install --save-dev jest
`package.json` ํ์ผ์์:
"scripts": {
"test": "jest --coverage"
}
๊ทธ๋ฐ ๋ค์ ์คํ:
npm test
์ด๋ ๊ฒ ํ๋ฉด Jest ํ ์คํธ๊ฐ ์คํ๋๊ณ `coverage` ๋๋ ํ ๋ฆฌ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๊ฐ ์์ฑ๋ฉ๋๋ค.
3. Blanket.js
Blanket.js๋ ๋ธ๋ผ์ฐ์ ์ Node.js ํ๊ฒฝ์ ๋ชจ๋ ์ง์ํ๋ ๋ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ๋๋ค. ๋น๊ต์ ๊ฐ๋จํ ์ค์ ์ ์ ๊ณตํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์ปค๋ฒ๋ฆฌ์ง ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํน์ง:
- ๋ธ๋ผ์ฐ์ ๋ฐ Node.js ์ง์.
- ๊ฐ๋จํ ์ค์ .
- ๊ธฐ๋ณธ์ ์ธ ์ปค๋ฒ๋ฆฌ์ง ์งํ.
๊ณ ๋ ค์ฌํญ: Blanket.js๋ Istanbul์ด๋ Jest์ ๋นํด ๋ ํ๋ฐํ๊ฒ ์ ์ง๋ณด์๋๊ณ ์์ต๋๋ค.
4. c8
c8์ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํ๋์ ์ธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ๋๋ค. Node.js์ ๋ด์ฅ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง API๋ฅผ ํ์ฉํฉ๋๋ค.
ํน์ง:
- ๋น ๋ฅด๊ณ ํจ์จ์ ์.
- Node.js ๋ด์ฅ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง API ์ฌ์ฉ.
- ๋ค์ํ ๋ณด๊ณ ์ ํ์ ์ง์.
์์:
npm install --save-dev c8
`package.json` ํ์ผ์์:
"scripts": {
"test": "c8 mocha"
}
๊ทธ๋ฐ ๋ค์ ์คํ:
npm test
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ตฌํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๊ฐ์น ์๋ ์งํ์ด์ง๋ง, ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ณ ์ผ๋ฐ์ ์ธ ํจ์ ์ ํผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋์ ์ปค๋ฒ๋ฆฌ์ง๋ฟ๋ง ์๋๋ผ ์๋ฏธ ์๋ ํ ์คํธ๋ฅผ ๋ชฉํ๋ก ํ์ธ์
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๋ชฉํ๊ฐ ์๋๋ผ ๊ฐ์ด๋๊ฐ ๋์ด์ผ ํฉ๋๋ค. ๋จ์ํ ์ปค๋ฒ๋ฆฌ์ง ๋น์จ์ ๋์ด๊ธฐ ์ํด ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ์ค์ ๋ก๋ ๋ณ ๊ฐ์น๊ฐ ์๋ ํผ์์ ์ธ ํ ์คํธ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ชจ๋์ ๊ธฐ๋ฅ์ ์ฒ ์ ํ ์คํํ๊ณ ์ค์ํ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ์๋ฏธ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํ์ธ์.
์๋ฅผ ๋ค์ด, ๋จ์ํ ํจ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด ํจ์๋ฅผ ํธ์ถํ๋ ๋์ , ํจ์๊ฐ ๋ค์ํ ์ ๋ ฅ์ ๋ํด ์ฌ๋ฐ๋ฅธ ์ถ๋ ฅ์ ๋ฐํํ๊ณ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋์ง ํ์ธํ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ๊ฒฝ๊ณ ์กฐ๊ฑด๊ณผ ์ ์ฌ์ ์ผ๋ก ์ ํจํ์ง ์์ ์ ๋ ฅ์ ๊ณ ๋ คํ์ญ์์ค.
2. ์ผ์ฐ ์์ํ๊ณ ์ํฌํ๋ก์ฐ์ ํตํฉํ์ธ์
ํ๋ก์ ํธ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ๋ํด ์๊ฐํ์ง ๋ง์ธ์. ์ฒ์๋ถํฐ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํฉํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ปค๋ฒ๋ฆฌ์ง ๊ฒฉ์ฐจ๋ฅผ ์กฐ๊ธฐ์ ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์์ด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
์ด์์ ์ผ๋ก๋ CI/CD ํ์ดํ๋ผ์ธ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํฉํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋น๋์ ๋ํด ์๋์ผ๋ก ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๊ฐ ์์ฑ๋์ด ์ปค๋ฒ๋ฆฌ์ง ์ถ์ธ๋ฅผ ์ถ์ ํ๊ณ ํ๊ท๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
3. ํ์ค์ ์ธ ์ปค๋ฒ๋ฆฌ์ง ๋ชฉํ๋ฅผ ์ค์ ํ์ธ์
๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ๋ ธ๋ ฅํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋์งํ์ง๋ง, ๋นํ์ค์ ์ธ ๋ชฉํ๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋น์์ฐ์ ์ผ ์ ์์ต๋๋ค. ๋ชจ๋์ ๋ณต์ก์ฑ๊ณผ ์ค์์ฑ์ ์ ํฉํ ์ปค๋ฒ๋ฆฌ์ง ์์ค์ ๋ชฉํ๋ก ํ์ธ์. 80-90%์ ์ปค๋ฒ๋ฆฌ์ง๋ ์ข ์ข ํฉ๋ฆฌ์ ์ธ ๋ชฉํ์ด์ง๋ง, ์ด๋ ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
๋ ๋์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ๋๋ ๋น์ฉ์ ๊ณ ๋ คํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ชจ๋ ์ฝ๋ ๋ผ์ธ์ ํ ์คํธํ๋ ๋ฐ ํ์ํ ๋ ธ๋ ฅ์ด ์ ์ฌ์ ์ด์ต์ ๋นํด ์ ๋นํ๋์ง ์์ ์ ์์ต๋๋ค.
4. ์ทจ์ฝํ ๋ถ๋ถ์ ์๋ณํ๊ธฐ ์ํด ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ์ธ์
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ ์ฝ๋์์ ์ ์ ํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ถ์กฑํ ์์ญ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ณต์กํ ๋ก์ง, ์ฃ์ง ์ผ์ด์ค ๋ฐ ์ ์ฌ์ ์ธ ์ค๋ฅ ์กฐ๊ฑด์ ํนํ ์ฃผ์ํ๋ฉด์ ์ด๋ฌํ ์์ญ์ ํ ์คํธ ๋ ธ๋ ฅ์ ์ง์คํ์ธ์.
๋จ์ํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋์ด๊ธฐ ์ํด ๋ฌด์์ ํ ์คํธ๋ฅผ ์์ฑํ์ง ๋ง์ธ์. ์ฝ๋์ ํน์ ์์ญ์ด ์ ์ปค๋ฒ๋์ง ์๋์ง ์ดํดํ๋ ๋ฐ ์๊ฐ์ ํฌ์ํ๊ณ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ธ์. ์ฌ๊ธฐ์๋ ์ฝ๋๋ฅผ ๋ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ๋ ๊ตฌ์ฒด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
5. ์ฃ์ง ์ผ์ด์ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๋ฌด์ํ์ง ๋ง์ธ์
์ฃ์ง ์ผ์ด์ค์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ํ ์คํธ๋ฅผ ์์ฑํ ๋ ์ข ์ข ๊ฐ๊ณผ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ ์จ๊ฒจ์ง ๋ฒ๊ทธ์ ์ทจ์ฝ์ ์ ๋๋ฌ๋ผ ์ ์๊ธฐ ๋๋ฌธ์ ํ ์คํธํด์ผ ํ ์ค์ํ ์์ญ์ ๋๋ค. ์ ํจํ์ง ์๊ฑฐ๋ ์์์น ๋ชปํ ๊ฐ์ ํฌํจํ์ฌ ๊ด๋ฒ์ํ ์ ๋ ฅ์ ๋ค๋ฃจ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ชจ๋์ด ์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ธ์.
์๋ฅผ ๋ค์ด, ๋ชจ๋์ด ๊ณ์ฐ์ ์ํํ๋ ๊ฒฝ์ฐ ํฐ ์ซ์, ์์ ์ซ์, 0, ์์๋ก ํ ์คํธํ์ธ์. ๋ชจ๋์ด ์ธ๋ถ API์ ์ํธ ์์ฉํ๋ ๊ฒฝ์ฐ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด๊ณผ ์ ์ฌ์ ์ธ ์ค๋ฅ ์๋ต์ผ๋ก ํ ์คํธํ์ธ์.
6. ๋ชจ๋์ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๋ชจ์(Mocking) ๋ฐ ์คํฐ๋น(Stubbing)์ ์ฌ์ฉํ์ธ์
์ธ๋ถ ๋ฆฌ์์ค๋ ๋ค๋ฅธ ๋ชจ๋์ ์์กดํ๋ ๋ชจ๋์ ํ ์คํธํ ๋, ๋ชจ์ ๋ฐ ์คํฐ๋น ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ฒฉ๋ฆฌํ์ธ์. ์ด๋ฅผ ํตํด ์์กด์ฑ์ ๋์์ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์์ต๋๋ค.
๋ชจ์๋ ํ ์คํธ ์ค์ ์ ์ดํ๊ณ ์กฐ์ํ ์ ์๋ ์์กด์ฑ์ ์๋ฎฌ๋ ์ด์ ๋ฒ์ ์ ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์คํฐ๋น์ ์์กด์ฑ์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฐ์ด๋ ๋์์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ Jest์ ๋ด์ฅ ๋ชจ์ ๊ธฐ๋ฅ๊ณผ Sinon.js๊ฐ ์์ต๋๋ค.
7. ์ง์์ ์ผ๋ก ํ ์คํธ๋ฅผ ๊ฒํ ํ๊ณ ๋ฆฌํฉํ ๋งํ์ธ์
ํ ์คํธ๋ ์ฝ๋๋ฒ ์ด์ค์์ ์ผ๊ธ ์๋ฏผ์ผ๋ก ์ทจ๊ธ๋์ด์ผ ํฉ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ํ ์คํธ๋ฅผ ๊ฒํ ํ๊ณ ๋ฆฌํฉํ ๋งํ์ฌ ์ฌ์ ํ ๊ด๋ จ์ฑ์ด ์๊ณ ์ ํํ๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์. ์ฝ๋๊ฐ ์งํํจ์ ๋ฐ๋ผ ํ ์คํธ๋ ํจ๊ป ์งํํด์ผ ํฉ๋๋ค.
์ค๋๋๊ฑฐ๋ ์ค๋ณต๋ ํ ์คํธ๋ฅผ ์ ๊ฑฐํ๊ณ , ๊ธฐ๋ฅ์ด๋ ๋์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋๋ก ํ ์คํธ๋ฅผ ์ ๋ฐ์ดํธํ์ธ์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ํ ์คํธ ์์ ์ ์ฝ๊ฒ ๊ธฐ์ฌํ ์ ์๋๋ก ํ ์คํธ๊ฐ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด์ง ํ์ธํ์ธ์.
8. ๋ค์ํ ์ ํ์ ํ ์คํธ๋ฅผ ๊ณ ๋ คํ์ธ์
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ข ์ข ๋จ์ ํ ์คํธ์ ๊ด๋ จ์ด ์์ง๋ง, ํตํฉ ํ ์คํธ ๋ฐ E2E(end-to-end) ํ ์คํธ์ ๊ฐ์ ๋ค๋ฅธ ์ ํ์ ํ ์คํธ์๋ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๊ฐ ์ ํ์ ํ ์คํธ๋ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋ฉฐ ์ ๋ฐ์ ์ธ ์ฝ๋ ํ์ง์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.
- ๋จ์ ํ ์คํธ: ๊ฐ๋ณ ๋ชจ๋์ด๋ ํจ์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํฉ๋๋ค. ๊ฐ์ฅ ๋ฎ์ ์์ค์์ ์ฝ๋์ ์ ํ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ํตํฉ ํ ์คํธ: ๋ค๋ฅธ ๋ชจ๋์ด๋ ์ปดํฌ๋ํธ ๊ฐ์ ์ํธ ์์ฉ์ ํ ์คํธํฉ๋๋ค. ๋ชจ๋๋ค์ด ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ๊ฒ์ฆํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- E2E ํ ์คํธ: ์ฌ์ฉ์ ๊ด์ ์์ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํฉ๋๋ค. ์ค์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๋ก ์๋ํ๋์ง ๊ฒ์ฆํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
์ธ ๊ฐ์ง ์ ํ์ ํ ์คํธ๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๊ท ํ ์กํ ํ ์คํธ ์ ๋ต์ ์ํด ๋ ธ๋ ฅํ๊ณ , ๊ฐ ์ ํ์ด ์ ์ฒด ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ๊ธฐ์ฌํ๋๋ก ํ์ธ์.
9. ๋น๋๊ธฐ ์ฝ๋์ ์ ์ํ์ธ์
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํ ์คํธ๊ฐ Promise, Observable, ์ฝ๋ฐฑ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ธ์. `async/await` ๋๋ `done` ์ฝ๋ฐฑ๊ณผ ๊ฐ์ ์ ์ ํ ํ ์คํธ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํ ์คํธ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ธํ๊ธฐ ์ ์ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋๋ก ํ์ธ์.
๋ํ ๋น๋๊ธฐ ์ฝ๋์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ธ ๊ฒฝ์ ์กฐ๊ฑด์ด๋ ํ์ด๋ฐ ๋ฌธ์ ์ ์ ์ํ์ธ์. ์ด๋ฌํ ์๋๋ฆฌ์ค๋ฅผ ๊ตฌ์ฒด์ ์ผ๋ก ๋์์ผ๋ก ํ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๋ชจ๋์ด ์ด๋ฌํ ์ ํ์ ๋ฌธ์ ์ ํ๋ ฅ์ ์ผ๋ก ๋์ฒํ ์ ์๋๋ก ํ์ธ์.
10. 100% ์ปค๋ฒ๋ฆฌ์ง์ ์ง์ฐฉํ์ง ๋ง์ธ์
๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ๋ ธ๋ ฅํ๋ ๊ฒ์ ์ข์ ๋ชฉํ์ด์ง๋ง, 100% ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ์ง์ฐฉํ๋ ๊ฒ์ ๋น์์ฐ์ ์ผ ์ ์์ต๋๋ค. ๋ชจ๋ ์ฝ๋ ๋ผ์ธ์ ํ ์คํธํ๋ ๊ฒ์ด ์ค์ฉ์ ์ด์ง ์๊ฑฐ๋ ๋น์ฉ ํจ์จ์ ์ด์ง ์์ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ์ฝ๋๋ ๋ณต์ก์ฑ์ด๋ ์ธ๋ถ ๋ฆฌ์์ค์ ๋ํ ์์กด์ฑ ๋๋ฌธ์ ํ ์คํธํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
์ฝ๋์ ๊ฐ์ฅ ์ค์ํ๊ณ ๋ณต์กํ ๋ถ๋ถ์ ํ ์คํธํ๋ ๋ฐ ์ง์คํ๊ณ , ๋ชจ๋ ๋จ์ผ ๋ชจ๋์ ๋ํด 100% ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ ๋ํด ๋๋ฌด ๊ฑฑ์ ํ์ง ๋ง์ธ์. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ฌ๋ฌ ์งํ ์ค ํ๋์ผ ๋ฟ์ด๋ฉฐ, ์ ๋์ ์ธ ๊ท์น์ด ์๋๋ผ ๊ฐ์ด๋๋ก ์ฌ์ฉ๋์ด์ผ ํจ์ ๊ธฐ์ตํ์ธ์.
CI/CD ํ์ดํ๋ผ์ธ์์์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
CI/CD(์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ) ํ์ดํ๋ผ์ธ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํฉํ๋ ๊ฒ์ ์ฝ๋๊ฐ ๋ฐฐํฌ๋๊ธฐ ์ ์ ํน์ ํ์ง ํ์ค์ ์ถฉ์กฑํ๋์ง ํ์ธํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์์ฑ ๊ตฌ์ฑ: ๊ฐ ๋น๋ ๋๋ ํ ์คํธ ์คํ ํ ์๋์ผ๋ก ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋๋ก CI/CD ์์คํ ์ ์ค์ ํ์ธ์. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๋ ์คํฌ๋ฆฝํธ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ฑํํ์ฌ ํ ์คํธ๋ฅผ ์คํํ๋ ๋จ๊ณ(์: Jest์์ `npm test -- --coverage`)๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ปค๋ฒ๋ฆฌ์ง ์๊ณ๊ฐ ์ค์ : ํ๋ก์ ํธ์ ๋ํ ์ต์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์๊ณ๊ฐ์ ์ ์ํ์ธ์. ์ด๋ฌํ ์๊ณ๊ฐ์ ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง, ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง, ํจ์ ์ปค๋ฒ๋ฆฌ์ง ๋ฑ์ ๋ํด ํ์ฉ ๊ฐ๋ฅํ ์ต์ ์ปค๋ฒ๋ฆฌ์ง ์์ค์ ๋ํ๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ์ ๊ตฌ์ฑ ํ์ผ์์ ์ด๋ฌํ ์๊ณ๊ฐ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋ ์คํจ ์ฒ๋ฆฌ: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ ์๋ ์๊ณ๊ฐ ์๋๋ก ๋จ์ด์ง๋ฉด ๋น๋๊ฐ ์คํจํ๋๋ก CI/CD ์์คํ ์ ๊ตฌ์ฑํ์ธ์. ์ด๋ ๋ถ์ถฉ๋ถํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ์ฝ๋๊ฐ ํ๋ก๋์ ์ ๋ฐฐํฌ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ปค๋ฒ๋ฆฌ์ง ๊ฒฐ๊ณผ ๋ณด๊ณ : ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ CI/CD ์์คํ ๊ณผ ํตํฉํ์ฌ ์ปค๋ฒ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ช ํํ๊ณ ์ ๊ทผํ๊ธฐ ์ฌ์ด ํ์์ผ๋ก ํ์ํ์ธ์. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ปค๋ฒ๋ฆฌ์ง ์ถ์ธ๋ฅผ ์ฝ๊ฒ ์ถ์ ํ๊ณ ๊ฐ์ ์ด ํ์ํ ์์ญ์ ์๋ณํ ์ ์์ต๋๋ค.
- ์ปค๋ฒ๋ฆฌ์ง ๋ฐฐ์ง ์ฌ์ฉ: ํ๋ก์ ํธ์ README ํ์ผ์ด๋ CI/CD ๋์๋ณด๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐฐ์ง๋ฅผ ํ์ํ์ธ์. ์ด ๋ฐฐ์ง๋ ํ์ฌ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์ํ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ฏ๋ก ํ๋์ ์ปค๋ฒ๋ฆฌ์ง ์์ค์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ฝ์ต๋๋ค. Coveralls ๋ฐ Codecov์ ๊ฐ์ ์๋น์ค๊ฐ ์ด๋ฌํ ๋ฐฐ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์ (GitHub Actions์ Jest ๋ฐ Codecov ์ฌ์ฉ):
`.github/workflows/ci.yml` ํ์ผ ์์ฑ:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Use Node.js 16
uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: Install dependencies
run: npm install
- name: Run tests with coverage
run: npm test -- --coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v2
with:
token: ${{ secrets.CODECOV_TOKEN }} # Required if the repository is private
fail_ci_if_error: true
verbose: true
๋น๊ณต๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ ์ค์ ์์ `CODECOV_TOKEN` ์ํฌ๋ฆฟ์ ์ค์ ํด์ผ ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ๊ฐ์น ์๋ ๋๊ตฌ์ด์ง๋ง, ๊ทธ ํ๊ณ์ ์ ์ฌ์ ์ธ ํจ์ ์ ์ธ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํผํด์ผ ํ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ค์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฎ์ ์ปค๋ฒ๋ฆฌ์ง ์์ญ ๋ฌด์: ์ ์ฒด ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋์ด๋ ๋ฐ ์ง์คํ๊ณ ์ง์์ ์ผ๋ก ๋ฎ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ณด์ด๋ ํน์ ์์ญ์ ๊ฐ๊ณผํ๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ฌํ ์์ญ์๋ ์ข ์ข ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ๋ก์ง์ด๋ ์ฃ์ง ์ผ์ด์ค๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํ๋๋ผ๋ ์ด๋ฌํ ์์ญ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ ํ๋ ๊ฒ์ ์ฐ์ ์ํ์ธ์.
- ์ฌ์ํ ํ ์คํธ ์์ฑ: ์๋ฏธ ์๋ ๋จ์ธ(assertion) ์์ด ๋จ์ํ ์ฝ๋๋ฅผ ์คํํ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ์ค์ ๋ก ์ฝ๋ ํ์ง์ ๊ฐ์ ํ์ง ์์ผ๋ฉด์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ธ์์ ์ผ๋ก ๋ถํ๋ฆด ์ ์์ต๋๋ค. ๋ค๋ฅธ ์กฐ๊ฑด ํ์์ ์ฝ๋์ ๋์์ ์ ํ์ฑ์ ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํ์ธ์.
- ์ค๋ฅ ์ฒ๋ฆฌ ํ ์คํธํ์ง ์๊ธฐ: ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฌ๊ณ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ค๋ฅ ์กฐ๊ฑด์ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ฝ๋๊ฐ ์ด๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋์ง(์: ์์ธ ๋ฐ์, ์ค๋ฅ ๋ก๊น ๋๋ ์ ๋ณด ๋ฉ์์ง ํ์) ํ์ธํ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์.
- ๋จ์ ํ ์คํธ์๋ง ์์กด: ๋จ์ ํ ์คํธ๋ ๊ฐ๋ณ ๋ชจ๋์ ์ ํ์ฑ์ ๊ฒ์ฆํ๋ ๋ฐ ์ค์ํ์ง๋ง, ํตํฉ๋ ์์คํ ์์ ๋ชจ๋์ด ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ ๊ฒ์ด๋ผ๊ณ ๋ณด์ฅํ์ง๋ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ฒด์ ์ผ๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ํตํฉ ํ ์คํธ ๋ฐ E2E ํ ์คํธ๋ก ๋จ์ ํ ์คํธ๋ฅผ ๋ณด์ํ์ธ์.
- ์ฝ๋ ๋ณต์ก์ฑ ๋ฌด์: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ ์คํธ ๋์ ์ฝ๋์ ๋ณต์ก์ฑ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค. ๋์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ๊ฐ๋จํ ํจ์๋ ๋์ผํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ๋ณต์กํ ํจ์๋ณด๋ค ์ํ์ด ์ ์ ์ ์์ต๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋์์ ํนํ ๋ณต์กํ๊ณ ๋ ์ฒ ์ ํ ํ ์คํธ๊ฐ ํ์ํ ์์ญ์ ์๋ณํ์ธ์.
- ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋๊ตฌ๊ฐ ์๋ ๋ชฉํ๋ก ์ทจ๊ธ: ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ํ ์คํธ ๋ ธ๋ ฅ์ ์๋ดํ๋ ๋๊ตฌ๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ, ๊ทธ ์์ฒด๊ฐ ๋ชฉํ๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค. ํ ์คํธ์ ํ์ง์ด๋ ๊ด๋ จ์ฑ์ ํฌ์ํด์ผ ํ๋ค๋ฉด ๋งน๋ชฉ์ ์ผ๋ก 100% ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ๋ ธ๋ ฅํ์ง ๋ง์ธ์. ์ฝ๊ฐ ๋ฎ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฐ์๋ค์ด๋๋ผ๋ ์ค์ ๊ฐ์น๋ฅผ ์ ๊ณตํ๋ ์๋ฏธ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํ์ธ์.
์ซ์๋ฅผ ๋์ด์: ํ ์คํธ์ ์ง์ ์ธก๋ฉด
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง์ ๊ฐ์ ์ ๋์ ์งํ๋ ๋ถ์ธํ ์ ์์ด ์ ์ฉํ์ง๋ง, ์ํํธ์จ์ด ํ ์คํธ์ ์ง์ ์ธก๋ฉด์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ด๋ค ์ฝ๋๊ฐ ์คํ๋๋์ง ์๋ ค์ฃผ์ง๋ง, ๊ทธ ์ฝ๋๊ฐ ์ผ๋ง๋ ์ ํ ์คํธ๋๋์ง๋ ์๋ ค์ฃผ์ง ์์ต๋๋ค.
ํ ์คํธ ์ค๊ณ: ํ ์คํธ์ ์๋ณด๋ค ์ง์ด ๋ ์ค์ํฉ๋๋ค. ์ ์ค๊ณ๋ ํ ์คํธ๋ ์ง์ค์ ์ด๊ณ , ๋ ๋ฆฝ์ ์ด๋ฉฐ, ๋ฐ๋ณต ๊ฐ๋ฅํ๊ณ , ์ฃ์ง ์ผ์ด์ค, ๊ฒฝ๊ณ ์กฐ๊ฑด ๋ฐ ์ค๋ฅ ์กฐ๊ฑด์ ํฌํจํ ๊ด๋ฒ์ํ ์๋๋ฆฌ์ค๋ฅผ ๋ค๋ฃน๋๋ค. ์๋ชป ์ค๊ณ๋ ํ ์คํธ๋ ๋ถ์์ ํ๊ณ ์ ๋ขฐํ ์ ์์ผ๋ฉฐ ์๋ชป๋ ์์ ๊ฐ์ ์ค ์ ์์ต๋๋ค.
ํ ์คํธ ์ฉ์ด์ฑ: ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ ์ข ์ข ๋์ ์ค๊ณ์ ์ ํธ์ ๋๋ค. ๋ชจ๋์์ด๊ณ , ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ, ํ ์คํธ๋ฅผ ์ํด ์ฝ๊ฒ ๊ฒฉ๋ฆฌํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ธ์. ์์กด์ฑ ์ฃผ์ , ๋ชจ์ ๋ฐ ๊ธฐํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ฝ๋์ ํ ์คํธ ์ฉ์ด์ฑ์ ํฅ์์ํค์ธ์.
ํ ๋ฌธํ: ๊ฐ๋ ฅํ ํ ์คํธ ๋ฌธํ๋ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๊ฐ๋ฐ์๋ค์ด ์ผ์ฐ ๊ทธ๋ฆฌ๊ณ ์์ฃผ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ , ์ฝ๋๋ฒ ์ด์ค์์ ํ ์คํธ๋ฅผ ์ผ๊ธ ์๋ฏผ์ผ๋ก ์ทจ๊ธํ๋ฉฐ, ์ง์์ ์ผ๋ก ํ ์คํธ ๊ธฐ์ ์ ํฅ์์ํค๋๋ก ์ฅ๋ คํ์ธ์.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ฝ๋์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ํฅ์์ํค๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ฃผ์ ์งํ๋ฅผ ์ดํดํ๊ณ , ์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ฉํ์ฌ ํ ์คํธ๋์ง ์์ ์์ญ์ ์๋ณํ๊ณ , ๋ฒ๊ทธ์ ์ํ์ ์ค์ด๋ฉฐ, ๋ฆฌํฉํ ๋ง์ ์ฉ์ดํ๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์ฌ๋ฌ ์งํ ์ค ํ๋์ผ ๋ฟ์ด๋ฉฐ, ์ ๋์ ์ธ ๊ท์น์ด ์๋๋ผ ๊ฐ์ด๋๋ก ์ฌ์ฉ๋์ด์ผ ํจ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฝ๋๋ฅผ ์ฒ ์ ํ ์คํํ๊ณ ์ค์ํ ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ค๋ฃจ๋ ์๋ฏธ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํ๊ณ , ์ฝ๋๊ฐ ํ๋ก๋์ ์ ๋ฐฐํฌ๋๊ธฐ ์ ์ ํน์ ํ์ง ํ์ค์ ์ถฉ์กฑํ๋๋ก CI/CD ํ์ดํ๋ผ์ธ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํตํฉํ์ธ์. ์ ๋์ ์งํ์ ์ง์ ๊ณ ๋ ค ์ฌํญ์ ๊ท ํ์ ๋ง์ถค์ผ๋ก์จ, ๊ณ ํ์ง ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ ๊ณตํ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ๊ณผ์ ์ธ ํ ์คํธ ์ ๋ต์ ๋ง๋ค ์ ์์ต๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํฌํจํ ๊ฒฌ๊ณ ํ ํ ์คํธ ๊ดํ์ ๊ตฌํํจ์ผ๋ก์จ, ์ ์ธ๊ณ์ ํ๋ค์ ์ํํธ์จ์ด ํ์ง์ ๊ฐ์ ํ๊ณ , ๊ฐ๋ฐ ๋น์ฉ์ ์ค์ด๋ฉฐ, ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ณ ํ ์คํธํ ๋ ๊ธ๋ก๋ฒ ์ฌ๊ณ ๋ฐฉ์์ ์์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ตญ์ ์ ์ธ ์ฌ์ฉ์์ ๋ค์ํ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํฌ ์ ์์ต๋๋ค.