JavaScript ์ฝ๋ ํ์ง ๋์๋ณด๋์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ธ์. ํต์ฌ ์งํ๋ฅผ ์๊ฐํํ๊ณ , ์ถ์ธ๋ฅผ ๋ถ์ํ๋ฉฐ, ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์์ ํ์ํจ ๋ฌธํ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
JavaScript ์ฝ๋ ํ์ง ๋์๋ณด๋: ๋ฉํธ๋ฆญ ์๊ฐํ ๋ฐ ์ถ์ธ ๋ถ์ ์ฌ์ธต ๋ถ์
๋น ๋ฅด๊ฒ ๋ณํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ธ๊ณ์์ JavaScript๋ ์น์ ๋ณดํธ์ ์ธ ์ธ์ด๊ฐ ๋์์ผ๋ฉฐ, ์ํธ์์ฉ์ ์ธ ํ๋ก ํธ์๋ ๊ฒฝํ๋ถํฐ ๊ฐ๋ ฅํ ๋ฐฑ์๋ ์๋น์ค๊น์ง ๋ชจ๋ ๊ฒ์ ์ง์ํฉ๋๋ค. ํ๋ก์ ํธ๊ฐ ํ์ฅ๋๊ณ ํ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ, ์กฐ์ฉํ๊ณ ์๋ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ก ์ฝ๋ ํ์ง ์ ์ง์ ๋๋ค. ๋ฎ์ ํ์ง์ ์ฝ๋๋ ๋จ์ํ ๋ฏธ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์์ฐ์ฑ์ ๋ํ ์ง์ ์ ์ธ ์ธ๊ธ์ด๋ฉฐ, ์์ธก ๋ถ๊ฐ๋ฅํ ๋ฒ๊ทธ์ ์์ฒ์ด๊ณ , ํ์ ์ ์ฅ๋ฒฝ์ ๋๋ค. ์ด๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์์ฑํ๋ฉฐ, ๋ฐฉ์นํ๋ฉด ๊ฐ์ฅ ์ ๋งํ ํ๋ก์ ํธ์กฐ์ฐจ ๋ง๋น์ํฌ ์ ์์ต๋๋ค.
ํ๋ ๊ฐ๋ฐํ์ ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น์? ์ฃผ๊ด์ ์ธ ์ถ์ธก์์ ๋ฒ์ด๋ ๊ฐ๊ด์ ์ด๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ํต์ฐฐ๋ ฅ์ ์ป์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด์์ JavaScript ์ฝ๋ ํ์ง ๋์๋ณด๋์ ๋๋ค. ์ด๋ ๋จ์ํ ์ ์ ๋ณด๊ณ ์๊ฐ ์๋๋ผ ์ฝ๋๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋์ ์ด๊ณ ์ด์์๋ ์๊ฐ์ผ๋ก ์ ๊ณตํ๋ฉฐ, ๋ฉํธ๋ฆญ ์๊ฐํ ๋ฐ ์ค์ํ ์ถ์ธ ๋ถ์์ ์ํ ์ค์ ์ง์ค์ ํ๋ธ ์ญํ ์ ํฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ ๊ฐ๋ ฅํ ์ฝ๋ ํ์ง ๋์๋ณด๋๋ฅผ ๋ง๋ค๊ณ ํ์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์๋ดํด ๋๋ฆฝ๋๋ค. ์ถ์ ํด์ผ ํ ํ์ ๋ฉํธ๋ฆญ, ์ฌ์ฉํ ๋๊ตฌ, ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ๊ฒ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฒด ์์ง๋์ด๋ง ์กฐ์ง์ ์ธ๋ ค ํผ์ง๋ ์ง์์ ์ธ ๊ฐ์ ๋ฌธํ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํ์ํ ๊ฒ์ ๋๋ค.
์ฝ๋ ํ์ง ๋์๋ณด๋๋ ๋ฌด์์ด๋ฉฐ ์ ํ์์ ์ธ๊ฐ์?
ํต์ฌ์ ์ผ๋ก ์ฝ๋ ํ์ง ๋์๋ณด๋๋ ์์ค ์ฝ๋์ ์ํ์ ๋ํ ์ฃผ์ ์งํ๋ฅผ ์๊ฐ์ ์ผ๋ก ์ถ์ , ๋ถ์ ๋ฐ ํ์ํ๋ ์ ๋ณด ๊ด๋ฆฌ ๋๊ตฌ์ ๋๋ค. ๋ค์ํ ๋ถ์ ๋๊ตฌ(๋ฆฐํฐ, ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์, ์ ์ ๋ถ์ ์์ง)์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ์ฌ ์ฐจํธ, ๊ฒ์ด์ง ๋ฐ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ํ์์ผ๋ก ์ ๊ณตํฉ๋๋ค.
์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ํ ๋นํ ์กฐ์ข ์์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค. ์กฐ์ข ์ฌ๋ '๋๋'์ ๋ฐ๋ผ ๋นํ๊ธฐ๋ฅผ ์กฐ์ข ํ์ง ์์ต๋๋ค. ๊ณ ๋, ์๋ ๋ฐ ์์ง ์ํ๋ฅผ ์ธก์ ํ๋ ์ ๋ฐ ๊ณ์ธก๊ธฐ์ ์์กดํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์์ง๋์ด๋ง ๋ฆฌ๋๋ ์ง๊ฐ์ ์์กดํ์ฌ ํ๋ก์ ํธ ์ํ๋ฅผ ๊ด๋ฆฌํด์๋ ์ ๋ฉ๋๋ค. ๋์๋ณด๋๋ ํ์ํ ๊ณ์ธก๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ํ์ ์ํ ํ์์ ์ธ ์ด์
- ๋จ์ผ ์ง์ค ๊ณต๊ธ์: ์ฌ๋ฌ ์๊ฐ๋์ ๊ฑธ์ณ ๋ถ์ฐ๋ ํ์์ ๋์๋ณด๋๋ ์ฝ๋ ํ์ง์ ๋ํด ๋ ผ์ํ ์ ์๋ ๊ณตํต์ ๊ฐ๊ด์ ์ธ ์ธ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฃผ๊ด์ ์ธ ํ ๋ก ์ ์์ ๊ณ ๋ชจ๋ ์ฌ๋์ ๋์ผํ ๋ชฉํ๋ก ์ ๋ ฌํฉ๋๋ค.
- ์ฌ์ ์๋ฐฉ์ ๋ฌธ์ ํ์ง: ํ๋ก๋์ ์์ ๋ฒ๊ทธ๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ , ๋์๋ณด๋๋ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ด ๋ง์ ์์ ์ฝ๋ ์ค๋ฉ์ ๋์ ํ๊ณ ์๋์ง ๋๋ ๋ฌธ์ ๊ฐ ์ฌ๊ฐํด์ง๊ธฐ ์ ์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋จ์ด์ง๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ ๊ฒฐ์ : ์ด๋ฒ ์คํ๋ฆฐํธ์์ ์ธ์ฆ ๋ชจ๋ ๋ฆฌํฉํ ๋ง์ ํฌ์ํด์ผ ํ ๊น์, ์๋๋ฉด ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ ํด์ผ ํ ๊น์? ๋์๋ณด๋๋ ๊ธฐ์ ๋ฐ ๋น๊ธฐ์ ์ดํด ๊ด๊ณ์ ๋ชจ๋์๊ฒ ์ด๋ฌํ ๊ฒฐ์ ์ ์ ๋นํํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๊ธฐ์ ๋ถ์ฑ ๊ฐ์: ๊ธฐ์ ๋ถ์ฑ๋ฅผ ๊ฐ์์ ์ด๊ณ ์ ๋ํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ฆ์ผ๋ก์จ(์: ์์ ์ ํ์ํ ์์ ์๊ฐ), ๋์๋ณด๋๋ ํ์ด ์ด๋ฅผ ์ง๋ฉดํ๋๋ก ๊ฐ์ํฉ๋๋ค. ์ถ์์ ์ธ ๊ฐ๋ ์์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ถ์ ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ ๊ตฌ์ฒด์ ์ธ ๋ฉํธ๋ฆญ์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋น ๋ฅธ ์จ๋ณด๋ฉ: ์๋ก์ด ๊ฐ๋ฐ์๋ ์ฝ๋๋ฒ ์ด์ค์ ์ํ์ ํ์ ํ์ง ํ์ค์ ๋ํด ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ต๋๋ค. ๋ณต์กํ๊ฑฐ๋ ์ทจ์ฝํ์ฌ ํน๋ณํ ์ฃผ์๊ฐ ํ์ํ ์ฝ๋ ์์ญ์ ๋ณผ ์ ์์ต๋๋ค.
- ํ์ ๋ฐ ์ฑ ์๊ฐ ํฅ์: ํ์ง ๋ฉํธ๋ฆญ์ด ํฌ๋ช ํ๊ณ ๋ชจ๋์๊ฒ ๋ณด์ด๋๋ก ํ๋ฉด ์ง๋จ์ ์์ ์์์ด ์กฐ์ฑ๋ฉ๋๋ค. ๊ฐ์ธ์ ๋น๋ํ๋ ๊ฒ์ด ์๋๋ผ ๊ณต์ ํ์ค์ ์ ์งํ๋๋ก ํ์ ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ๋๋ค.
๋์๋ณด๋์ ์๊ฐํํด์ผ ํ ํต์ฌ ๋ฉํธ๋ฆญ
ํ๋ฅญํ ๋์๋ณด๋๋ ์ ๋ณด ๊ณผ๋ถํ๋ฅผ ํผํฉ๋๋ค. ์ฝ๋ ํ์ง์ ๋ํ ์ ์ฒด์ ์ธ ๊ด์ ์ ์ ๊ณตํ๋ ์์ ๋ ๋ฉํธ๋ฆญ ์ธํธ์ ์ค์ ์ ๋ก๋๋ค. ์ด๋ฅผ ๋ ผ๋ฆฌ์ ์ธ ๋ฒ์ฃผ๋ก ๋๋์ด ๋ณด๊ฒ ์ต๋๋ค.
1. ์ ์ง๋ณด์์ฑ ๋ฉํธ๋ฆญ: ์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋ณ๊ฒฝํ ์ ์๋์?
์ ์ง๋ณด์์ฑ์ ์๋ง๋ ์ฅ๊ธฐ ํ๋ก์ ํธ์์ ๊ฐ์ฅ ์ค์ํ ์ธก๋ฉด์ผ ๊ฒ์ ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ์๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ฎ์ ์ ์ง๋ณด์์ฑ์ ๊ธฐ์ ๋ถ์ฑ์ ์ฃผ์ ์์ธ์ ๋๋ค.
์ํ ๋ณต์ก๋ (Cyclomatic Complexity)
๋ฌด์์ธ๊ฐ: ์ฝ๋ ์กฐ๊ฐ์ ํตํด ์ ํ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ์๋ฅผ ์ธก์ ํฉ๋๋ค. ๊ฐ๋จํ ๋งํด, ํจ์์ ์๋ ๊ฒฐ์ (์: `if`, `for`, `while`, `switch` ์ผ์ด์ค)์ ์๋ฅผ ์ ๋ํํฉ๋๋ค. ๋ณต์ก๋ 1์ธ ํจ์๋ ๋จ์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๋ฉฐ, `if` ๋ฌธ์ด ์๋ ํจ์๋ ๋ณต์ก๋ 2์ ๋๋ค.
์ ์ค์ํ๊ฐ: ๋์ ์ํ ๋ณต์ก๋๋ ์ฝ๋๋ฅผ ์ฝ๊ณ , ์ดํดํ๊ณ , ํ ์คํธํ๊ณ , ์์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋์ ๋ณต์ก๋ ์ ์๋ฅผ ๊ฐ์ง ํจ์๋ ๋ฒ๊ทธ์ ์ฃผ์ ํ๋ณด์ด๋ฉฐ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ์ปค๋ฒํ๊ธฐ ์ํด ํจ์ฌ ๋ ๋ง์ ํ ์คํธ ์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ํจ์๋น ํ๊ท ๋ณต์ก๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด์ง.
- ๊ฐ์ฅ ๋ณต์กํ ์์ 10๊ฐ ํจ์๋ฅผ ๋์ดํ๋ ํ ์ด๋ธ.
- '๋ฎ์'(1-5), '๋ณดํต'(6-10), '๋์'(11-20), '๊ทน์ฌ'(>20) ๋ณต์ก๋ ๊ตฌ๊ฐ์ ์ํ๋ ํจ์์ ์๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ถํฌ ์ฐจํธ.
์ธ์ง ๋ณต์ก๋ (Cognitive Complexity)
๋ฌด์์ธ๊ฐ: SonarQube์ ๊ฐ์ ๋๊ตฌ์์ ํ๋ณดํ๋ ๋ ์๋ก์ด ๋ฉํธ๋ฆญ์ผ๋ก, ์ฝ๋๊ฐ ์ธ๊ฐ์ด ์ดํดํ๊ธฐ ์ผ๋ง๋ ์ด๋ ค์ด์ง๋ฅผ ์ธก์ ํ๋ ค๊ณ ํฉ๋๋ค. ์ํ ๋ณต์ก๋์ ๋ฌ๋ฆฌ ์ค์ฒฉ๋ ๋ฃจํ, `try/catch` ๋ธ๋ก, `goto`์ ๊ฐ์ ๋ฌธ๊ณผ ๊ฐ์ด ์ฝ๋์ ์ ํ ํ๋ฆ์ ๋ฐฉํดํ๋ ๊ตฌ์กฐ์ ํ๋ํฐ๋ฅผ ๋ถ๊ณผํฉ๋๋ค.
์ ์ค์ํ๊ฐ: ์ข ์ข ์ํ ๋ณต์ก๋๋ณด๋ค ๋ ํ์ค์ ์ธ ์ ์ง๋ณด์์ฑ ์ฒ๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊น๊ฒ ์ค์ฒฉ๋ ํจ์๋ ๊ฐ๋จํ `switch` ๋ฌธ๊ณผ ๋์ผํ ์ํ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ ์์ง๋ง, ์ค์ฒฉ๋ ํจ์๋ ๊ฐ๋ฐ์๊ฐ ์ถ๋ก ํ๊ธฐ ํจ์ฌ ์ด๋ ต์ต๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ: ์ํ ๋ณต์ก๋์ ์ ์ฌํ๊ฒ ํ๊ท ๊ฐ์ ๋ํ ๊ฒ์ด์ง์ ๊ฐ์ฅ ๋ณต์กํ ํจ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ํ ์ด๋ธ์ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ์ ๋ถ์ฑ (Technical Debt)
๋ฌด์์ธ๊ฐ: ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฌ๋๋ผ๋ ์ง๊ธ์ ์ฌ์ด(์ ํ์ ์ธ) ์๋ฃจ์ ์ ์ ํํจ์ผ๋ก์จ ๋ฐ์ํ๋ ์ฌ์์ ์ ์์์ ๋น์ฉ์ ๋ํ๋ด๋ ์์ ์ ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๊ฐ ์๋ณ๋ ๋ฌธ์ (์: '์ด ์ค๋ณต๋ ๋ธ๋ก์ ์์ ํ๋ ๋ฐ 5๋ถ์ด ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค')์ ๋ํ ์๊ฐ ์ถ์ ์น๋ฅผ ํ ๋นํ์ฌ ์ด๋ฅผ ์ ๋ํํฉ๋๋ค.
์ ์ค์ํ๊ฐ: ์ถ์์ ์ธ ํ์ง ๋ฌธ์ ๋ฅผ ๊ตฌ์ฒด์ ์ธ ๋น์ฆ๋์ค ๋ฉํธ๋ฆญ, ์ฆ ์๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ์ ํ ๊ด๋ฆฌ์์๊ฒ "300๊ฐ์ ์ฝ๋ ์ค๋ฉ์ด ์์ต๋๋ค."๋ผ๊ณ ๋งํ๋ ๊ฒ์ "์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ ์๋๋ฅผ ๋ฆ์ถ๋ 45์ผ์ ๊ธฐ์ ๋ถ์ฑ๊ฐ ์์ต๋๋ค."๋ผ๊ณ ๋งํ๋ ๊ฒ๋ณด๋ค ์ํฅ๋ ฅ์ด ์ ์ต๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ์ด ์์ ๋ณต๊ตฌ ์๊ฐ(์: ์ธ์ผ ๊ธฐ์ค)์ ๋ณด์ฌ์ฃผ๋ ํฌ๊ณ ๋์ ๋๋ ์ซ์.
- ๋ถ์ฑ๋ฅผ ๋ฌธ์ ์ ํ(๋ฒ๊ทธ, ์ทจ์ฝ์ , ์ฝ๋ ์ค๋ฉ)๋ณ๋ก ๋ถ๋ฅํ๋ ํ์ด ์ฐจํธ.
2. ์์ ์ฑ ๋ฉํธ๋ฆญ: ์ด ์ฝ๋๊ฐ ์์๋๋ก ์๋ํ ๊น์?
์ด ๋ฉํธ๋ฆญ์ ์ฝ๋์ ์ ํ์ฑ๊ณผ ๊ฒฌ๊ณ ์ฑ์ ์ค์ ์ ๋์ด ํ๋ก๋์ ์ ๋๋ฌํ๊ธฐ ์ ์ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ์ ๋ณด์ ์ทจ์ฝ์ ์ ์ง์ ์ ์ผ๋ก ์๋ณํฉ๋๋ค.
๋ฒ๊ทธ ๋ฐ ์ทจ์ฝ์ (Bugs & Vulnerabilities)
๋ฌด์์ธ๊ฐ: ์ด๋ฌํ ๋ฌธ์ ๋ ์๋ชป๋ ๋์์ ์ ๋ฐํ๊ฑฐ๋ ๋ณด์ ํ์ ์ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ๋์ ์ ์ ๋ถ์ ๋๊ตฌ์์ ์๋ณํ ๋ฌธ์ ์ ๋๋ค. ์๋ก๋ null ํฌ์ธํฐ ์์ธ, ๋ฆฌ์์ค ๋์ ๋๋ ์์ ํ์ง ์์ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ ๋ฑ์ด ์์ต๋๋ค.
์ ์ค์ํ๊ฐ: ์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๋ฒ์ฃผ์ ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ์์คํ ์ถฉ๋, ๋ฐ์ดํฐ ์์ ๋๋ ๋ณด์ ์นจํด๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ฆ๊ฐ์ ์ธ ์กฐ์น๋ฅผ ์ํด ์ฐ์ ์์๊ฐ ์ง์ ๋์ด์ผ ํฉ๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ๋ฒ๊ทธ์ ์ทจ์ฝ์ ์ ๋ํ ๋ณ๋์ ์นด์ดํธ๋ฅผ ๋์ ๋๊ฒ ํ์ํฉ๋๋ค.
- ์ฌ๊ฐ๋๋ณ ๋ถ๋ฅ: ์ฐจ๋จ(Blocker), ์น๋ช ์ (Critical), ์ฃผ์(Major), ์ฌ์ํ(Minor) ๋ฌธ์ ๋ฅผ ์ํด ์์์ผ๋ก ๊ตฌ๋ถ๋ ๋ง๋ ์ฐจํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํ์ด ๋จผ์ ์์ ํ ํญ๋ชฉ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฝ๋ ์ค๋ฉ (Code Smells)
๋ฌด์์ธ๊ฐ: ์ฝ๋ ์ค๋ฉ์ ์ผ๋ฐ์ ์ผ๋ก ์์คํ ์ ๋ ๊น์ ๋ฌธ์ ์ ํด๋นํ๋ ํ๋ฉด์ ์ธ ์งํ์ ๋๋ค. ๋ฒ๊ทธ ์์ฒด๋ ์๋์ง๋ง ๊ธฐ๋ณธ์ ์ธ ๋์์ธ ์์น ์๋ฐ์ ์์ฌํ๋ ํจํด์ ๋๋ค. ์๋ก๋ '๊ธด ๋ฉ์๋(Long Method)', '๊ฑฐ๋ํ ํด๋์ค(Large Class)' ๋๋ ์ฃผ์ ์ฒ๋ฆฌ๋ ์ฝ๋์ ๊ด๋ฒ์ํ ์ฌ์ฉ ๋ฑ์ด ์์ต๋๋ค.
์ ์ค์ํ๊ฐ: ์ฆ๊ฐ์ ์ผ๋ก ์น๋ช ์ ์ด์ง๋ ์์ง๋ง, ์ฝ๋ ์ค๋ฉ์ ๊ธฐ์ ๋ถ์ฑ์ ๋ฎ์ ์ ์ง๋ณด์์ฑ์ ์ฃผ์ ์์ธ์ ๋๋ค. ์ค๋ฉ๋ก ๊ฐ๋ ์ฐฌ ์ฝ๋๋ฒ ์ด์ค๋ ์์ ํ๊ธฐ ์ด๋ ต๊ณ ๋ฏธ๋์ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ์ด ์ฝ๋ ์ค๋ฉ ๊ฐ์.
- ํ์ด ๋ฐ๋ณต๋๋ ๋์ ์ต๊ด์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ ์ ํ๋ณ ๋ถ๋ฅ.
3. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ฉํธ๋ฆญ: ์ฐ๋ฆฌ ์ฝ๋๊ฐ ์ถฉ๋ถํ ํ ์คํธ๋์๋์?
ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ ์๋ํ๋ ํ ์คํธ์์ ์คํ๋๋ ์ฝ๋์ ๋ฐฑ๋ถ์จ์ ์ธก์ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋ง์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์งํ์ ๋๋ค.
๋ผ์ธ, ๋ถ๊ธฐ ๋ฐ ํจ์ ์ปค๋ฒ๋ฆฌ์ง (Line, Branch, and Function Coverage)
๋ฌด์์ธ๊ฐ:
- ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง: ์คํ ๊ฐ๋ฅํ ์ฝ๋ ๋ผ์ธ ์ค ๋ช ํผ์ผํธ๊ฐ ํ ์คํธ์ ์ํด ์คํ๋์๋์?
- ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง: ๋ชจ๋ ๊ฒฐ์ ์ง์ (์: `if` ๋ฌธ)์ ๋ํด `true` ๋ฐ `false` ๋ถ๊ธฐ๊ฐ ๋ชจ๋ ์คํ๋์๋์? ์ด๋ ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํ ๋ฉํธ๋ฆญ์ ๋๋ค.
- ํจ์ ์ปค๋ฒ๋ฆฌ์ง: ์ฝ๋์ ํจ์ ์ค ๋ช ํผ์ผํธ๊ฐ ํ ์คํธ์ ์ํด ํธ์ถ๋์๋์?
์ ์ค์ํ๊ฐ: ๋ฎ์ ์ปค๋ฒ๋ฆฌ์ง๋ ์ค์ํ ๊ฒฝ๊ณ ์ ํธ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์๋ก๋ถํฐ ๋ณด๊ณ ๋ ๋๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋น ๋ถ๋ถ์ด ์ ์ ์์ด ๊ณ ์ฅ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ๋์ ์ปค๋ฒ๋ฆฌ์ง๋ ํ๊ท๋ฅผ ๋์ ํ์ง ์๊ณ ๋ณ๊ฒฝํ ์ ์๋ค๋ ํ์ ์ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ์ฌํญ: ๋์ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋์ ํ์ง์ ํ ์คํธ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋๋ค. ์๋ฌด๋ฐ ๋จ์ธ์ด ์์ด ์๋ฌด๊ฒ๋ ์ฆ๋ช ํ์ง ์๋ ํ ์คํธ๋ก 100% ๋ผ์ธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ปค๋ฒ๋ฆฌ์ง๋ ์ข์ ํ ์คํธ๋ฅผ ์ํ ํ์ ์กฐ๊ฑด์ด์ง๋ง ์ถฉ๋ถ ์กฐ๊ฑด์ ์๋๋๋ค. ํ ์คํธ๋์ง ์์ ์ฝ๋๋ฅผ ์ฐพ๋ ๋ฐ ์ฌ์ฉํ๊ณ , ํ์์ฌ ๋ฉํธ๋ฆญ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ์ ์ฒด ๋ถ๊ธฐ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํ ๋์ ๋๋ ๊ฒ์ด์ง.
- ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ปค๋ฒ๋ฆฌ์ง ์ถ์ธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ผ์ธ ์ฐจํธ(๋์ค์ ๋ ์์ธํ ์ค๋ช ).
- '์๋ก์ด ์ฝ๋์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง'์ ๋ํ ํน์ ๋ฉํธ๋ฆญ. ์ ์ฒด ์ปค๋ฒ๋ฆฌ์ง๋ณด๋ค ์ข ์ข ๋ ์ค์ํ๋ฉฐ, ๋ชจ๋ ์๋ก์ด ๊ธฐ์ฌ๊ฐ ์ ํ ์คํธ๋์๋์ง ํ์ธํฉ๋๋ค.
4. ์ค๋ณต ๋ฉํธ๋ฆญ: ์ฐ๋ฆฌ๋ ๋ฐ๋ณตํ๊ณ ์๋์?
์ค๋ณต ๋ผ์ธ/๋ธ๋ก (Duplicated Lines/Blocks)
๋ฌด์์ธ๊ฐ: ๋ค๋ฅธ ํ์ผ์ด๋ ํจ์์ ๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ๋ ์ฝ๋์ ๋ฐฑ๋ถ์จ์ ๋๋ค.
์ ์ค์ํ๊ฐ: ์ค๋ณต๋ ์ฝ๋๋ ์ ์ง๋ณด์์ ์ ๋ชฝ์ ๋๋ค. ํ ๋ธ๋ก์์ ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ๋ ๋ชจ๋ ์ค๋ณต์์ ๋ฐ๊ฒฌ๋๊ณ ์์ ๋์ด์ผ ํฉ๋๋ค. '๋ฐ๋ณตํ์ง ๋ง๋ผ'(DRY) ์์น์ ์๋ฐํ๋ฉฐ, ์ข ์ข ์ถ์ํ ๊ธฐํ(์: ๊ณต์ ํจ์ ๋๋ ์ปดํฌ๋ํธ ์์ฑ)๋ฅผ ๋์ณค์์ ๋ํ๋ ๋๋ค.
์๊ฐํ ๋ฐฉ๋ฒ:
- ์ ์ฒด ์ค๋ณต ์์ค์ ๋ณด์ฌ์ฃผ๋ ๋ฐฑ๋ถ์จ ๊ฒ์ด์ง.
- ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ ์๋ดํ๊ธฐ ์ํ ๊ฐ์ฅ ํฌ๊ฑฐ๋ ๊ฐ์ฅ ์์ฃผ ์ค๋ณต๋ ์ฝ๋ ๋ธ๋ก ๋ชฉ๋ก.
์ถ์ธ ๋ถ์์ ํ: ์ค๋ ์ท์ ๋์ด์
์ฝ๋์ ํ์ฌ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋์๋ณด๋๋ ์ ์ฉํฉ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํด๋น ์ํ๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋์๋์ง ๋ณด์ฌ์ฃผ๋ ๋์๋ณด๋๋ ํ์ ์ ์ ๋๋ค.
์ถ์ธ ๋ถ์์ ๊ธฐ๋ณธ ๋ณด๊ณ ์์ ์ ๋ต์ ๋๊ตฌ๋ฅผ ๊ตฌ๋ถํ๋ ์์์ ๋๋ค. ๋งฅ๋ฝ๊ณผ ์ด์ผ๊ธฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ค๋ ์ท์ 50๊ฐ์ ์ฌ๊ฐํ ๋ฒ๊ทธ๊ฐ ์์์ ๋ณด์ฌ์ค ์ ์์ผ๋ฉฐ, ์ด๋ ์ฐ๋ ค์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ 6๊ฐ์ ์ 200๊ฐ์ ์ฌ๊ฐํ ๋ฒ๊ทธ๊ฐ ์์๋ค๋ ์ถ์ธ์ ์ ์๋นํ ๊ฐ์ ๊ณผ ์ฑ๊ณต์ ์ธ ๋ ธ๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค๋ ค์ค๋๋ค. ๋ฐ๋๋ก, ์ค๋๋ ์ฌ๊ฐํ ๋ฒ๊ทธ๊ฐ 0์ด์ง๋ง ๋งค์ฃผ 5๊ฐ์ ์๋ก์ด ๋ฒ๊ทธ๊ฐ ์ถ๊ฐ๋๋ ํ๋ก์ ํธ๋ ์ํํ ๊ถค์ ์ ์์ต๋๋ค.
๋ชจ๋ํฐ๋งํด์ผ ํ ์ฃผ์ ์ถ์ธ:
- ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๊ธฐ์ ๋ถ์ฑ: ํ์ด ๋ถ์ฑ๋ฅผ ์ํํ๊ณ ์์ต๋๊น, ์๋๋ฉด ์ถ์ ํ๊ณ ์์ต๋๊น? ์ฆ๊ฐํ๋ ์ถ์ธ๋ ํฅํ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง ๊ฒ์ด๋ผ๋ ๋ช ํํ ์ ํธ์ ๋๋ค. ์ฃผ์ ๋ฆด๋ฆฌ์ค์ ๋ํด ์ด๋ฅผ ํ๋กฏํ์ฌ ํด๋น ์ํฅ์ ํ์ธํ์ญ์์ค.
- ์๋ก์ด ์ฝ๋์ ๋ํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง: ์ด๋ ์ค์ํ ์ ํ ์งํ์ ๋๋ค. ์๋ก์ด ์ฝ๋์ ๋ํ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ผ๊ด๋๊ฒ ๋์ผ๋ฉด(์: >80%), ์ ์ฒด ์ปค๋ฒ๋ฆฌ์ง๋ ์์ฐ์ค๋ฝ๊ฒ ์ฆ๊ฐํ ๊ฒ์ ๋๋ค. ๋ฎ์ผ๋ฉด, ๋ชจ๋ ์ปค๋ฐ๊ณผ ํจ๊ป ์์ ๋ง์ด ์ฝํด์ง๊ณ ์์ต๋๋ค.
- ์๋ก ๋์ ๋ ์ด์ ๋ ์ฒ๋ฆฌ๋ ์ด์: ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ ๋นจ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ต๋๊น? ์ฃผ๋น '์๋ก์ด ์ฐจ๋จ ๋ฒ๊ทธ' ๋ '์ฒ๋ฆฌ๋ ์ฐจ๋จ ๋ฒ๊ทธ'๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ผ์ธ ์ฐจํธ๋ ๊ฐ๋ ฅํ ๋๊ธฐ ๋ถ์ฌ๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋ณต์ก์ฑ ์ถ์ธ: ์ฝ๋๋ฒ ์ด์ค์ ํ๊ท ์ํ ๋ณต์ก๋๊ฐ ์์ํ ์ฆ๊ฐํ๊ณ ์์ต๋๊น? ์ด๋ ์ํคํ ์ฒ๊ฐ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ ๋ณต์กํด์ง๊ณ ์์ผ๋ฉฐ ์ ์ฉ ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ด ํ์ํ ์ ์์์ ๋ํ๋ ๋๋ค.
์ถ์ธ ํจ๊ณผ์ ์ผ๋ก ์๊ฐํํ๊ธฐ
๊ฐ๋จํ ๋ผ์ธ ์ฐจํธ๋ ์ถ์ธ ๋ถ์์ ๊ฐ์ฅ ์ข์ ๋๊ตฌ์ ๋๋ค. x์ถ์ ์๊ฐ(์ผ, ์ฃผ ๋๋ ๋น๋)์ ๋ํ๋ด๊ณ y์ถ์ ๋ฉํธ๋ฆญ์ ๋ํ๋ ๋๋ค. ์ฃผ์ ๋ฆด๋ฆฌ์ค, ์๋ก์ด ํ ํฉ๋ฅ ๋๋ ๋ฆฌํฉํ ๋ง ์ด๋์ ํฐ๋ธ ์์๊ณผ ๊ฐ์ ์ค์ํ ์ด๋ฒคํธ์ ๋ํ ์ด๋ฒคํธ ๋ง์ปค๋ฅผ ํ์๋ผ์ธ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๋ฉํธ๋ฆญ์ ๋ณํ์ ์ค์ ์ด๋ฒคํธ๋ฅผ ์๊ด์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
JavaScript ์ฝ๋ ํ์ง ๋์๋ณด๋ ๊ตฌ์ถ: ๋๊ตฌ ๋ฐ ๊ธฐ์
๋์๋ณด๋๋ฅผ ์ฒ์๋ถํฐ ๊ตฌ์ถํ ํ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๋ฉํธ๋ฆญ์ ์์ง, ๋ถ์ ๋ฐ ์๊ฐํํ๋ ๋ฐ ๋์์ด ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ ์ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
ํต์ฌ ๋๊ตฌ ์ฒด์ธ
1. ์ ์ ๋ถ์ ๋๊ตฌ (๋ฐ์ดํฐ ์์ง๊ธฐ)
์ด๋ฌํ ๋๊ตฌ๋ ๊ธฐ๋ฐ์ ๋๋ค. ์คํํ์ง ์๊ณ ์์ค ์ฝ๋๋ฅผ ์ค์บํ์ฌ ๋ฒ๊ทธ, ์ทจ์ฝ์ ๋ฐ ์ฝ๋ ์ค๋ฉ์ ์ฐพ์ต๋๋ค.
- ESLint: JavaScript ์ํ๊ณ์์ ๋ฆฐํ ์ ์ฌ์ค์์ ํ์ค์ ๋๋ค. ๋งค์ฐ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ฉฐ ์ฝ๋ ์คํ์ผ์ ๊ฐ์ ํ๊ณ ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ฅผ ์ฐพ๊ณ ์ํฐ ํจํด์ ์๋ณํ ์ ์์ต๋๋ค. IDE์ ์ง์ ํตํฉ๋๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ์ด์ ์ ๋๋ค.
- SonarQube (with SonarJS): ์ฝ๋ ํ์ง์ ์ง์์ ์ธ ๊ฒ์ฌ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ์คํ ์์ค ํ๋ซํผ์ ๋๋ค. ๋ฆฐํ ์ ํจ์ฌ ๋ฅ๊ฐํ์ฌ ๋ฒ๊ทธ, ์ทจ์ฝ์ , ์ธ์ง ๋ณต์ก์ฑ ๋ฐ ๊ธฐ์ ๋ถ์ฑ ์ถ์ ์ ์ํ ์ ๊ตํ ๋ถ์์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ํ์ง ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ์ค์ ์๋ฒ ์ญํ ์ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๊ธฐํ (SaaS ํ๋ซํผ): CodeClimate, Codacy, Snyk์ ๊ฐ์ ์๋น์ค๋ ํด๋ผ์ฐ๋ ์๋น์ค๋ก์ ๊ฐ๋ ฅํ ๋ถ์์ ์ ๊ณตํ๋ฉฐ ์ข ์ข GitHub ๋ฐ GitLab๊ณผ ๊ฐ์ ํ๋ซํผ๊ณผ ๊ธด๋ฐํ๊ฒ ํตํฉ๋ฉ๋๋ค.
2. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ (ํ ์คํฐ)
์ด๋ฌํ ๋๊ตฌ๋ ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํ๊ณ ์ฝ๋์ ์ด๋ ๋ถ๋ถ์ด ์คํ๋์๋์ง์ ๋ํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
- Jest: ๋ด์ฅ๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ธ๊ธฐ ์๋ JavaScript ํ ์คํธ ํ๋ ์์ํฌ๋ก, Istanbul ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
- Istanbul (๋๋ nyc): Mocha, Jasmine ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ํ ๋ช ๋ น์ค ๋๊ตฌ์ ๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ ์ผ๋ฐ์ ์ผ๋ก LCOV ๋๋ Clover XML๊ณผ ๊ฐ์ ํ์ค ํ์์ผ๋ก ์ปค๋ฒ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ฉฐ, ์ด๋ ๋์๋ณด๋ ํ๋ซํผ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
3. ๋์๋ณด๋ ๋ฐ ์๊ฐํ ํ๋ซํผ (๋์คํ๋ ์ด)
์ด๊ณณ์์ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํตํฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ ๊ฐ์ง ์ฃผ์ ์ต์ ์ด ์์ต๋๋ค.
์ต์ A: ์ฌ์ธ์ ์๋ฃจ์
SonarQube, CodeClimate, Codacy์ ๊ฐ์ ํ๋ซํผ์ ๋ถ์ ์์ง๊ณผ ๋์๋ณด๋ ์ญํ ์ ๋ชจ๋ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ์ฅ ์ฝ๊ณ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
- ์ฅ์ : ์ฌ์ด ์ค์ , ๋ถ์ ๋ฐ ์๊ฐํ ๊ฐ์ ์ํํ ํตํฉ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฉํธ๋ฆญ์ด ์ฌ์ ๊ตฌ์ฑ๋ ๋์๋ณด๋.
- ๋จ์ : ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์๊ฐํ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ์ ์ฐ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
์ต์ B: DIY (์ง์ ๋ง๋ค๊ธฐ) ์ ๊ทผ ๋ฐฉ์
์ต๋ํ์ ์ ์ด์ ์ฌ์ฉ์ ์ ์๋ฅผ ์ํด ๋ถ์ ๋๊ตฌ์ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์๊ฐํ ํ๋ซํผ์ผ๋ก ๊ณต๊ธํ ์ ์์ต๋๋ค.
- ์คํ: CI ํ์ดํ๋ผ์ธ์์ ๋๊ตฌ(ESLint, Jest ๋ฑ)๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ JSON์ผ๋ก ์ถ๋ ฅํ ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ Prometheus ๋๋ InfluxDB์ ๊ฐ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Grafana์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌํ์ฌ ์์ ํ ์ฌ์ฉ์ ์ ์๋ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ์ฅ์ : ๋ฌดํํ ์ ์ฐ์ฑ. ์ฝ๋ ํ์ง ๋ฉํธ๋ฆญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ฉํธ๋ฆญ(APM) ๋ฐ ๋น์ฆ๋์ค KPI์ ๋์ผํ ๋์๋ณด๋์ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
- ๋จ์ : ์๋นํ ์ถ๊ฐ ์ค์ ๋ฐ ์ ์ง๋ณด์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
ํต์ฌ ์ ์ฐฉ์ : CI/CD ํตํฉ
์ฝ๋ ํ์ง ๋์๋ณด๋๋ ๋ฐ์ดํฐ๊ฐ ์ต์ ์ํ๋ก ์ ์ง๋ ๋๋ง ํจ๊ณผ์ ์ ๋๋ค. ์ด๋ ๋ถ์ ๋๊ตฌ๋ฅผ ์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ(CI/CD) ํ์ดํ๋ผ์ธ(์: GitHub Actions, GitLab CI, Jenkins)์ ๊น์ด ํตํฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
๋ค์์ ๋ชจ๋ ํ ๋ฆฌํ์คํธ ๋๋ ๋จธ์ง ๋ฆฌํ์คํธ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ํฌํ๋ก์ ๋๋ค:
- ๊ฐ๋ฐ์๊ฐ ์ ์ฝ๋๋ฅผ ํธ์ํฉ๋๋ค.
- CI ํ์ดํ๋ผ์ธ์ด ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ESLint๋ฅผ ์คํํ๊ณ Jest ํ ์คํธ ์ค์ํธ๋ฅผ ์คํํ๋ฉฐ(์ปค๋ฒ๋ฆฌ์ง ์์ฑ), SonarQube ์ค์บ๋๋ฅผ ์คํํฉ๋๋ค.
- ๊ฒฐ๊ณผ๊ฐ SonarQube ์๋ฒ๋ก ํธ์๋์ด ๋์๋ณด๋๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ค์ํ๊ฒ, ํ์ง ๊ฒ์ดํธ๋ฅผ ๊ตฌํํฉ๋๋ค.
ํ์ง ๊ฒ์ดํธ๋ ๋น๋๋ฅผ ํต๊ณผํ๊ธฐ ์ํด ์ฝ๋๊ฐ ์ถฉ์กฑํด์ผ ํ๋ ์กฐ๊ฑด ์งํฉ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ดํ๋ผ์ธ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์คํจํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
- ์๋ก์ด ์ฝ๋์ ๋ํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ 80% ๋ฏธ๋ง์ ๋๋ค.
- ์๋ก์ด ์ฐจ๋จ ๋๋ ์น๋ช ์ ์ธ ์ทจ์ฝ์ ์ด ๋์ ๋ฉ๋๋ค.
- ์๋ก์ด ์ฝ๋์ ์ค๋ณต ๋ฐฑ๋ถ์จ์ด 3%๋ฅผ ์ด๊ณผํฉ๋๋ค.
ํ์ง ๊ฒ์ดํธ๋ ๋์๋ณด๋๋ฅผ ์๋ ๋ณด๊ณ ๋๊ตฌ์์ ๋ฅ๋์ ์ธ ์ฝ๋๋ฒ ์ด์ค ์ํธ์๋ก ๋ณํํ์ฌ ๋ฎ์ ํ์ง์ ์ฝ๋๊ฐ ๋ฉ์ธ ๋ธ๋์น์ ๋ณํฉ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
์ฝ๋ ํ์ง ๋ฌธํ ๊ตฌ์ถ: ์ธ๊ฐ์ ์์
๊ธฐ์ตํ์ญ์์ค, ๋์๋ณด๋๋ ๋๊ตฌ์ด์ง ํด๊ฒฐ์ฑ ์ด ์๋๋๋ค. ๊ถ๊ทน์ ์ธ ๋ชฉํ๋ ์๋ฆ๋ค์ด ์ฐจํธ๋ฅผ ๊ฐ๋ ๊ฒ์ด ์๋๋ผ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ ์ฒด ํ์ด ํ์ง์ ๋ํ ์ฑ ์์ ์ง๋ ๋ฌธํ์ ๋ณํ๋ฅผ ํ์๋ก ํฉ๋๋ค.
๋ฉํธ๋ฆญ์ ๋น๋์ด ์๋ ์คํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๊ธฐ
๋์๋ณด๋๋ ๊ฐ๋ฐ์๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋ง์ ์ํค๊ฑฐ๋ ์ต์ ์ด์ ๋ฐ์ ๊ฐ๋ฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒฝ์์ ์ธ ๋ถ์๊ธฐ๋ฅผ ์กฐ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋์ด์๋ ์ ๋ฉ๋๋ค. ์ด๋ ๋๋ ค์์ ์กฐ์ฑํ๊ณ ์ฌ๋๋ค์ด ๋ฌธ์ ๋ฅผ ์จ๊ธฐ๊ฑฐ๋ ๋ฉํธ๋ฆญ์ ์กฐ์ํ๊ฒ ๋ง๋ญ๋๋ค.
- ํ์ ์ง์ค: ์คํ๋ฆฐํธ ํ๊ณ ์ค์ ํ ์์ค์์ ๋ฉํธ๋ฆญ์ ๋ ผ์ํฉ๋๋ค. "์ํ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ๋ค์ ์คํ๋ฆฐํธ์์ ์ฝ๋๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ํ์ผ๋ก์ ๋ฌด์์ ํ ์ ์์๊น์?"์ ๊ฐ์ ์ง๋ฌธ์ ํฉ๋๋ค.
- ์ฝ๋์ ์ง์ค: ๋๋ฃ ์ฝ๋ ๊ฒํ ๋ฅผ ์๋ดํ๋ ๋ฐ ๋์๋ณด๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฎ์ถ๊ฑฐ๋ ์น๋ช ์ ์ธ ์ด์๋ฅผ ๋์ ํ๋ ํ ๋ฆฌํ์คํธ๋ ๋น๋์ด ์๋ ๊ฑด์ค์ ์ธ ํ ๋ก ์ ๋์์ด ๋์ด์ผ ํฉ๋๋ค.
ํ์ค์ ์ด๊ณ ์ ์ง์ ์ธ ๋ชฉํ ์ค์
๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์ 10,000๊ฐ์ ์ฝ๋ ์ค๋ฉ์ด ์๋ค๋ฉด "๋ชจ๋ ์์ "์ด๋ผ๋ ๋ชฉํ๋ ์์์ ์ ํ์ํค๊ณ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๋์ "ํญ์ ๋ฐ๊ฒฌํ ์ฝ๋๋ณด๋ค ๋ ๊นจ๋ํ๊ฒ ๋ ๋๋ผ"๋ผ๋ "์๋ ์ค์นด์ฐํธ ๊ท์น"๊ณผ ๊ฐ์ ์ ๋ต์ ์ฑํํ์ญ์์ค.
์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ํ์ง ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค. "๋ชจ๋ ์๋ก์ด ์ฝ๋๋ ์น๋ช ์ ์ธ ์ด์๊ฐ ์์ด์ผ ํ๊ณ 80%์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค." ์ด๋ ๋ฌธ์ ๊ฐ ๋ ์ ํ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ํ์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ธฐ์กด ๋ถ์ฑ๋ฅผ ์ ์ง์ ์ผ๋ก ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
๊ต์ก ๋ฐ ๋งฅ๋ฝ ์ ๊ณต
๊ฐ๋ฐ์์๊ฒ "์ธ์ง ๋ณต์ก๋" ์ ์ 25๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ๋ฌด์์ ํด์ผ ํ ์ง ๊ธฐ๋ํ์ง ๋ง์ญ์์ค. ์ด๋ฌํ ๋ฉํธ๋ฆญ์ด ๋ฌด์์ ์๋ฏธํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ผ๋ฐ์ ์ธ ๋ฆฌํฉํ ๋ง ํจํด(์: "๋ฉ์๋ ์ถ์ถ", "๋คํ์ฑ์ ์ฌ์ฉํ ์กฐ๊ฑด๋ถ ๋์ฒด")์ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋์ง์ ๋ํ ๋ฌธ์์ ๊ต์ก ์ธ์ ์ ์ ๊ณตํ์ญ์์ค.
๊ฒฐ๋ก : ๋ฐ์ดํฐ์์ ๊ท์จ๋ก
JavaScript ์ฝ๋ ํ์ง ๋์๋ณด๋๋ ๋ชจ๋ ์ง์งํ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ์๊ฒ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ๋ชจํธํจ์ ๋ช ํ์ฑ์ผ๋ก ๋์ฒดํ์ฌ ์ฝ๋๋ฒ ์ด์ค ์ํ์ ๋ํ ๊ณต์ ๋๊ณ ๊ฐ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ณต์ก์ฑ, ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ฐ ๊ธฐ์ ๋ถ์ฑ์ ๊ฐ์ ํต์ฌ ์งํ๋ฅผ ์๊ฐํํจ์ผ๋ก์จ ํ์ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
ํ์ง๋ง ์ ์ ์ค๋ ์ท์ ๋์ด ์ถ์ธ ๋ถ์์ ์์ํ ๋ ์ง์ ํ ํ์ด ๋ฐํ๋ฉ๋๋ค. ์ถ์ธ ๋ถ์์ ์ซ์ ๋ค์ ์ด์ผ๊ธฐ๋ฅผ ์ ๊ณตํ์ฌ ํ์ง ์ด๋์ ํฐ๋ธ๊ฐ ์ฑ๊ณตํ๊ณ ์๋์ง ํ์ธํ๊ณ ์๊ธฐ๊ฐ ๋๊ธฐ ์ ์ ๋ถ์ ์ ์ธ ํจํด์ ์ฌ์ ๋์ํ ์ ์๋๋ก ํฉ๋๋ค.
์ฌ์ ์ ์ธก์ ์์ ์์๋ฉ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ์ ์ ๋ถ์ ๋ฐ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ๋ฅผ ํตํฉํ์ญ์์ค. ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๊ณ ํ์ํ๊ธฐ ์ํด SonarQube์ ๊ฐ์ ํ๋ซํผ์ ์ ํํ์ญ์์ค. ์๋ํ๋ ์ํธ์ ์ญํ ์ ํ๋๋ก ํ์ง ๊ฒ์ดํธ๋ฅผ ๊ตฌํํ์ญ์์ค. ํ์ง๋ง ๊ฐ์ฅ ์ค์ํ๊ฒ๋, ์ด ๊ฐ๋ ฅํ ์๋ก์ด ๊ฐ์์ฑ์ ํ์ฉํ์ฌ ํ ์ ์ฒด์ ์ฑ ์๊ฐ, ์ง์์ ์ธ ํ์ต, ๊ทธ๋ฆฌ๊ณ ์ฅ์ธ ์ ์ ์ ๋ํ ๊ณต์ ๋ ํ์ ๋ฌธํ๋ฅผ ์กฐ์ฑํ์ญ์์ค. ๊ฒฐ๊ณผ๋ ๋ ๋์ ์ฝ๋๋ฟ๋ง ์๋๋ผ ์์ผ๋ก ๋ช ๋ ๋์ ๋ ์์ฐ์ ์ด๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉฐ ์ง์ ๊ฐ๋ฅํ ๊ฐ๋ฐ ํ๋ก์ธ์ค๊ฐ ๋ ๊ฒ์ ๋๋ค.