์ฃผ์ ์งํ๋ฅผ ์๊ฐํํ๊ณ , ์ถ์ธ๋ฅผ ์ถ์ ํ๋ฉฐ, ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋ ๊ตฌ์ถ ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋: ์งํ, ์๊ฐํ, ๊ทธ๋ฆฌ๊ณ ์ถ์ธ ๋ถ์
์ค๋๋ ๊ณผ ๊ฐ์ด ๋น ๋ฅด๊ฒ ๋ณํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋์ ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๊ฒ์ ์ ๋ขฐํ ์ ์๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ ํต์ฌ ์งํ์ ๋ํ ์ค์ ์ง์ค์ ๋ทฐ๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐํ์ด ์งํ ์ํฉ์ ์ถ์ ํ๊ณ , ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ฉฐ, ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ์์ฌ ๊ฒฐ์ ์ ํตํด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ ํ ์ ์๋๋ก ๋์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ์ฝ๋ ํ์ง ๋์๋ณด๋ ์ฌ์ฉ์ ์ด์ , ์ถ์ ํด์ผ ํ ํ์ ์งํ, ๊ทธ๋ฆฌ๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๊ตฌํํ๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ด ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ฅผ ๊ตฌํํด์ผ ํ๋ ์ด์
์ ์ค๊ณ๋ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ฝ๋ ์ ์ง๋ณด์์ฑ ํฅ์: ์ํ ๋ณต์ก๋ ๋ฐ ์ฝ๋ ์ค๋ณต๊ณผ ๊ฐ์ ์งํ๋ฅผ ์ถ์ ํจ์ผ๋ก์จ ํ์ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ด ์์ญ์ ์๋ณํ๊ณ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๊ณ ๋จ์ํํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ๋ถ์ฑ ๊ฐ์: ๋์๋ณด๋๋ ์ฝ๋ ์ค๋ฉ, ์ทจ์ฝ์ ๋ฐ ๊ธฐํ ๊ธฐ์ ๋ถ์ฑ ๋ฌธ์ ๋ฅผ ๊ฐ์กฐํ์ฌ ํ์ด ๋ ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง๊ธฐ ์ ์ ์ฐ์ ์์๋ฅผ ์ ํ๊ณ ํด๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฝ๋ ๋ณด์ ๊ฐํ: ์๋ ค์ง ์ทจ์ฝ์ ์ ๋ฐ ๋ณด์ ํซ์คํ๊ณผ ๊ฐ์ ๋ณด์ ๊ด๋ จ ์งํ๋ ํ์ด ์ ์ฌ์ ์ธ ๋ณด์ ์ํ์ ์๋ณํ๊ณ ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ๋ฐ ํจ์จ์ฑ ์ฆ๋: ์ฝ๋ ํ์ง์ ๋ํ ๋ช ํํ ๊ทธ๋ฆผ์ ์ ๊ณตํจ์ผ๋ก์จ ๋์๋ณด๋๋ ํ์ด ๊ฐ์ฅ ์ฃผ์๊ฐ ํ์ํ ์์ญ์ ๋ ธ๋ ฅ์ ์ง์คํ๋๋ก ๋์ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๋จ์ถํ๊ณ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ ๊ฒฐ์ : ๋์๋ณด๋๋ ์งํ ์ํฉ์ ์ถ์ ํ๊ณ , ์ฝ๋ ๋ณ๊ฒฝ์ ์ํฅ์ ํ๊ฐํ๋ฉฐ, ์ฝ๋ ํ์ง ๊ฐ์ ์ ๋ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ๊ด์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํ ํ์ ๊ฐ์ : ๊ณต์ ๋์๋ณด๋๋ ํ์ ๊ฐ์ ํฌ๋ช ์ฑ๊ณผ ํ์ ์ ์ด์งํ์ฌ ์ฝ๋ ํ์ง์ ๋ํ ์ฃผ์ธ์์์ ๊ฐ๊ณ ๊ฐ์ ์ ์ํด ํจ๊ป ๋ ธ๋ ฅํ๋๋ก ์ฅ๋ คํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋์์ ์ถ์ ํด์ผ ํ ํต์ฌ ์งํ
๋์๋ณด๋์์ ์ถ์ ํ ํน์ ์งํ๋ ํ๋ก์ ํธ์ ํ์์ ๋ชฉํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ด๊ณ ํ์์ ์ธ ์งํ๊ฐ ์์ต๋๋ค:
1. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ ์๋ํ๋ ํ ์คํธ๋ก ์ปค๋ฒ๋๋ ์ฝ๋๋ฒ ์ด์ค์ ๋น์จ์ ์ธก์ ํฉ๋๋ค. ์ด๋ ํ ์คํธ ์ ๋ต์ ์์ ์ฑ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ์ ์ ํ๊ฒ ํ ์คํธ๋์ง ์์์ ์ ์๋ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง: ํ ์คํธ์ ์ํด ์คํ๋ ์ฝ๋์ ๊ตฌ๋ฌธ ๋น์จ์ ๋๋ค.
- ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง: ํ ์คํธ์ ์ํด ์คํ๋ ์ฝ๋์ ๋ถ๊ธฐ(์: if/else ๋ฌธ) ๋น์จ์ ๋๋ค.
- ํจ์ ์ปค๋ฒ๋ฆฌ์ง: ํ ์คํธ์ ์ํด ํธ์ถ๋ ์ฝ๋์ ํจ์ ๋น์จ์ ๋๋ค.
์์: 80%์ ๊ตฌ๋ฌธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ํ๋ก์ ํธ๋ ํ ์คํธ ์ค์ ์ฝ๋ ๋ผ์ธ์ 80%๊ฐ ์คํ๋์์์ ์๋ฏธํฉ๋๋ค. ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ชฉํ๋ก ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ์ต๊ด์ด์ง๋ง, ์ปค๋ฒ๋ฆฌ์ง ์์ฒด๋ง์ผ๋ก๋ ํ ์คํธ์ ํ์ง์ ๋ณด์ฅํ์ง ์๋๋ค๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ ์คํธ๋ ๋ํ ์ ์์ฑ๋์ด์ผ ํ๋ฉฐ ์ค์ํ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ปค๋ฒํด์ผ ํฉ๋๋ค.
2. ์ํ ๋ณต์ก๋
์ํ ๋ณต์ก๋๋ ํ๋ก๊ทธ๋จ์ ์์ค ์ฝ๋๋ฅผ ํต๊ณผํ๋ ์ ํ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ์๋ฅผ ์ธก์ ํฉ๋๋ค. ์ด๋ ์ฝ๋์ ๋ณต์ก์ฑ๊ณผ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๋ ๋ฐ ํ์ํ ๋ ธ๋ ฅ์ ๋ํ ์งํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋์ ์ํ ๋ณต์ก๋๋ ์ข ์ข ํ ์คํธํ๊ธฐ ์ด๋ ต๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ํ๋ ๋๋ค.
์์: ์ํ ๋ณต์ก๋๊ฐ 1์ธ ํจ์๋ ์ฝ๋๋ฅผ ํต๊ณผํ๋ ๊ฒฝ๋ก๊ฐ ํ๋๋ฟ์ ๋๋ค(์: ๊ฐ๋จํ ๊ตฌ๋ฌธ ์ํ์ค). ์ํ ๋ณต์ก๋๊ฐ 5์ธ ํจ์๋ 5๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด๋ ๋ ๋ณต์กํ ์ ์ด ํ๋ฆ์ ๋ํ๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ํ ๋ณต์ก๋๊ฐ 10์ ์ด๊ณผํ๋ ํจ์๋ ์ ์คํ๊ฒ ๊ฒํ ํ๊ณ ์ ์ฌ์ ์ผ๋ก ๋ฆฌํฉํฐ๋งํด์ผ ํฉ๋๋ค.
3. ์ฝ๋ ์ค๋ณต
์ฝ๋ ์ค๋ณต(์ฝ๋ ํด๋ก ์ด๋ผ๊ณ ๋ ํจ)์ ๋์ผํ๊ฑฐ๋ ๋งค์ฐ ์ ์ฌํ ์ฝ๋๊ฐ ์ฝ๋๋ฒ ์ด์ค์ ์ฌ๋ฌ ์์น์ ๋ํ๋ ๋ ๋ฐ์ํฉ๋๋ค. ์ค๋ณต๋ ์ฝ๋๋ ๋ฒ๊ทธ์ ์ํ์ ์ฆ๊ฐ์ํค๊ณ , ์ฝ๋ ์ ์ง๋ณด์๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ค๋ฉฐ, ๋ถ์ผ์น๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฝ๋ ์ค๋ณต์ ์๋ณํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
์์: ๋ง์ฝ 10์ค์ ๋์ผํ ์ฝ๋ ๋ธ๋ก์ด ์ธ ๊ฐ์ ๋ค๋ฅธ ํจ์์์ ๋ฐ๋ณต๋๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค๋ฉด, ์ด๋ ์ฝ๋ ์ค๋ณต์ ๋ํ๋ ๋๋ค. ์ค๋ณต๋ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ์ถ์ถํ์ฌ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋ฉด ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
4. ์ฝ๋ ์ค๋ฉ
์ฝ๋ ์ค๋ฉ์ ์ฝ๋์ ๋ ๊น์ ๋ฌธ์ ์ ๋ํ ํ๋ฉด์ ์ธ ์งํ์ ๋๋ค. ๋ฐ๋์ ๋ฒ๊ทธ๋ ์๋์ง๋ง, ์ข์ง ์์ ์ค๊ณ ์ ํ์ด๋ ๋์ ์ฝ๋ฉ ์ต๊ด์ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ฝ๋ ์ค๋ฉ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ธด ๋ฉ์๋/ํจ์: ๋๋ฌด ๊ธธ๊ณ ๋ณต์กํ ํจ์.
- ๊ฑฐ๋ํ ํด๋์ค: ๋๋ฌด ๋ง์ ์ฑ ์์ ๊ฐ์ง ํด๋์ค.
- ์ค๋ณต๋ ์ฝ๋: ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณต๋๋ ์ฝ๋.
- ๊ฒ์ผ๋ฅธ ํด๋์ค: ๋๋ฌด ์ ์ ์ผ์ ํ๋ ํด๋์ค.
- ๋ฐ์ดํฐ ๋ญ์น: ์ข ์ข ํจ๊ป ๋ํ๋๋ ๋ฐ์ดํฐ ๊ทธ๋ฃน.
์์: ๋๋ฌด ๋ง์ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ํจ์๋ ๊ธด ๋ฉ์๋๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ํจ์๋ฅผ ๋ ์๊ณ ์ง์ค๋ ํจ์๋ก ๋๋๋ฉด ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
5. ๋ณด์ ์ทจ์ฝ์
๋ณด์ ์ทจ์ฝ์ ์ ๊ณต๊ฒฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์์ํค๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ์ฝ๋์ ๊ฒฐํจ์ ๋๋ค. ๋ณด์ ์ทจ์ฝ์ ์ ์ถ์ ํ๋ ๊ฒ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํธํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ฐ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS): ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ํ๋ ๊ณต๊ฒฉ.
- SQL ์ธ์ ์ : ์ ์ฑ SQL ์ฝ๋๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ์ฃผ์ ํ๋ ๊ณต๊ฒฉ.
- ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ(CSRF): ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ์์ ์ ์ํํ๋๋ก ์์ด๋ ๊ณต๊ฒฉ.
- ํ๋กํ ํ์ ์ค์ผ: ์๋ฐ์คํฌ๋ฆฝํธ ํ๋กํ ํ์ ์ ์กฐ์ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์ํฅ์ ์ค ์ ์๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ฃผ์ ํ๋ ๊ฒ.
- ์์กด์ฑ ์ทจ์ฝ์ : ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉํ๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ์ ์ทจ์ฝ์ .
์์: ๋๋ฆฌ ์ฌ์ฉ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ทจ์ฝํ ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ ค์ง ๋ณด์ ๊ณต๊ฒฉ์ ๋ ธ์ถ๋ ์ ์์ต๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ์์กด์ฑ์ ์ทจ์ฝ์ ์ ์ค์บํ๊ณ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์ค์ํ ๋ณด์ ๊ดํ์ ๋๋ค.
6. ๊ธฐ์ ๋ถ์ฑ
๊ธฐ์ ๋ถ์ฑ๋ ๋ ์ค๋ ๊ฑธ๋ฆด ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋์ ์ง๊ธ ๋น์ฅ ์ฌ์ด ํด๊ฒฐ์ฑ ์ ์ ํํจ์ผ๋ก์จ ๋ฐ์ํ๋ ์๋ฌต์ ์ธ ์ฌ์์ ๋น์ฉ์ ๋ํ๋ ๋๋ค. ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ผ๋ถ ๊ธฐ์ ๋ถ์ฑ๋ ํผํ ์ ์์ง๋ง, ๊ทธ๊ฒ์ด ์ถ์ ๋์ด ํ๋ก์ ํธ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ์ถ์ ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์์: ๋ง๊ฐ์ผ์ ๋ง์ถ๊ธฐ ์ํด ๋น ๋ฅด๊ณ ์ง์ ๋ถํ ์์๋ฐฉํธ์ ์ฌ์ฉํ๊ธฐ๋ก ์ ํํ๋ฉด ๊ธฐ์ ๋ถ์ฑ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์์๋ฐฉํธ์ ๋ฌธ์ํํ๊ณ ๋์ค์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ ์๊ฐ์ ์์ฝํ๋ฉด ์ด ๋ถ์ฑ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
7. ์ ์ง๋ณด์์ฑ ์ง์
์ ์ง๋ณด์์ฑ ์ง์(MI)๋ ์ํํธ์จ์ด๋ฅผ ์ผ๋ง๋ ์ฝ๊ฒ ์ ์ง๋ณด์ํ ์ ์๋์ง๋ฅผ ์ ๋ํํ๋ ค๋ ๋ณตํฉ ์งํ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ํ ๋ณต์ก๋, ์ฝ๋ ๋ณผ๋ฅจ, Halstead ๋ณผ๋ฅจ๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํฉ๋๋ค. MI ์ ์๊ฐ ๋์์๋ก ์ผ๋ฐ์ ์ผ๋ก ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ํ๋ ๋๋ค.
์์: 100์ ๊ฐ๊น์ด MI ์ ์๋ ์ ์ง๋ณด์์ฑ์ด ๋งค์ฐ ๋์ ์ฝ๋๋ฅผ ๋ํ๋ด๋ฉฐ, 0์ ๊ฐ๊น์ด ์ ์๋ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ํ๋ ๋๋ค.
8. ์ฝ๋ ๋ผ์ธ ์(LOC)
ํ์ง์ ์ง์ ์ ์ธ ์งํ๋ ์๋์ง๋ง, ์ฝ๋ ๋ผ์ธ ์๋ ๋ค๋ฅธ ์งํ๋ฅผ ๋ถ์ํ ๋ ๋งฅ๋ฝ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ํ ๋ณต์ก๋๊ฐ ๋์ ํฐ ํจ์๋ ๋์ผํ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์์ ํจ์๋ณด๋ค ๋ ์ฐ๋ ค๋ฉ๋๋ค.
์์: ๋ค๋ฅธ ๋ชจ๋์ LOC๋ฅผ ๋น๊ตํ๋ฉด ๋ฆฌํฉํฐ๋ง์ด๋ ์ฝ๋ ๋ถํ ์ ์ด์ ์ ์ป์ ์ ์๋ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋ ๊ตฌ์ถํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ต๋๋ค:
1. SonarQube ์ฌ์ฉํ๊ธฐ
SonarQube๋ ์ฝ๋ ํ์ง์ ์ง์์ ์ธ ๊ฒ์ฌ๋ฅผ ์ํ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์คํ ์์ค ํ๋ซํผ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ฉฐ ์ฝ๋ ํ์ง ์งํ์ ๋ํ ํฌ๊ด์ ์ธ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
SonarQube๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ํตํฉํ๋ ๋จ๊ณ:
- SonarQube ์ค์น ๋ฐ ๊ตฌ์ฑ: SonarQube ์๋ฒ๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ค์นํ๊ณ ํ๋ก์ ํธ์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ฐ๊ฒฐํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
- SonarScanner ์ค์น: ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ SonarQube ์๋ฒ๋ก ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ SonarScanner ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ค์นํฉ๋๋ค.
- SonarScanner ๊ตฌ์ฑ: ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ `sonar-project.properties` ํ์ผ์ ๋ง๋ค์ด ํ๋ก์ ํธ ์ธ๋ถ ์ ๋ณด๋ก SonarScanner๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ๋ถ์ ์คํ: SonarScanner ๋ช ๋ น์ ์คํํ์ฌ ์ฝ๋๋ฅผ ๋ถ์ํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๋ณด๊ธฐ: SonarQube ์น ์ธํฐํ์ด์ค์ ์ ์ํ์ฌ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ฝ๋ ํ์ง ์งํ๋ฅผ ์ถ์ ํฉ๋๋ค.
`sonar-project.properties` ํ์ผ ์์:
sonar.projectKey=my-javascript-project
sonar.projectName=My JavaScript Project
sonar.projectVersion=1.0
sonar.sources=src
sonar.javascript.linter.eslint.reportPaths=eslint-report.json
sonar.javascript.jstest.reportsPath=coverage/lcov.info
2. ESLint ๋ฐ ๊ธฐํ ๋ฆฐํฐ ์ฌ์ฉํ๊ธฐ
ESLint๋ ์ฝ๋ฉ ์คํ์ผ ๋ฌธ์ , ์ ์ฌ์ ์ค๋ฅ, ์ฝ๋ ์ค๋ฉ์ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ๋์์ด ๋๋ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฐํฐ์ ๋๋ค. JSHint๋ StandardJS์ ๊ฐ์ ๋ค๋ฅธ ๋ฆฐํฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ESLint๋ฅผ ํ๋ก์ ํธ์ ํตํฉํ๋ ๋จ๊ณ:
- ESLint ์ค์น: npm ๋๋ yarn์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ESLint๋ฅผ ์ค์นํฉ๋๋ค: `npm install --save-dev eslint` ๋๋ `yarn add --dev eslint`.
- ESLint ๊ตฌ์ฑ: ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ `.eslintrc.js` ๋๋ `.eslintrc.json` ํ์ผ์ ๋ง๋ค์ด ์ ํธํ๋ ๊ท์น์ผ๋ก ESLint๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
- ESLint ์คํ: ESLint๋ฅผ ์คํํ์ฌ ์ฝ๋๋ฅผ ๋ถ์ํฉ๋๋ค: `eslint .`
- ESLint ์๋ํ: ๋น๋ ํ๋ก์ธ์ค๋ IDE์ ESLint๋ฅผ ํตํฉํ์ฌ ์ฝ๋ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํ์ธํฉ๋๋ค.
`.eslintrc.js` ํ์ผ ์์:
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 12,
sourceType: 'module',
},
plugins: [
'react',
],
rules: {
'no-unused-vars': 'warn',
'no-console': 'warn',
'react/prop-types': 'off',
},
};
ESLint ๊ฒฐ๊ณผ ์๊ฐํ: ESLint์์ ๋ณด๊ณ ์๋ฅผ ์์ฑํ์ฌ ๋์๋ณด๋์ ํ์ํ ์ ์์ต๋๋ค. `eslint-json`๊ณผ ๊ฐ์ ๋๊ตฌ๋ ESLint ์ถ๋ ฅ์ ์๊ฐํ์ ์ ํฉํ JSON ํ์์ผ๋ก ๋ณํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
3. ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ ์ฌ์ฉํ๊ธฐ
Istanbul (nyc) ๋๋ Mocha์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ์ ๋ํ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์ ์์ฑ ๋จ๊ณ:
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ ์ค์น: Istanbul ๋๋ ๋ค๋ฅธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํฉ๋๋ค.
- ํ ์คํธ ๋ฌ๋ ๊ตฌ์ฑ: ํ ์คํธ ๋ฌ๋(์: Mocha, Jest)๊ฐ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ํ ์คํธ ์คํ: ํ ์คํธ๋ฅผ ์คํํ์ฌ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ณด๊ณ ์ ์๊ฐํ: `lcov-reporter`์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํํ๋ HTML ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
Jest์ Istanbul ์ฌ์ฉ ์์:
// package.json
{
"scripts": {
"test": "jest --coverage"
}
}
4. ๋ง์ถคํ ๋์๋ณด๋ ๊ตฌ์ถํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ ๋๊ตฌ์ ๊ธฐ์ ์ ์กฐํฉํ์ฌ ๋ง์ถคํ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ ์๋ ์์ต๋๋ค:
- ๋ฐ์ดํฐ ์์ง: ESLint, ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ ๋ฐ ๊ธฐํ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ํ์ง ์งํ๋ฅผ ์์งํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ: ์์ง๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ผ ์์คํ ์ ์ ์ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ ์๊ฐํ: Chart.js, D3.js, ๋๋ Highcharts์ ๊ฐ์ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ํ์ง ์งํ๋ฅผ ์๊ฐํํ๋ ๋ํํ ์ฐจํธ์ ๊ทธ๋ํ๋ฅผ ๋ง๋ญ๋๋ค.
- ๋์๋ณด๋ ํ๋ ์์ํฌ: React, Angular, ๋๋ Vue.js์ ๊ฐ์ ๋์๋ณด๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์๋ณด๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
Chart.js์ React ์ฌ์ฉ ์์:
// ๋ฆฌ์กํธ ์ปดํฌ๋ํธ
import React, { useEffect, useRef } from 'react';
import Chart from 'chart.js/auto';
const CodeCoverageChart = ({ coverageData }) => {
const chartRef = useRef(null);
useEffect(() => {
const chartCanvas = chartRef.current.getContext('2d');
new Chart(chartCanvas, {
type: 'bar',
data: {
labels: ['Statements', 'Branches', 'Functions', 'Lines'],
datasets: [{
label: 'Coverage %',
data: [coverageData.statements, coverageData.branches, coverageData.functions, coverageData.lines],
backgroundColor: ['rgba(255, 99, 132, 0.2)', 'rgba(54, 162, 235, 0.2)', 'rgba(255, 206, 86, 0.2)', 'rgba(75, 192, 192, 0.2)'],
borderColor: ['rgba(255, 99, 132, 1)', 'rgba(54, 162, 235, 1)', 'rgba(255, 206, 86, 1)', 'rgba(75, 192, 192, 1)'],
borderWidth: 1,
}],
},
options: {
scales: {
y: {
beginAtZero: true,
max: 100,
},
},
},
});
}, [coverageData]);
return ; // ๋ฆฌ์กํธ ํ๋๊ทธ๋จผํธ ์ฌ์ฉ
};
export default CodeCoverageChart;
์๊ฐ์ ๋ฐ๋ฅธ ์ถ์ธ ์๊ฐํ
์ฝ๋ ํ์ง ๋์๋ณด๋์ ์ฃผ์ ์ด์ ์ค ํ๋๋ ์๊ฐ์ ๋ฐ๋ฅธ ์ถ์ธ๋ฅผ ์ถ์ ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก์ ํธ๊ฐ ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ฝ๋ ํ์ง์ด ์ด๋ป๊ฒ ๊ฐ์ ๋๊ฑฐ๋ ์ ํ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ถ์ธ๋ฅผ ์๊ฐํํ๋ ค๋ฉด ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์งํ๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ๋ณด์ฌ์ฃผ๋ ์ฐจํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
์์: ์ง๋ 1๋ ๋์ ํน์ ๋ชจ๋์ ์ํ ๋ณต์ก๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ผ์ธ ์ฐจํธ๋ฅผ ๋ง๋ญ๋๋ค. ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ณ ์๋ค๋ฉด ํด๋น ๋ชจ๋์ ๋ฆฌํฉํฐ๋งํด์ผ ํ ์ ์์์ ๋ํ๋ ๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ ๋ฐ ๊ถ์ฅ ์ฌํญ
์ฝ๋ ํ์ง ๋์๋ณด๋๋ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ๊ณผ ๊ถ์ฅ ์ฌํญ์ผ๋ก ์ด์ด์ง ๋๋ง ์ ์ฉํฉ๋๋ค. ๋์๋ณด๋๋ ์ถ์ ๋๋ ์งํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ์ง์นจ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์:
- ๋ฎ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง: ํน์ ๋ชจ๋์ด๋ ํจ์์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋์ ๋๋ค.
- ๋์ ์ํ ๋ณต์ก๋: ๋ณต์กํ ํจ์๋ฅผ ๋ฆฌํฉํฐ๋งํ์ฌ ๋ณต์ก๋๋ฅผ ์ค์ ๋๋ค.
- ์ฝ๋ ์ค๋ณต: ์ค๋ณต๋ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ์ถ์ถํฉ๋๋ค.
- ๋ณด์ ์ทจ์ฝ์ : ์ทจ์ฝํ ์์กด์ฑ์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ฝ๋์ ๋ณด์ ๊ฒฐํจ์ ์์ ํฉ๋๋ค.
์ฝ๋ ํ์ง ๋์๋ณด๋ ์ ์ง๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ฝ๋ ํ์ง ๋์๋ณด๋๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ ์ง๋๋๋ก ํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ๋ถ์ ์๋ํ: ์ฝ๋ ํ์ง ๋ถ์์ ๋น๋ ํ๋ก์ธ์ค์ ํตํฉํ์ฌ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ณด๊ณ ์๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
- ๋ชฉํ ๋ฐ ๋์ ์ค์ : ์ฝ๋ ํ์ง ์งํ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋ชฉํ์ ๋์์ ์ ์ํ์ฌ ์งํ ์ํฉ์ ์ถ์ ํ๊ณ ์ฑ๊ณต์ ์ธก์ ํฉ๋๋ค.
- ์ ๊ธฐ์ ์ธ ๋์๋ณด๋ ๊ฒํ : ์ ๊ธฐ์ ์ผ๋ก ๋์๋ณด๋ ๊ฒํ ์ผ์ ์ ์ก์ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ๋ชฉํ ๋ฌ์ฑ ์งํ ์ํฉ์ ์ถ์ ํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๊ณต์ : ํฌ๋ช ์ฑ๊ณผ ํ์ ์ ์ฆ์งํ๊ธฐ ์ํด ๊ฐ๋ฐํ ๋ฐ ์ดํด๊ด๊ณ์์ ๋์๋ณด๋๋ฅผ ๊ณต์ ํฉ๋๋ค.
- ์ง์์ ์ธ ๊ฐ์ : ๋์๋ณด๋๊ฐ ๊ฐ์ฅ ๊ด๋ จ์ฑ ์๊ณ ์คํ ๊ฐ๋ฅํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋๋ก ์ง์์ ์ผ๋ก ํ๊ฐํ๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ ์ฝ๋๋ฒ ์ด์ค์ ํ์ง, ์ ์ง๋ณด์์ฑ, ๋ณด์์ ํฅ์์ํค๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ํต์ฌ ์งํ๋ฅผ ์ถ์ ํ๊ณ , ์ถ์ธ๋ฅผ ์๊ฐํํ๋ฉฐ, ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํจ์ผ๋ก์จ ์ ์ค๊ณ๋ ๋์๋ณด๋๋ ํ์ด ๋ ๋์ ์ํํธ์จ์ด๋ฅผ ๋ ๋นจ๋ฆฌ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค. SonarQube์ ๊ฐ์ ํ๋ซํผ์ ์ฌ์ฉํ๋ , ๋ฆฐํฐ ๋ฐ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ํ์ฉํ๋ , ๋ง์ถคํ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋ , ํต์ฌ์ ์ฝ๋ ํ์ง ๋ถ์์ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํตํฉํ๊ณ ์ด๋ฅผ ์ง์์ ์ธ ๋ ธ๋ ฅ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.