์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ์์ ์ง์์ ์ธ ๊ฐ์ ์ ๊ตฌํํ๊ธฐ ์ํ ์ข ํฉ ๊ฐ์ด๋. ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก, ๋๊ตฌ ๋ฐ ์ ๋ต์ ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ: ์ง์์ ์ธ ๊ฐ์ ๊ตฌํ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ธ๋ผ์ฐ์ ์ ์ธ์ด๋ก์ ์ต๊ณ ์ ์๋ฆฌ๋ฅผ ์ฐจ์งํ๊ณ ์์ต๋๋ค. ๊ฐ๋จํ ์ํธ์์ฉ ์์๋ถํฐ ๋ณต์กํ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์ ์ด๋ฅด๊ธฐ๊น์ง, ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ๋ ์น์ฌ์ดํธ์ ๋๋ถ๋ถ์ ๊ตฌ๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฐ ํ์๋ ํฐ ์ฑ ์, ์ฆ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ๊ณ ํ์ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ ์ฑ ์์ด ๋ฐ๋ฆ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ์ง์์ ์ธ ๊ฐ์ ๊ดํ์ ๊ตฌํ์ ์ด์ ์ ๋ง์ถฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ์ค์ํ ์ธก๋ฉด์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
์ฝ๋ ํ์ง ๊ด๋ฆฌ๊ฐ ์ ์ค์ํ๊ฐ?
'์ด๋ป๊ฒ'๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์ '์'๋ฅผ ์ดํดํด ๋ด ์๋ค. ๋ฎ์ ์ฝ๋ ํ์ง์ ํ๋ก์ ํธ ์ผ์ , ์์ฐ, ์ฌ์ง์ด ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์๊น์ง ์ํฅ์ ๋ฏธ์น๋ ์ฐ์์ ์ธ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ํฌ์ํ๋ ๊ฒ์ด ํ์์ ์ธ ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ธฐ์ ๋ถ์ฑ ๊ฐ์: ๊ธฐ์ ๋ถ์ฑ๋ ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋์ ์ง๊ธ ๋น์ฅ ์ฌ์ด ํด๊ฒฐ์ฑ ์ ์ ํํจ์ผ๋ก์จ ๋ฐ์ํ๋ ์ฌ์์ ์ ์๋ฌต์ ์ธ ๋น์ฉ์ ์๋ฏธํฉ๋๋ค. ๋ฎ์ ์ฝ๋ ํ์ง์ ๊ธฐ์ ๋ถ์ฑ์ ํฌ๊ฒ ๊ธฐ์ฌํ์ฌ ํฅํ ๊ฐ๋ฐ์ ๋ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๊ฒ ๋ง๋ญ๋๋ค.
- ์ ์ง๋ณด์์ฑ ํฅ์: ๊นจ๋ํ๊ณ ์ ๊ตฌ์กฐํ๋ ์ฝ๋๋ ์ดํดํ๊ณ ์์ ํ๊ธฐ๊ฐ ๋ ์ฌ์ ์ ์ง๋ณด์ ๋ฐ ๋ฒ๊ทธ ์์ ์ ํ์ํ ๋ ธ๋ ฅ์ ์ค์ฌ์ค๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ์ฐธ์ฌํ๋ ์ฅ๊ธฐ ํ๋ก์ ํธ์ ํนํ ์ค์ํฉ๋๋ค. ๋๊ท๋ชจ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ญ์์ค. ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฅํ๋ค๋ ๊ฒ์ ๋ ๋น ๋ฅธ ๊ธฐ๋ฅ ์ถ์์ ๋งค์ถ์ ์ํฅ์ ์ค ์ ์๋ ์ค๋ํ ๋ฌธ์ ์ ์ ์ํ ํด๊ฒฐ์ ์๋ฏธํฉ๋๋ค.
- ์ ๋ขฐ์ฑ ๊ฐํ: ๊ณ ํ์ง ์ฝ๋๋ ์ค๋ฅ์ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ์ด ๋ ์ ๋ขฐํ ์ ์๊ณ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ๊ธ์ต ํ๋ซํผ์ด๋ ์๋ฃ ์์คํ ๊ณผ ๊ฐ์ด ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ์ค์ํ ์์ ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ค์ํฉ๋๋ค.
- ๊ฐ๋ฐ ์๋ ํฅ์: ์ง๊ด์ ๋ฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ด๊ธฐ์ ์ฝ๋ ํ์ง์ ํฌ์ํ๋ฉด ์ฅ๊ธฐ์ ์ผ๋ก ์ค์ ๋ก ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๋ฒ๊ทธ ์๋ฅผ ์ค์ด๊ณ ์ ์ง๋ณด์๋ฅผ ๋จ์ํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋์์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์ ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌ์ถ์ ์ง์คํ ์ ์์ต๋๋ค.
- ํ์ ๊ฐ์ : ์ผ๊ด๋ ์ฝ๋ฉ ํ์ค๊ณผ ๋ช ํํ ์ฝ๋ ๊ตฌ์กฐ๋ ๊ฐ๋ฐ์ ๊ฐ์ ํ์ ์ ์ฉ์ดํ๊ฒ ํ์ฌ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒํ ํ๊ณ , ์๋ก์ด ํ์์ ์จ๋ณด๋ฉํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๋ณต์กํ SPA๋ฅผ ์์ ํ๋ ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ํ์ ์๊ฐํด ๋ณด์ญ์์ค. ๋ช ํํ ์ฝ๋ฉ ๊ท์น์ ์์น๋ ๋ฌธํ์ ๋ฐฐ๊ฒฝ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ํ์ด์ง์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ณด์ ํฅ์: ์์ ํ ์ฝ๋ฉ ๊ดํ์ ๋ฐ๋ฅด๋ ๊ฒ์ ๊ณต๊ฒฉ์์ ์ํด ์ ์ฉ๋ ์ ์๋ ์ทจ์ฝ์ ์ ์๋ฐฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ ํ ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์ด๊ท (sanitization)์ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ๋ฐ SQL ์ธ์ ์ ๊ณต๊ฒฉ์ ์ํ์ ์ํํ ์ ์์ต๋๋ค.
์ง์์ ์ธ ๊ฐ์ ์ฃผ๊ธฐ
์ง์์ ์ธ ๊ฐ์ ์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๊ธฐ์กด ๊ดํ์ ๋์์์ด ํ๊ฐํ๊ณ ๊ฐ์ ํ๋ ๋ฐ๋ณต์ ์ธ ํ๋ก์ธ์ค์ ๋๋ค. ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ๋งฅ๋ฝ์์ ์ด๋ ์ฝ๋ ํ์ง์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๊ฐ์ ํ ์์ญ์ ์๋ณํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํ๊ณ , ๊ทธ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ์ธก์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ์ฃผ๊ธฐ์ ํต์ฌ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ณํ(Plan): ์ฝ๋ ํ์ง ๋ชฉํ๋ฅผ ์ ์ํ๊ณ ์งํ ์ํฉ์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉํ ์งํ๋ฅผ ์๋ณํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง, ์ํ ๋ณต์ก๋, ๋ณด๊ณ ๋ ๋ฒ๊ทธ ์์ ๊ฐ์ ๊ฒ๋ค์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ์คํ(Do): ๊ณํํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌํํฉ๋๋ค. ์ด๋ ์๋ก์ด ๋ฆฐํ ๊ท์น์ ๋์ ํ๊ฑฐ๋, ์๋ก์ด ํ ์คํธ ํ๋ ์์ํฌ๋ฅผ ์ฑํํ๊ฑฐ๋, ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
- ํ์ธ(Check): ์ฝ๋ ํ์ง ์งํ๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ๊ตฌํํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ํ๋ ํจ๊ณผ๋ฅผ ๋ด๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง, ์ ์ ๋ถ์ ๊ฒฐ๊ณผ ๋ฐ ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ถ์ ํฉ๋๋ค.
- ์กฐ์น(Act): ๋ฐ๊ฒฌํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ฝ๋ ํ์ง ๊ดํ์ ์ถ๊ฐ๋ก ์กฐ์ ํฉ๋๋ค. ์ด๋ ๋ฆฐํ ๊ท์น์ ๊ฐ์ ํ๊ฑฐ๋, ํ ์คํธ ์ ๋ต์ ๊ฐ์ ํ๊ฑฐ๋, ๊ฐ๋ฐ์์๊ฒ ์ถ๊ฐ ๊ต์ก์ ์ ๊ณตํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
์ด ์ฃผ๊ธฐ๋ ์ผํ์ฑ ์ด๋ฒคํธ๊ฐ ์๋๋ผ ์ง์์ ์ธ ๊ณผ์ ์ ๋๋ค. ์ด๋ฌํ ๋จ๊ณ๋ฅผ ๊ณ์ ๋ฐ๋ณตํจ์ผ๋ก์จ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ์ง์ ์ ์ง์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ์ ๊ธฐ์
๋คํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ๋ฅผ ๋๊ธฐ ์ํด ๋ค์ํ ๋๊ตฌ์ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๊ณ ํจ๊ณผ์ ์ธ ๋ช ๊ฐ์ง ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋ฆฐํ (Linting)
๋ฆฐํ ์ ์ ์ฌ์ ์ธ ์ค๋ฅ, ์คํ์ผ ๋ถ์ผ์น ๋ฐ ์ฝ๋ ํ์ง์ ์ํฅ์ ์ค ์ ์๋ ๊ธฐํ ๋ฌธ์ ์ ๋ํด ์ฝ๋๋ฅผ ๋ถ์ํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ๋ฆฐํฐ๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ณด๊ณ ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค. ์ฝ๋์ ๋ํ ๋ฌธ๋ฒ ๊ฒ์ฌ๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ๋ฆฐํฐ:
- ESLint: ESLint๋ ์๋ง๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ฆฐํฐ์ผ ๊ฒ์ ๋๋ค. ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ณ ๋ค์ํ ๊ท์น์ ์ง์ํ๋ฏ๋ก ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ESLint๋ ํธ์ง๊ธฐ, ๋น๋ ํ๋ก์ธ์ค ๋ฐ ์ง์์ ์ธ ํตํฉ ํ์ดํ๋ผ์ธ์ ํตํฉ๋ ์ ์์ต๋๋ค.
- JSHint: JSHint๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ ์ฝ๋ฉ ๊ท์น์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ ์ ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋ฆฐํฐ์ ๋๋ค. ESLint๋ณด๋ค ๊ตฌ์ฑ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ง๋ง ์ฝ๋ ํ์ง์ ํฅ์์ํค๋ ๋ฐ ์ฌ์ ํ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค.
- StandardJS: StandardJS๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น ์ธํธ๊ฐ ์๋ ๋ฆฐํฐ๋ก, ๊ตฌ์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๊ฒ ์์ํ ์ ์์ผ๋ฉฐ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ๋ณด์ฅํฉ๋๋ค. ์ ์ฐ์ฑ์ ๋จ์ด์ง์ง๋ง ์คํ์ผ์ ๋ํด ๋ ผ์ํ๋ฉฐ ์๊ฐ์ ๋ณด๋ด๊ณ ์ถ์ง ์์ ํ์๊ฒ๋ ํ๋ฅญํฉ๋๋ค.
์์: ESLint ์ฌ์ฉํ๊ธฐ
๋จผ์ , ESLint๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ(dev dependency)์ผ๋ก ์ค์นํฉ๋๋ค:
npm install eslint --save-dev
๊ทธ๋ฐ ๋ค์, ํ๋ก์ ํธ ๋ฃจํธ์ ESLint ๊ตฌ์ฑ ํ์ผ(.eslintrc.js ๋๋ .eslintrc.json)์ ์์ฑํฉ๋๋ค:
// .eslintrc.js
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "double"]
}
};
์ด ๊ตฌ์ฑ์ ๊ถ์ฅ ESLint ๊ท์น์ ํ์ฅํ๊ณ ์ธ๋ฏธ์ฝ๋ก ๋ฐ ๋ฐ์ดํ์ ๋ํ ๋ช ๊ฐ์ง ์ฌ์ฉ์ ์ ์ ๊ท์น์ ์ถ๊ฐํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฝ๋์ ESLint๋ฅผ ์คํํฉ๋๋ค:
npx eslint .
ESLint๋ ๊ตฌ์ฑ๋ ๊ท์น์ ๋ชจ๋ ์๋ฐ ์ฌํญ์ ๋ณด๊ณ ํฉ๋๋ค.
2. ์ ์ ๋ถ์(Static Analysis)
์ ์ ๋ถ์์ ์ฝ๋๋ฅผ ์คํํ์ง ์๊ณ ๋ถ์ํ์ฌ ๋ณด์ ์ทจ์ฝ์ , ์ฑ๋ฅ ๋ณ๋ชฉ ํ์ ๋ฐ ์ฝ๋ ์ค๋ฉ๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ฆฐํฐ๋ณด๋ค ๋ ๋์ ๋ฒ์์ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ ์ ์์ง๋ง, ๋ ๋ง์ ๊ฑฐ์ง ์์ฑ(false positive)์ ์์ฑํ ์๋ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ์ ์ ๋ถ์ ๋๊ตฌ:
- SonarQube: SonarQube๋ ์ฝ๋ ํ์ง์ ์ง์์ ์ธ ๊ฒ์ฌ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ํ๋ซํผ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ฉฐ ์ฝ๋ ํ์ง ์งํ, ๋ณด์ ์ทจ์ฝ์ ๋ฐ ์ฝ๋ ์ค๋ฉ์ ๋ํ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. SonarQube๋ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉ๋์ด ๋ชจ๋ ์ปค๋ฐ์์ ์ฝ๋ ํ์ง์ ์๋์ผ๋ก ๋ถ์ํ ์ ์์ต๋๋ค. ๋ค๊ตญ์ ๊ธ์ต ๊ธฐ๊ด์ SonarQube๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์จ๋ผ์ธ ๋ฑ ํน ํ๋ซํผ์ ๋ณด์๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
- ํ๋ฌ๊ทธ์ธ์ด ์๋ ESLint: ESLint๋ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ํ์ฅํ์ฌ ๋ ๊ณ ๊ธ ์ ์ ๋ถ์์ ์ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,
eslint-plugin-securityํ๋ฌ๊ทธ์ธ์ ์ฝ๋์ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฐ์งํ ์ ์์ต๋๋ค. - Code Climate: Code Climate๋ ์๋ํ๋ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฐ ์ ์ ๋ถ์์ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ํ๋ซํผ์ ๋๋ค. GitHub ๋ฐ GitLab๊ณผ ๊ฐ์ ์ธ๊ธฐ ์๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ๊ณผ ํตํฉ๋๋ฉฐ ์ฝ๋ ํ์ง์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
์์: SonarQube ์ฌ์ฉํ๊ธฐ
๋จผ์ , SonarQube ์๋ฒ๋ฅผ ์ค์นํ๊ณ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์์ธํ ์ง์นจ์ SonarQube ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค. ๊ทธ๋ฐ ๋ค์, SonarScanner ๋ช ๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค:
sonar-scanner \
-Dsonar.projectKey=my-javascript-project \
-Dsonar.sources=. \
-Dsonar.javascript.lcov.reportPaths=coverage/lcov.info
์ด ๋ช
๋ น์ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ SonarQube ์๋ฒ์ ์
๋ก๋ํฉ๋๋ค. sonar.javascript.lcov.reportPaths ์์ฑ์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ ์์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค(์๋ ํ
์คํธ ์น์
์ฐธ์กฐ).
3. ์ฝ๋ ๋ฆฌ๋ทฐ
์ฝ๋ ๋ฆฌ๋ทฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ฉ์ธ ์ฝ๋๋ฒ ์ด์ค์ ๋ณํฉํ๊ธฐ ์ ์ ๊ฒํ ํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด๋ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ , ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ฉฐ, ์ฝ๋๊ฐ ์ฝ๋ฉ ํ์ค์ ์ค์ํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฝ๋ ๋ฆฌ๋ทฐ๋ ๊ฐ๋ฐ์ ๊ฐ์ ์ง์ ๊ณต์ ์ ๋ฉํ ๋ง์ ์ํ ์์คํ ๊ธฐํ์ ๋๋ค.
์ฝ๋ ๋ฆฌ๋ทฐ ๋ชจ๋ฒ ์ฌ๋ก:
- ๋ช ํํ ์ฝ๋ฉ ํ์ค ์๋ฆฝ: ํ์ ๋ชจ๋ ์ฌ๋์ด ์ฝ๋ฉ ํ์ค๊ณผ ๊ฐ์ด๋๋ผ์ธ์ ์ต์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ ์ฌ์ฉ: GitHub ํ ๋ฆฌํ์คํธ, GitLab ๋จธ์ง ๋ฆฌํ์คํธ, Bitbucket ํ ๋ฆฌํ์คํธ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฝ๋ ํ์ง์ ์ง์ค: ์ ์ฌ์ ์ธ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ ๋ฐ ์ฝ๋ ์ค๋ฉ์ ์ฐพ์ต๋๋ค.
- ๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ ์ ๊ณต: ์กด์คํ๋ ํ๋๋ฅผ ์ ์งํ๊ณ ๊ฐ์ ์ ์ํ ๊ตฌ์ฒด์ ์ธ ์ ์์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋ํ: ๋ฆฐํฐ์ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ฅผ ์๋ํํฉ๋๋ค.
- ๋ฆฌ๋ทฐ ๋ฒ์ ์ ํ: ํฐ ์ฝ๋ ๋ณ๊ฒฝ์ ํจ๊ณผ์ ์ผ๋ก ๊ฒํ ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ฉ์ด๋ฆฌ๋ก ๋๋๋๋ค.
- ๋ค๋ฅธ ํ์ ์ฐธ์ฌ: ์ฝ๋ ๋ฆฌ๋ทฐ์ด๋ฅผ ์ํ์์ผ ํ์ ๋ชจ๋ ์ฌ๋์ด ์ฝ๋๋ฒ ์ด์ค์ ์ฝ๋ฉ ํ์ค์ ์ต์ํด์ง๋๋ก ํฉ๋๋ค.
์์: GitHub ํ ๋ฆฌํ์คํธ๋ฅผ ์ฌ์ฉํ ์ฝ๋ ๋ฆฌ๋ทฐ ์ํฌํ๋ก์ฐ
- ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ฅ ๋๋ ๋ฒ๊ทธ ์์ ์ ์ํด ์ ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ฐ๋ฐ์๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ธ๋์น์ ์ปค๋ฐํฉ๋๋ค.
- ๊ฐ๋ฐ์๋ ๋ธ๋์น๋ฅผ ๋ฉ์ธ ๋ธ๋์น(์:
main๋๋develop)๋ก ๋ณํฉํ๊ธฐ ์ํ ํ ๋ฆฌํ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. - ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ํ ๋ฆฌํ์คํธ์ ์ฝ๋๋ฅผ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ๊ณผ ๊ฐ์ ์ ์์ ์ ๊ณตํฉ๋๋ค.
- ์๋ ๊ฐ๋ฐ์๋ ํผ๋๋ฐฑ์ ๋ฐ์ํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ธ๋์น์ ์ปค๋ฐํฉ๋๋ค.
- ๋ฆฌ๋ทฐ์ด๋ค์ด ์ฝ๋์ ๋ง์กฑํ ๋๊น์ง ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๊ฐ ๊ณ์๋ฉ๋๋ค.
- ํ ๋ฆฌํ์คํธ๊ฐ ์น์ธ๋๊ณ ๋ฉ์ธ ๋ธ๋์น์ ๋ณํฉ๋ฉ๋๋ค.
4. ํ ์คํ
ํ ์คํ ์ ์ฝ๋๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ์๋ํฌ์๋ ํ ์คํธ ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ์ ํ์ ํ ์คํธ๊ฐ ์์ต๋๋ค. ์ฒ ์ ํ ํ ์คํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ SaaS ์ ๊ณต์ ์ฒด๋ ํ๋ซํผ์ด ๋ค์ํ ๋ธ๋ผ์ฐ์ , ์ฅ์น ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
ํ ์คํธ ์ ํ:
- ๋จ์ ํ ์คํธ(Unit Testing): ๋จ์ ํ ์คํธ๋ ํจ์๋ ํด๋์ค์ ๊ฐ์ ๊ฐ๋ณ ์ฝ๋ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ์ฌ ํ ์คํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํตํฉ ํ ์คํธ(Integration Testing): ํตํฉ ํ ์คํธ๋ ์๋ก ๋ค๋ฅธ ์ฝ๋ ๋จ์ ๊ฐ์ ์ํธ ์์ฉ์ ํ ์คํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์๋ํฌ์๋(E2E) ํ ์คํธ(End-to-End Testing): ์๋ํฌ์๋ ํ ์คํธ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ์๋ถํฐ ๋๊น์ง ํ ์คํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ต์ข ์ฌ์ฉ์์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ํ ์คํธ ํ๋ ์์ํฌ:
- Jest: Jest๋ Facebook์์ ๊ฐ๋ฐํ ์ธ๊ธฐ ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์ค์ ๊ณผ ์ฌ์ฉ์ด ๊ฐํธํ๋ฉฐ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ณด๊ณ , ๋ชจ์(mocking), ์ค๋ ์ท ํ ์คํธ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Jest๋ ์ข ์ข React ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- Mocha: Mocha๋ ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ์์ ๋ง์ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Chai)์ ๋ชจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Sinon)๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
- Chai: Chai๋ Mocha๋ ๋ค๋ฅธ ํ ์คํธ ํ๋ ์์ํฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ฝ๋๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํ ๋ค์ํ ๋จ์ธ์ ์ ๊ณตํฉ๋๋ค.
- Cypress: Cypress๋ ํ ์คํธ๋ฅผ ๋ ์ฝ๊ณ ์ฆ๊ฒ๊ฒ ๋ง๋๋ ๋ฐ ์ค์ ์ ๋ ์๋ํฌ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. ํ ์คํธ ์คํ ๋ฐ ์ค๋ฅ ๋๋ฒ๊น ์ ์ํ ์๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Playwright: Playwright๋ Microsoft์์ ๊ฐ๋ฐํ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค. Chrome, Firefox, Safari, Edge์์์ ํ ์คํธ๋ฅผ ์ง์ํฉ๋๋ค.
์์: Jest๋ฅผ ์ฌ์ฉํ ๋จ์ ํ ์คํธ
๋จผ์ , Jest๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํฉ๋๋ค:
npm install jest --save-dev
๊ทธ๋ฐ ๋ค์, ํ
์คํธํ๋ ค๋ ํจ์์ ๋ํ ํ
์คํธ ํ์ผ(์: my-function.test.js)์ ์์ฑํฉ๋๋ค:
// my-function.test.js
const myFunction = require('./my-function');
describe('myFunction', () => {
it('should return the sum of two numbers', () => {
expect(myFunction(2, 3)).toBe(5);
});
it('should return 0 if either number is negative', () => {
expect(myFunction(-2, 3)).toBe(0);
expect(myFunction(2, -3)).toBe(0);
});
});
์ด ํ
์คํธ ํ์ผ์ myFunction ํจ์์ ๋ํ ๋ ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ํ
์คํธ ์ผ์ด์ค๋ ํจ์๊ฐ ๋ ์ซ์์ ํฉ์ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค. ๋ ๋ฒ์งธ ํ
์คํธ ์ผ์ด์ค๋ ์ซ์ ์ค ํ๋๋ผ๋ ์์์ด๋ฉด ํจ์๊ฐ 0์ ๋ฐํํ๋์ง ํ์ธํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค:
npx jest
Jest๋ ํ ์คํธ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
5. ์ฝ๋ ํฌ๋งทํ
์ผ๊ด๋ ์ฝ๋ ํฌ๋งทํ ์ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ฝ๋ ํฌ๋งทํฐ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ์ฌ ํ์ ๋ชจ๋ ์ฌ๋์ด ๋์ผํ ์คํ์ผ์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ค์ด ์๋ก ๋ค๋ฅธ ์ฝ๋ฉ ์คํ์ผ์ ๊ฐ์ง ์ ์๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ํนํ ์ค์ํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ์ฝ๋ ํฌ๋งทํฐ:
- Prettier: Prettier๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ๋ ์ธ๊ธฐ ์๋ ์ฝ๋ ํฌ๋งทํฐ์ ๋๋ค. ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น ์ธํธ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ์ฌ ์ผ๊ด๋๊ฒ ํฌ๋งท๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์๋ ์์ ๊ธฐ๋ฅ์ด ์๋ ESLint: ESLint๋
--fix์ต์ ์ ํ์ฑํํ์ฌ ์ฝ๋๋ฅผ ํฌ๋งทํ๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ์๋์ผ๋ก ์์ ํ ์ ์๋ ๋ชจ๋ ๋ฆฐํ ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ์์ ํฉ๋๋ค.
์์: Prettier ์ฌ์ฉํ๊ธฐ
๋จผ์ , Prettier๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํฉ๋๋ค:
npm install prettier --save-dev
๊ทธ๋ฐ ๋ค์, ํ๋ก์ ํธ ๋ฃจํธ์ Prettier ๊ตฌ์ฑ ํ์ผ(.prettierrc.js ๋๋ .prettierrc.json)์ ์์ฑํฉ๋๋ค:
// .prettierrc.js
module.exports = {
semi: true,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 2,
};
์ด ๊ตฌ์ฑ์ Prettier๊ฐ ์ธ๋ฏธ์ฝ๋ก , ํํ ์ผํ, ์์๋ฐ์ดํ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ ฅ ๋๋น๋ฅผ 120์๋ก ์ง์ ํ๋๋ก ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฝ๋๋ฅผ ํฌ๋งทํฉ๋๋ค:
npx prettier --write .
Prettier๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ผ์ ๊ตฌ์ฑ๋ ๊ท์น์ ๋ฐ๋ผ ํฌ๋งทํฉ๋๋ค.
์ํฌํ๋ก์ฐ์ ์ฝ๋ ํ์ง ๊ด๋ฆฌ ํตํฉํ๊ธฐ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ์์ ์ง์์ ์ธ ๊ฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ์ด๋ฌํ ๋๊ตฌ์ ๊ธฐ์ ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ด๋ฅผ ์ํ ๋ช ๊ฐ์ง ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฐํ ๋ฐ ์ ์ ๋ถ์์ ํธ์ง๊ธฐ์ ํตํฉ: ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ ์ฝ๋ ํ์ง์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ธ๊ธฐ ์๋ ์ฝ๋ ํธ์ง๊ธฐ์๋ ESLint ๋ฐ ๊ธฐํ ๋ฆฐํฐ๋ฅผ ์ํ ํ๋ฌ๊ทธ์ธ์ด ์์ต๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ํ: ์ฝ๋ ๋ฆฌ๋ทฐ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๊ฒํ ํ๊ณ ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ํ ์คํ ์ ๋น๋ ํ๋ก์ธ์ค์ ํตํฉ: ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ ์คํธ๊ฐ ์๋์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์ง์์ ์ธ ํตํฉ(CI) ์๋ฒ ์ฌ์ฉ: CI ์๋ฒ๋ ์ ์ฒด ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ฑธ์ณ ์ฝ๋ ํ์ง์ด ์ ์ง๋๋๋ก ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ธ๊ธฐ ์๋ CI/CD ๋๊ตฌ์๋ Jenkins, CircleCI, GitHub Actions, GitLab CI๊ฐ ์์ต๋๋ค.
- ์ฝ๋ ํ์ง ์งํ ์ถ์ : SonarQube๋ Code Climate์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ฝ๋ ํ์ง ์งํ๋ฅผ ์ถ์ ํฉ๋๋ค. ์ด๋ ๊ฐ์ ํ ์์ญ์ ์๋ณํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ์ธก์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฝ๋ ํ์ง ๊ด๋ฆฌ ๊ตฌํ์ ์ด๋ ค์ ๊ทน๋ณตํ๊ธฐ
์ฝ๋ ํ์ง ๊ด๋ฆฌ ๊ตฌํ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ์ ์ฌ์ ์ธ ์ด๋ ค์์ ์ธ์ํ๊ณ ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ์ ๋ต์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ณํ์ ๋ํ ์ ํญ: ๊ฐ๋ฐ์๋ค์ ์๋ก์ด ๋๊ตฌ์ ๊ธฐ์ ์ ์ฑํํ๋ ๋ฐ ์ ํญํ ์ ์์ผ๋ฉฐ, ํนํ ๊ฐ๋ฐ ์๋๋ฅผ ๋ฆ์ถ๋ค๊ณ ์ธ์๋ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ์ด์ ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ณ ์ ์ ํ ๊ต์ก๊ณผ ์ง์์ ์ ๊ณตํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ญ์์ค. ์๊ณ ์ ์ง์ ์ธ ๋ณํ๋ก ์์ํ๊ณ ์ด๊ธฐ ์ฑ๊ณต์ ์ถํํ์ญ์์ค.
- ์๊ฐ ์ ์ฝ: ์ฝ๋ ํ์ง ๊ด๋ฆฌ๋ ์ถ๊ฐ์ ์ธ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํ์๋ก ํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋น ๋ฅด๊ฒ ์งํ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ค์ํ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ฅผ ์ฐ์ ์์๋ก ์ ํ๊ณ ๊ฐ๋ฅํ ํ ๋ง์ด ์๋ํํ์ญ์์ค. ์ฝ๋ ํ์ง ์์ ์ ์คํ๋ฆฐํธ ๊ณํ์ ํฌํจ์ํค๊ณ ์ถฉ๋ถํ ์๊ฐ์ ํ ๋นํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ฌธ์ฑ ๋ถ์กฑ: ์ฝ๋ ํ์ง ๋๊ตฌ์ ๊ธฐ์ ์ ๊ตฌํํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ค๋ฉด ์ ๋ฌธ ์ง์๊ณผ ๊ธฐ์ ์ด ํ์ํฉ๋๋ค. ๋ด๋ถ ์ ๋ฌธ์ฑ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๊ต์ก ๋ฐ ๊ฐ๋ฐ์ ํฌ์ํ๊ฑฐ๋, ์ง์นจ์ ์ ๊ณตํ ์ธ๋ถ ์ปจ์คํดํธ๋ฅผ ๊ณ ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฐ์ ์์ ์ถฉ๋: ์ฝ๋ ํ์ง์ ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ฐ ๋ฒ๊ทธ ์์ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์ฐ์ ์์์ ๊ฒฝ์ํ ์ ์์ต๋๋ค. ๋ช ํํ ์ฝ๋ ํ์ง ๋ชฉํ์ ์งํ๋ฅผ ์ค์ ํ๊ณ ๋น์ฆ๋์ค ๋ชฉํ์ ์ผ์นํ๋์ง ํ์ธํ์ญ์์ค.
- ์ผ๊ด์ฑ ์ ์ง: ๋๊ท๋ชจ ํ ์ ์ฒด์์ ์ฝ๋ฉ ์คํ์ผ๊ณผ ์ฝ๋ ํ์ง์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๋ํ๋ ๋ฆฐํ ๋ฐ ํฌ๋งทํ ์ ํตํด ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๊ณ , ์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํํ์ฌ ๋ถ์ผ์น๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ์ญ์์ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ๋ ํ๋ ์น ๊ฐ๋ฐ์ ํ์์ ์ธ ์ธก๋ฉด์ ๋๋ค. ์ง์์ ์ธ ๊ฐ์ ๊ดํ์ ๊ตฌํํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์๊ตฌ๋ฅผ ์ถฉ์กฑํ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ๋ ผ์๋ ๋๊ตฌ์ ๊ธฐ์ ์ ์์ฉํจ์ผ๋ก์จ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ๋ณํ์ํค๊ณ ์กฐ์ง์ ๊ฐ์น๋ฅผ ์ ๊ณตํ๋ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฝ๋ ํ์ง์ ํฅํ ์ฌ์ ์ ๊ณ์๋๋ฉฐ, ์ง์์ ์ธ ๊ฐ์ ์ ์์ฉํ๋ ๊ฒ์ด ๋์์์ด ์งํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๊ณ์์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ์ด์ ์ ๋๋ค.