ํจ์จ์ ์ด๊ณ ์์ ํ๋ฉฐ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ Python ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ง๋ฉดํ๋ ๊ณผ์ ์ ๋๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ฝ๋์ ๋ณต์ก์ฑ ์ฆ๊ฐํ์ฌ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ฑ ๋ฐ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ด ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๊ฐ ํ์ํ ๊ณณ์ ๋๋ค. Python ๋งค์ฐ ๊ท์คํด์ง๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๊ฐ๋ฐ์๊ฐ ์คํํ์ง ์๊ณ ๋ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ ์ ์๋๋ก ๋์์ค๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์, ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ณด์ ์ํ์ด ์์ต๋๋ค. ํตํฉํ์ฌ ์ ์ ๋ถ์ ์ํฌํ๋ก์ ์ฝ๋ ํ์ง์ ํฅ์์ํค๊ณ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ต์ ํํ๋ฉฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๊ฐ์ ์ค์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ํฉ 8 ๊ทธ๋ฆฌ๊ณ ๊นจ๋ํ ์ฝ๋ฉ ์์น.
ํ๋ํ ์ํ ๋ช ํ์ฑ
Smart TS XL์ ์ค์บ๋ ์ถ๋ ฅ์ ๋์ ๋ฐ ์ข ์์ฑ ์ปจํ ์คํธ์ ๊ธฐ๋ฐํ์ฌ ์ ๊ณตํจ์ผ๋ก์จ Python DevOps ๊ฒ์ดํธ ๊ฒฐ์ ์ ๊ฐ์ ํฉ๋๋ค.
์ง๊ธ ํ์์ ์ ์ฝ๋ ๋ถ์์ ๋จ์ํ ๊ตฌ๋ฌธ ๊ฒ์ฌ๋ฅผ ๋์ด ์ฝ๋ ๋ณต์ก์ฑ, ๋ ผ๋ฆฌ ์ค๋ฅ ๋ฐ ๋ฐํ์ ์ฑ๋ฅ์ ํ๊ฐํฉ๋๋ค. ์ฌ์ฉ๋์ง ์๋ ๋ณ์, ์ค๋ณต ๋ฃจํ ๋ฐ ์ต์ ์ด ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ณํ์ฌ ์ด๋ฌํ ๋๊ตฌ๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ ๋ณด์ ๊ฐ์ฌ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ ์ ์ฉ ๊ฐ๋ฅํด์ง๊ธฐ ์ ์ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ฑ์ ๊ฐ์งํฉ๋๋ค. ์์ Python ์คํฌ๋ฆฝํธ๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ ํ๋ ์ ์ ๋ถ์์ ํตํฉํ๋ฉด ์ฝ๋๊ฐ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์์ ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ Python ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ฑ๋ฅ, ๋ณด์ ๋ฐ ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ด์ฌ์ ์ํ ํ์ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ 20๊ฐ์ง
์ค๋งํธ TS XL
Smart TS XL์ ์ต์ Python ๊ฐ๋ฐ์ ์ํด ์ค๊ณ๋ ๊ณ ์ฑ๋ฅ AI ๊ธฐ๋ฐ ์ ์ ์ฝ๋ ๋ถ์ ๋ฐ ์ํฅ ํ๊ฐ ๋๊ตฌ์ ๋๋ค. ๋ณต์กํ Python ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ํ์ ์ถ์ข ์ ๋ถํํ๋ ์ ํ์ฑ, ํจ์จ์ฑ ๋ฐ ๋ณด์์ ์ ๊ณตํ์ฌ ๊ธฐ์ , ์ํํธ์จ์ด ๊ฐ๋ฐ ํ ๋ฐ ์ฌ์ด๋ฒ ๋ณด์ ์ ๋ฌธ๊ฐ์๊ฒ ํ์์ ์ธ ์๋ฃจ์ ์ ๋๋ค. ์๋ฐฑ๋ง ์ค์ Python ์ฝ๋๋ฅผ ๋ช ์ด ๋ง์ ๋ถ์ํ ์ ์๋ Smart TS XL์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ์ ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋น๊ตํ ์ ์๋ ์๋์ ํ์ฅ์ฑ
- ์ค์๊ฐ์ผ๋ก ์ฌ์ธต์ ์ธ ์ ์ ์ฝ๋ ๋ถ์์ ์คํํ์ฌ ๋ช ์ด ๋ด์ ์ทจ์ฝ์ ๊ณผ ๋นํจ์จ์ฑ์ ๊ฐ์งํฉ๋๋ค.
- ์ฑ๋ฅ ์ ํ ์์ด ๊ด๋ฒ์ํ Python ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฒ๋ฆฌํ๋ฏ๋ก ๊ธฐ์ ๊ท๋ชจ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
- ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ๊ณผ์ ์ํํ ํตํฉ์ ์ ๊ณตํ์ฌ ๋ชจ๋ ๊ท๋ชจ์ ํ์ ์ง์ํ๊ณ , ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋์์ ์ฝ๋๋ฅผ ๋ถ์ํ ์ ์๋๋ก ํฉ๋๋ค.
ํฌ๊ด์ ์ธ ์ฝ๋ ํ์ง ๋ฐ ๋ณด์ ๊ฐ์ฌ
Smart TS XL์ ์ฌ์ธต์ ์ธ ์ ์ ์ฝ๋ ๋ถ์์ ์ ๊ณตํ์ฌ ๋ณด์ ์ทจ์ฝ์ฑ, ๋นํจ์จ์ ์ธ ์ฝ๋ ํจํด ๋ฐ ๊ตฌ์กฐ์ ์ฝ์ ์ ํ๋ก๋์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ์๋ณํฉ๋๋ค. AI ๊ธฐ๋ฐ ๊ธฐ์ ์ ํ์ฉํ์ฌ ์ ํํ๊ณ ์ํฉ์ ๋ง๋ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
- SQL ์ฃผ์ ์ํ, ํ๋์ฝ๋ฉ๋ ์๊ฒฉ ์ฆ๋ช , ์์ ํ์ง ์์ API ์ฌ์ฉ ๋ฑ์ ๋ณด์ ๊ฒฐํจ์ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ ํจ์จ์ฑ์ ์ต์ ํํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด Big O ํ๊ธฐ๋ฒ์ ๋ถ์ํฉ๋๋ค.
- ์ค๋ณต๋ ๋ฃจํ, ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ, ๋ถํ์ํ ๊ฐ์ฒด ๋ณด์กด์ ํ๋๊ทธ๋ก ํ์ํ์ฌ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
- PEP 8 ๋ฐ ๋ชจ๋ฒ ๋ณด์ ๊ดํ๊ณผ ๊ฐ์ Python ์ฝ๋ฉ ํ์ค์ ์ค์ํฉ๋๋ค.
์๋นํ ๋น์ฉ ์ ๊ฐ ๋ฐ ROI
- ์ฝ๋ ๊ฒํ ์๊ฐ์ 30-40% ๋จ์ถํ์ฌ ๊ฐ๋ฐํ์ด ๋๋ฒ๊น ์ด ์๋ ํ์ ์ ์ง์คํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ณด์ ์ทจ์ฝ์ ๊ณผ ๋นํจ์จ์ฑ์ ํ์ ํ์ฌ ๋ฐฐํฌ ํ ์์ ์ ๋๋ ๋น์ฉ์ด ์ต์ํ๋ฉ๋๋ค.
- Python ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๊ณผ CPU ์๋น๋ฅผ ์ต์ ํํ์ฌ ์ธํ๋ผ ๋น์ฉ์ ์ค์ ๋๋ค.
ํฅ์๋ ์ํํธ์จ์ด ํ์ง ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ
- ์ ํ๋ฆฌ์ผ์ด์ ์๋๋ฅผ ์ ํ์ํค๋ ์จ๊ฒจ์ง ์ข ์์ฑ, ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ, ๋นํจ์จ์ ์ธ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์งํ์ฌ ์ ๊ฑฐํฉ๋๋ค.
- ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ณต์กํ๊ฑฐ๋ ์ค๋๋ ์ฝ๋๋ฅผ ์๋ณํ์ฌ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ ๋๋ค.
- ์ผ๊ด๋๊ณ ๊น๋ํ ์ฝ๋ฉ ๊ดํ์ ์ ์ฉํ์ฌ Python ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
- ์ฝ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์์ธํ ์ค๋ช ๊ณผ ๊ถ์ฅ ์ฌํญ์ด ํฌํจ๋ ์คํ ๊ฐ๋ฅํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ด๋ ์ง์ ๊ด๋ฆฌ ๋ฐ ์์ฐ์ฑ ํฅ์
- ๋ช ํํ ๋ฌธ์์ AI ๊ธฐ๋ฐ ์ฝ๋ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ์ ๊ท ๊ฐ๋ฐ์์ ์จ๋ณด๋ฉ์ ๊ฐ์ํํฉ๋๋ค.
- ํ ๊ฐ ์ง์ ์ ๋ฌ์ ์๋ํํ์ฌ ์ ์ ์ฝ๋ ๋ถ์์ ๋ํ ์ ์ ๊ฐ๋ฐ์์ ๋ํ ์์กด๋๋ฅผ ์ค์ ๋๋ค.
- ์ ์ ๋ถ์ ๋ณด๊ณ ์๋ฅผ ์ํ ์ค์ ์ ์ฅ์๋ฅผ ํตํด ๊ฐ๋ฐํ๊ณผ ๋ณด์ํ ๊ฐ์ ํ์ ์ ๊ฐํํฉ๋๋ค.
- ์ํ ๋ณต์ก๋์ ๊ฐ์ ๊ณ ๊ธ ๋ณต์ก๋ ์ธก์ ํญ๋ชฉ์ ํ์ฉํ์ฌ ํ์ด ๋ฆฌํฉํ ๋ง ์์ ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
์ฐ์ ๋ฐ ๊ณ ๊ฐ ์ ํ
Smart TS XL์ **๋์ ๋ณด์, ์ฑ๋ฅ ์ต์ ํ, ๋๊ท๋ชจ Python ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ**์ด ํ์ํ ์ฐ์ ์ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- ๊ธ์ต ์๋น์ค โ ๊ท์ ํ๋ ์์ํฌ ์ค์๋ฅผ ๋ณด์ฅํ๊ณ ์ฌ๊ธฐ์ฑ ์ฝ๋ฉ ๊ดํ์ ๋ฐฉ์งํฉ๋๋ค.
- ์๋ฃ โ ๋ฏผ๊ฐํ ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ ์๋ฃ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณด์ ๊ท์ ์ ์ค์ํฉ๋๋ค.
- ๊ธฐ์ ํ์ฌ โ ๋๊ท๋ชจ Python ๊ธฐ๋ฐ ์ํํธ์จ์ด ์๋ฃจ์ ์ ์ฑ๋ฅ๊ณผ ๋ณด์์ ์ต์ ํํฉ๋๋ค.
- ์ ๋ถ ๊ธฐ๊ด โ ์ฌ์ด๋ฒ ๋ณด์ ํ๋กํ ์ฝ์ ์ค์ํ๊ณ ๋ฐ์ดํฐ ์นจํด๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ์๋งค ๋ฐ ์ ์ ์๊ฑฐ๋ โ ๊ฒฐ์ ์ฒ๋ฆฌ ์์คํ ๋ฐ API์ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฐ์งํฉ๋๋ค.
๊ตฌํ ๋ฐ ํตํฉ
- **์ต์ํ์ ์์คํ ์ข ์์ฑ**์ผ๋ก ๋ช ์๊ฐ ๋ด์ ๋ฐฐํฌ๋ฉ๋๋ค.
- **GitHub, GitLab, Bitbucket, Jenkins ๋ฐ ๊ธฐํ CI/CD ๋๊ตฌ**์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค.
- ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ์ํด **์ ์ฒด ๋ฐ ์ฆ๋ถ ์ฝ๋ ์ค์บ**์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
- **์๋ ์คํ**์ ์ํด ๊ตฌ์ฑํ ์ ์์ด ๊ฐ๋ฐ ํ์ ์๋ ์์ ๋ถ๋ด์ ์ค์ผ ์ ์์ต๋๋ค.
Pylint
Pylint๋ Python ์ฝ๋ ํ์ง๊ณผ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐํํ๋๋ก ์ค๊ณ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ , ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๊ณ , ์คํ ์ ์ ๋นํจ์จ์ฑ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ค๋ณต ๋ณ์, ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ, ๋ณต์กํ ํํ์๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ Pylint๋ ํ๋ก์ ํธ๊ฐ Python ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค. ์์ธํ ํ์ง ์ ์๋ฅผ ์ ๊ณตํ์ฌ ํ์ด ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๊ณ , ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ , ๊ฐ๋ฐ ํ๊ณผ ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ํฌ๊ด์ ์ธ ์ ์ ๋ถ์์ ์ํํ์ฌ ์ค๋ฅ, ์๋ชป๋ ๊ดํ ๋ฐ ์ฝ๋ ์ ์ฉ์ ๊ฐ์งํฉ๋๋ค.
- PEP 8 ์ค์๋ฅผ ๊ฐํํ์ฌ ํต์ผ๋ ํ์๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๊ฐ์ ์ฌํญ์ ์ถ์ ํ๊ธฐ ์ํด ์ซ์ํ ์ฝ๋ ํ์ง ์ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๊ท์น ๊ตฌ์ฑ์ ํตํด ํ์ ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๊ฒ์ฌ๋ฅผ ๋ง์ถคํํ ์ ์์ต๋๋ค.
- Jenkins, GitHub Actions ๋ฐ ๊ธฐํ CI/CD ๋๊ตฌ์ ํตํฉ๋์ด ์๋ํ๋ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
- ๋นํจ์จ์ ์ธ ๋ฃจํ, ์ค๋ณต๋ ๊ณ์ฐ, ์ฌ์ฉ๋์ง ์๋ ๋ณ์๋ฅผ ์๋ณํฉ๋๋ค.
๊ฐ์ ์์ญ
Pylint์ ์๊ฒฉํ ๊ท์น ์ธํธ๋ ๋ง์ ์์ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ๊ฐ๋ฐ์๋ฅผ ์๋ํ ์ ์์ต๋๋ค. ํ์ ์ข ์ข ์ค์ํ์ง ์์ ์๋ฆผ์ ํํฐ๋งํ๊ณ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ตฌ์ฑ์ ๋ฏธ์ธ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ ์ ํ ์ฌ์ฉ์ ์ง์ ์ด ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ์ค์ ์ฝ๋ ๊ฐ์ ์ ์ง์คํ๋ ๋์ ์ฌ์ํ ์คํ์ผ ์๋ฐ์ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค.
Pylint๋ ์ฝ๋ ์คํ์ผ ์ ์ฉ์ ๋ฐ์ด๋์ง๋ง, ๊ธฐ๋ณธ ์ ๊ณต ๋ณด์ ์ทจ์ฝ์ฑ ํ์ง ๊ธฐ๋ฅ์ด ๋ถ์กฑํฉ๋๋ค. ์ฌ์ธต์ ์ธ ๋ณด์ ๋ถ์์ด ํ์ํ ํ๋ก์ ํธ๋ ํฌ๊ด์ ์ธ ๋ณดํธ๋ฅผ ์ํ ์ถ๊ฐ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ๋ํ Pylint์ ๋ถ์์ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจํ ์ ์์ด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ ์ ์ฝ์ด ์๊ฒฉํ ํ๋ก์ ํธ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
Pylint
Pylint๋ Python ์ฝ๋ ํ์ง๊ณผ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐํํ๋๋ก ์ค๊ณ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๊ตฌ๋ฌธ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ , ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๊ณ , ์คํ ์ ์ ๋นํจ์จ์ฑ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ค๋ณต ๋ณ์, ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ, ๋ณต์กํ ํํ์๊ณผ ๊ฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๋ํ ์์ค ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ Pylint๋ ํ๋ก์ ํธ๊ฐ Python ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค. ์์ธํ ํ์ง ์ ์๋ฅผ ์ ๊ณตํ์ฌ ํ์ด ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๊ณ , ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ , ๊ฐ๋ฐ ํ๊ณผ ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ํฌ๊ด์ ์ธ ์ ์ ๋ถ์์ ์ํํ์ฌ ์ค๋ฅ, ์๋ชป๋ ๊ดํ ๋ฐ ์ฝ๋ ์ ์ฉ์ ๊ฐ์งํฉ๋๋ค.
- PEP 8 ์ค์๋ฅผ ๊ฐํํ์ฌ ํต์ผ๋ ํ์๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ๊ฐ์ ์ฌํญ์ ์ถ์ ํ๊ธฐ ์ํด ์ซ์ํ ์ฝ๋ ํ์ง ์ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๊ท์น ๊ตฌ์ฑ์ ํตํด ํ์ ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๊ฒ์ฌ๋ฅผ ๋ง์ถคํํ ์ ์์ต๋๋ค.
- Jenkins, GitHub Actions ๋ฐ ๊ธฐํ CI/CD ๋๊ตฌ์ ํตํฉ๋์ด ์๋ํ๋ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
- ๋นํจ์จ์ ์ธ ๋ฃจํ, ์ค๋ณต๋ ๊ณ์ฐ, ์ฌ์ฉ๋์ง ์๋ ๋ณ์๋ฅผ ์๋ณํฉ๋๋ค.
๊ฐ์ ์์ญ
Pylint์ ์๊ฒฉํ ๊ท์น ์ธํธ๋ ๋ง์ ์์ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ๊ฐ๋ฐ์๋ฅผ ์๋ํ ์ ์์ต๋๋ค. ํ์ ์ข ์ข ์ค์ํ์ง ์์ ์๋ฆผ์ ํํฐ๋งํ๊ณ ๋ ธ์ด์ฆ๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ตฌ์ฑ์ ๋ฏธ์ธ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ ์ ํ ์ฌ์ฉ์ ์ง์ ์ด ์์ผ๋ฉด ๊ฐ๋ฐ์๋ ์ค์ ์ฝ๋ ๊ฐ์ ์ ์ง์คํ๋ ๋์ ์ฌ์ํ ์คํ์ผ ์๋ฐ์ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ ์ ์์ต๋๋ค.
Pylint๋ ์ฝ๋ ์คํ์ผ ์ ์ฉ์ ๋ฐ์ด๋์ง๋ง, ๊ธฐ๋ณธ ์ ๊ณต ๋ณด์ ์ทจ์ฝ์ฑ ํ์ง ๊ธฐ๋ฅ์ด ๋ถ์กฑํฉ๋๋ค. ์ฌ์ธต์ ์ธ ๋ณด์ ๋ถ์์ด ํ์ํ ํ๋ก์ ํธ๋ ํฌ๊ด์ ์ธ ๋ณดํธ๋ฅผ ์ํ ์ถ๊ฐ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ๋ํ Pylint์ ๋ถ์์ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจํ ์ ์์ด ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ ์ ์ฝ์ด ์๊ฒฉํ ํ๋ก์ ํธ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
๊ฒ์
Black์ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์ฉํ๋ ๋งค์ฐ ๋ ๋จ์ ์ธ Python ์ฝ๋ ํฌ๋งคํฐ์ ๋๋ค. ๊ธฐ์กด ๋ฆฐํฐ์ ๋ฌ๋ฆฌ Black์ ์๊ฒฉํ ํฌ๋งคํ ๊ท์น์ ์ค์ํ๋๋ก ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งคํ ํ์ฌ ํ ๋ด์์ ์ฝ๋ ์คํ์ผ์ ๋๋ฌ์ผ ๋ ผ์์ ์ ๊ฑฐํฉ๋๋ค. ๊ท ์ผํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ์๋ ํฌ๋งคํ ์ ํ์์ฑ์ ์ค์ด๋ ๋์์ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํฉ๋๋ค. Black์ ์คํ ์์ค์ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ ๋ชจ๋์์ ๋๋ฆฌ ์ฌ์ฉ๋์ด ๊ฐ๋ฐ์์๊ฒ ์๋ ๊ฐ์ ์์ด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ "๋ธ๋ ์ฒ๋ฆฌ๋" ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฃผ์ ํน์ง
- ์ผ๊ด๋ ์คํ์ผ์ ์ ์งํ๊ธฐ ์ํด Python ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํฉ๋๋ค.
- ์๊ฒฉํ๊ณ ๋ ๋จ์ ์ธ ์คํ์ผ์ ์ ์ฉํ์ฌ ์๋์ ์ธ ์์ ๊ฒฐ์ ์ ํ์์ฑ์ ์ค์ ๋๋ค.
- Git ์ฌ์ ์ปค๋ฐ ํํฌ, CI/CD ํ์ดํ๋ผ์ธ ๋ฐ ์ธ๊ธฐ ์๋ IDE์ ์ํํ๊ฒ ์๋ํฉ๋๋ค.
- ๊ฐ๋ ์ฑ์ ๋์ด๊ธฐ ์ํด ์๋ ์ค ๋ฐ๊ฟ ๋ฐ ์ฝ๋ ์ฌ๊ตฌ์ฑ์ ์ง์ํฉ๋๋ค.
- ๋ชจ๋ ์ฝ๋๊ฐ ๋์ผํ ์์ ๊ท์น์ ๋ฐ๋ฅด๋๋ก ํ์ฌ ์ฝ๋ ๊ฒํ ์๋๋ฅผ ๋์ ๋๋ค.
- ๋ค์ํ Python ๋ฒ์ ๊ณผ ํธํ๋๋ฏ๋ก ์ฅ๊ธฐ ํ๋ก์ ํธ์ ์ ํฉํ ์์ ์ ์ธ ๋๊ตฌ์ ๋๋ค.
๊ณ ๋ คํด์ผ ํ ์ ํ ์ฌํญ
Black์ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์ฉํ์ง๋ง, ์๊ฒฉํ ์์ ๊ท์น์ ๋ชจ๋ ๊ฐ๋ฐ์์ ์ ํธ๋์ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋ฌ๋ฆฌ ์ฝ๋ ํ์ง, ๋ณต์ก์ฑ ๋๋ ๋ณด์ ๋ฌธ์ ์ ๋ํ ๋ฆฐํ ์ ์ํํ์ง ์์ผ๋ฏ๋ก ํฌ๊ด์ ์ธ ๋ถ์์ ์ํด Flake8 ๋๋ Pylint์ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Black์ ๋ํ ์์ ์ง์ ์ ๋ํ "์ผ๋ฅ ์ " ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ํ๋ ์ฌ์ฉ์ ์ง์ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ๋ณด๋ค ์ ์ฐํ ์์ ์ง์ ์ ์ด๋ฅผ ์ํ๋ ๊ฐ๋ฐ์๋ ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ํ ๋ง์ ๊ธฐ์ฌ์๊ฐ ์๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ๊ธฐ์กด ์์ ์ง์ ํ์ค์ด Black์ ๊ฐ์ ์คํ์ผ๊ณผ ๋ค๋ฅผ ๊ฒฝ์ฐ Black์ผ๋ก ์ ํํ๋ ค๋ฉด ์๋นํ ์ ์์ด ํ์ํ ์ ์์ต๋๋ค.
๋ง์ดํผ
Mypy๋ Python์ฉ ์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ๋ก, ๊ฐ๋ฐ์๊ฐ ๋ฐํ์ ์ ์ ์ ํ ๊ด๋ จ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Mypy๋ ์ ํ์ ์ ํ ์ฃผ์์ ๋์ ํ์ฌ ์ฝ๋ ์์ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์์ผ Python์ ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. Python ํ๋ก์ ํธ์ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ์ ์ฌ์ ์ธ ์ ํ ๋ถ์ผ์น, ๋๋ฝ๋ ์ธ์ ๋ฐ ์๋ชป๋ ๋ฐํ ์ ํ์ ๋ํ ์กฐ๊ธฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. Mypy๋ ๋ฏธ๋ฌํ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ์ฝ๋ ํ์ง์ ๊ฐ์ ํ๋ ๋ฐ ์ ํ ์์ ์ฑ์ด ํ์์ ์ธ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ๋ฐํ์ ์ ์ ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ฌ ์ ํ ๋ถ์ผ์น๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ์ ์ง์ ์ธ ํ์ดํ์ ์ง์ํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ์ ํ ํํธ๋ฅผ ์ ์ง์ ์ผ๋ก ์ฑํํ ์ ์์ต๋๋ค.
- ํจ์์ ๋ชจ๋ ์ ์ฒด์ ๊ฑธ์ณ ์ ํ ์ผ๊ด์ฑ์ ์ ์ฉํ์ฌ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ฌ ๊ฐ๋ฐ ์ด๊ธฐ์ ์ ํ ๊ด๋ จ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
- Python์ ๋ด์ฅ๋ ์ ํ ํํธ ๋ฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธํ๋ฉ๋๋ค.
- Flake8 ๋ฐ Pylint์ ๊ฐ์ ๋ฆฐํฐ์ ํจ๊ป ์๋ํ์ฌ ํฌ๊ด์ ์ธ ์ ์ ๋ถ์์ ์ํํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณผ์
Mypy๋ ์ฝ๋ ์์ ์ฑ์ ๊ฐํํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ ์ ํ ํํธ๋ฅผ ์ถ๊ฐํด์ผ ํ๋๋ฐ, ์ด๋ ํนํ ์๋ ์ ํ ์ฃผ์์ผ๋ก ์ค๊ณ๋์ง ์์ ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ๊ฒฝ์ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ ํ ๊ฒ์ฌ์ ์ต์ํ์ง ์์ ํ์ Mypy๋ฅผ ์ฑํํ ๋ ํ์ต ๊ณก์ ์ ์ง๋ฉดํ ์ ์๋๋ฐ, ์ด๋ ๋ ์๊ฒฉํ ์ฝ๋ฉ ๊ท์น์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
Mypy๋ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ฑฐ๋ ์ฝ๋ ์คํ์ผ ๊ท์น์ ์ ์ฉํ์ง ์์ผ๋ฏ๋ก ์์ ํ ๋ถ์์ ์ํด ๊ธฐ์กด ๋ฆฐํฐ ๋ฐ ๋ณด์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๋ํ ์ผ๋ถ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ์ ์ฒด ์ ํ ์ฃผ์์ด ์์ด ํน์ ๊ฒฝ์ฐ์ ๋ถ์์ ํ๊ฑฐ๋ ๋ถ์ ํํ ์ ํ ๊ฒ์ฌ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ฐ์
Bandit์ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ํน๋ณํ ์ค๊ณ๋ ๋ณด์ ์ค์ฌ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ํ๋์ฝ๋ฉ๋ ์๊ฒฉ ์ฆ๋ช , SQL ์ฃผ์ ๋ฐ ์์ ํ์ง ์์ ํจ์ ์ฌ์ฉ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ณด์ ์ทจ์ฝ์ฑ์ ๋ํด ์์ค ์ฝ๋๋ฅผ ์ค์บํฉ๋๋ค. Bandit์ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํจ์ผ๋ก์จ ํ์ ๋ณด์ ๊ฒฐํจ์ ์กฐ๊ธฐ์ ์๋ณํ๊ณ ์์ ํ์ฌ ๋ณด์ ์นจํด ์ํ์ ์ค์ผ ์ ์์ต๋๋ค. Bandit์ ๋ณด์์ ๋ฏผ๊ฐํ ํ๋ก์ ํธ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์ ๋ฐ ๊ท์ ์ค์๋ฅผ ์ฐ์ ์ํ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.
์ฃผ์ ํน์ง
- ํ๋์ฝ๋ฉ๋ ๋น๋ฐ๋ฒํธ ๋ฐ ์ทจ์ฝํ ์ํธํ ๊ดํ์ ํฌํจํ ์ผ๋ฐ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฐ์งํฉ๋๋ค.
- ์์ ํ์ง ์์ ํจ์ ํธ์ถ๊ณผ ์ ์ฌ์ ์ธ ์ฃผ์ ์ํ์ ์๋ณํ๊ธฐ ์ํด ์ ์ ์ฝ๋ ์ค์บ๋์ ์ํํฉ๋๋ค.
- ์ฌ๊ฐ๋ ์์ค์ ํฌํจํ ์์ธํ ๋ณด์ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํ์ฌ ์์ ์ฌํญ์ ์ฐ์ ์์๋ฅผ ์ ํฉ๋๋ค.
- ๋ฐฐํฌ ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ธฐ ์ํด CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉ๋ฉ๋๋ค.
- ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ๋ง์ถฐ ๋ณด์ ์ ์ฑ ์ ์กฐ์ ํ๊ธฐ ์ํ ์ฌ์ฉ์ ์ ์ ๊ท์น ๊ตฌ์ฑ์ ์ง์ํฉ๋๋ค.
- ๋ค๋ฅธ ๋ฆฐํฐ ๋ฐ ์ ์ ๋ถ์ ๋๊ตฌ์ ํจ๊ป ์๋ํ์ฌ ํฌ๊ด์ ์ธ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํฉ๋๋ค.
ํ๊ณ์ ๋์
Bandit์ ๋ณด์ ์ทจ์ฝ์ฑ์ ํ์งํ๋ ๋ฐ ํจ๊ณผ์ ์ด์ง๋ง, ์ฃผ๋ก ์ ์ ๋ถ์์ ์ด์ ์ ๋ง์ถ๊ณ ๋ฐํ์ ๋ณด์ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋์ ๋ณด์ ํ ์คํธ์ ์๋ ์ฝ๋ ๊ฒํ ๋ก ๋ณด์ํ์ฌ ๋ณด๋ค ์ฒ ์ ํ ๋ณด์ ํ๊ฐ๋ฅผ ๋ฌ์ฑํด์ผ ํฉ๋๋ค.
Bandit์ ํจ๊ณผ๋ ์ ์ ์ง ๊ด๋ฆฌ๋ ๊ท์น ์ธํธ์ ๋ฌ๋ ค ์์ผ๋ฉฐ, ์ด๋ ์๋ก์ด ์ํ์ ๋์ฒํ๊ธฐ ์ํด ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ ์ ์์ต๋๋ค. ๋ํ, ๊ฑฐ์ง ์์ฑ ๋ฐ์์ ์์ฑํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๊ตฌ์ฑ์ ๋ฏธ์ธ ์กฐ์ ํด์ผ ํฉ๋๋ค. ๋ณต์กํ ๋ณด์ ์๊ตฌ ์ฌํญ์ด ์๋ ํ๋ก์ ํธ๋ ๊ท์ ์ค์ ํ์ค์ ์ถฉ์กฑํ๊ธฐ ์ํ ์ถ๊ฐ ๋๊ตฌ๊ฐ ํ์ํ ์ ์์ต๋๋ค.
ํ์ด๋ผ์ดํธ
Pyright๋ Microsoft์์ ๊ฐ๋ฐํ Python์ฉ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ์ ๋๋ค. ๊ณ ๊ธ ์ ํ ์ถ๋ก ์ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์ด ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ์ ํ ๊ด๋ จ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Pyright๋ ๋ค๋ฅธ ์ ํ ๊ฒ์ฌ๊ธฐ์ ๋นํด ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ์ด์์ ์ ๋๋ค. ์ ์ง์ ์ธ ํ์ดํ์ ์ง์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์๋๋ก ์ ํ ํํธ๋ฅผ ์ฑํํ ์ ์์ต๋๋ค. Pyright๋ฅผ ์ํฌํ๋ก์ ํตํฉํ๋ฉด ํ์ ๋ค์ํ Python ๋ฒ์ ์์ ์ฝ๋ ์์ ์ฑ, ์ ์ง ๊ด๋ฆฌ์ฑ ๋ฐ ํธํ์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- ๋น ๋ฅด๊ณ ์ ํํ ์ ํ ์ถ๋ก ์ ํตํด ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ์ ์ง์ ์ธ ํ์ดํ์ ์ง์ํ์ฌ ์ ํ ํํธ์ ์ ์ง์ ์ธ ์ฑํ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Visual Studio Code ๋ฐ ๋ค๋ฅธ ํธ์ง๊ธฐ์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค.
- ์๋๊ฐ ์ต์ ํ๋์ด ๋๊ท๋ชจ Python ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
- ์ ํ ๋ถ์ผ์น, ์๋ชป๋ ํจ์ ์๋ช , ๋๋ฝ๋ ์ธ์๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ํฅ์๋ ๋๋ฒ๊น ์ ์ํด ์์ธํ ์ค๋ฅ ๋ฉ์์ง์ ์ ํ ์ ์์ ์ ๊ณตํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Pyright๋ ํ๋ฅญํ ํ์ ์ฒด์ปค์ด์ง๋ง, ์๊ฒฉํ ํ์ ์ ์ฉ์ผ๋ก ์ธํด ๊ฐ๋ฐ์๋ ํนํ ๋์ ํ์ดํ์ด ์๋ ํ๋ก์ ํธ์์ ์ฝ๋๋ฅผ ๊ด๋ฒ์ํ๊ฒ ๋ฆฌํฉํ ๋งํด์ผ ํ ์ ์์ต๋๋ค. ํ์ ํํธ์ ์ต์ํ์ง ์์ ํ์์๋ ๊ท์น์ ์ ์ํ๋ ๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
๋ํ Pyright๋ ์ ํ ๊ฒ์ฌ์๋ง ์ง์คํ๋ฉฐ ๋ณด์ ์ทจ์ฝ์ฑ์ด๋ ์คํ์ผ ๋ฌธ์ ์ ๋ํ ์ฝ๋๋ฅผ ๋ถ์ํ์ง ์์ต๋๋ค. ํฌ๊ด์ ์ธ ์ ์ ๋ถ์์ ์ํ๋ ๊ฐ๋ฐ์๋ Pylint๋ Bandit๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ์ ํ์ด๋งํ์ฌ ์ ์ฒด ์ฝ๋ ํ์ง ๋ฒ์๋ฅผ ๋ณด์ฅํด์ผ ํ ์๋ ์์ต๋๋ค.
ํ์ดํ์
Pytype์ Google์์ ๊ฐ๋ฐํ ์ ์ ์ ํ ์ถ๋ก ๋๊ตฌ๋ก, ๋ช ์์ ์ ํ ์ฃผ์ ์์ด๋ Python ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ์ ํ ์ค๋ฅ๋ฅผ ๊ฐ์งํฉ๋๋ค. ๊ฐ๋ฐ์๋ Python์ ๋์ ํน์ฑ์ ์ ์งํ๋ฉด์๋ ์ ํ ๊ฒ์ฌ์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. Pytype์ ์ฌ์ธต ์ฝ๋ ๋ถ์์ ํ์ฉํ์ฌ ์ ํ ๋ถ์ผ์น, ์๋ชป๋ ํจ์ ํธ์ถ ๋ฐ ์์์น ๋ชปํ ๋ฐํ ๊ฐ์ ์๋ณํฉ๋๋ค. ๊ด๋ฒ์ํ ์๋ ์ฃผ์ ์์ด๋ ๊ฐ๋ ฅํ ์ ํ ๊ฒ์ฆ์ด ํ์ํ ํ๋ก์ ํธ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ๋ช ์์ ์ธ ์ ํ ํํธ๊ฐ ํ์ ์์ด ์ ํ ์ถ๋ก ์ ์ํํฉ๋๋ค.
- ์๋ชป๋ ํจ์ ํธ์ถ, ๋ฐํ ์ ํ ๋ถ์ผ์น, ๋ณ์ ์ ํ ๋ถ์ผ์น๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ์ฝ๋ ๋ฌธ์ํ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์๋์ผ๋ก ์ ํ ์ฃผ์์ ์์ฑํฉ๋๋ค.
- ์ ํ์ด ์ง์ ๋์ง ์์ Python ํ๋ก์ ํธ์ ๋ถ๋ถ์ ์ผ๋ก ์ ํ์ด ์ง์ ๋ Python ํ๋ก์ ํธ์์ ์๋ํฉ๋๋ค.
- ์๋ํ๋ ์ ํ ๊ฒ์ฆ์ ์ํด CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉ๋ฉ๋๋ค.
- ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์ฌ์ ์ธ ์ ํ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๊ฒ์ฌํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
์ ์ฌ์ ํ๊ณ
Pytype์ ๊ฐ๋ ฅํ ์ ํ ์ถ๋ก ์ ์ ๊ณตํ์ง๋ง ๋ณต์กํ ๋์ ์ฝ๋์์ ํญ์ ์ ํ์ ์ ํํ๊ฒ ์ถ๋ก ํ์ง ๋ชปํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ฑฐ์ง ์์ฑ ๋๋ ์ค๋ฅ ๋๋ฝ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋งค์ฐ ๋์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ๋ช ์์ ์ ํ ํํธ๋ก ๋ณด์ํด์ผ ํ ์ ์์ต๋๋ค.
๋ํ Pytype์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ฑฐ๋ ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ์ ์ฉํ์ง ์์ต๋๋ค. ์ ์ฒด ์ ์ ๋ถ์์ด ํ์ํ ํ์ ๋ณด์ ๊ฐ์ฌ๋ฅผ ์ํด Bandit ๋๋ ์ฝ๋ ํฌ๋งทํ ์ ์ํด Black๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ์ ๊ฒฐํฉํด์ผ ํ ์ ์์ต๋๋ค.
๋ถ๋ฆฌ
isort๋ import ๋ฌธ์ ์๋์ผ๋ก ์ ๋ ฌํ๊ณ ์ ๋ฆฌํ์ฌ ํ๋ก์ ํธ ์ ์ฒด์์ ์ผ๊ด์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋ณด์ฅํ๋ Python ์ ํธ๋ฆฌํฐ์ ๋๋ค. ์ ์๋ ์์๋ก import๋ฅผ ์ฌ๊ตฌ์ฑํ์ฌ isort๋ ์ฝ๋ ์คํ์ผ์ ๋ถํ์ํ ๋ณํ์ ์ ๊ฑฐํ๊ณ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ์ฝ๋ ํธ์ง๊ธฐ, ๋ฒ์ ์ ์ด ์์คํ ๋ฐ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ํ์ ํ๋ก์ ํธ์์ ๊นจ๋ํ ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.
์ฃผ์ ํน์ง
- ํ๋ก์ ํธ ๊ท์น์ ๋ฐ๋ผ ์์ ๋ช ์ธ์๋ฅผ ์๋์ผ๋ก ์ ๋ ฌํ๊ณ ๊ทธ๋ฃนํํฉ๋๋ค.
- ๊ธฐ์กด ์คํ์ผ ๊ฐ์ด๋์ ํจ๊ป ์๋ํ๋ฉฐ ์ฌ์ฉ์ ์ ์ ์ ๋ ฌ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
- Visual Studio Code ๋ฐ PyCharm๊ณผ ๊ฐ์ IDE์ ํตํฉ๋์ด ์ค์๊ฐ ๊ฐ์ ธ์ค๊ธฐ ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- ์ฝ๋ ์ ์ถ ์ ์ ๊ฐ์ ธ์ค๊ธฐ ์ ๋ ฌ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ ์ปค๋ฐ ํํฌ๋ฅผ ์ง์ํฉ๋๋ค.
- Black, Flake8 ๋ฑ ๋ค๋ฅธ ์ ์ ๋ถ์ ๋๊ตฌ์ ํธํ๋ฉ๋๋ค.
- ์ผ๊ด๋ ๊ฐ์ ธ์ค๊ธฐ ๊ตฌ์กฐ๋ฅผ ์ ์งํจ์ผ๋ก์จ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
๊ฐ์ ์ ์ํ ์์ญ
isort๋ ์ํฌํธ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด์ง๋ง, ๊ทธ ๊ธฐ๋ฅ์ ๋ฌธ์ฅ์ ์ ๋ ฌํ๊ณ ๊ตฌ์ฑํ๋ ๋ฐ ๊ตญํ๋ฉ๋๋ค. ๋ ผ๋ฆฌ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ฑ ๋๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ๊ฐ์ ๋ ๊น์ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ ๊ฐ์งํ์ง ๋ชปํฉ๋๋ค.
๋ํ ํน์ ๊ฐ์ ธ์ค๊ธฐ ๊ตฌ์กฐ๊ฐ ์๋ ํ๋ก์ ํธ๋ isort์ ๊ธฐ๋ณธ ๋์์ ํ ์ ํธ๋์ ๋ง์ถ๊ธฐ ์ํด ์๋ ๊ตฌ์ฑ์ด ํ์ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ํน์ ๊ฐ์ ธ์ค๊ธฐ์ ์์น ์๋ ์ฌ์ ๋ ฌ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค์ ์ ๋ฏธ์ธ ์กฐ์ ํด์ผ ํ ์ ์์ต๋๋ค.
๋ผ๋
Radon์ Python ํ๋ก์ ํธ์ ์ฝ๋ ๋ณต์ก์ฑ์ ์ธก์ ํ๊ธฐ ์ํ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ, ์ ์ง ๊ด๋ฆฌ ์ง์ ๋ฐ ์์ ๋ฉํธ๋ฆญ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ๊ฐ๋ ์ฑ์ ํ๊ฐํ๊ณ ํ์ํ ๊ฒฝ์ฐ ๋ฆฌํฉํ ๋งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Radon์ ์ง๋์น๊ฒ ๋ณต์กํ ํจ์์ ๋ชจ๋์ ์๋ณํ์ฌ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์ฐ์ ์ํ๋ ํ๋ก์ ํธ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ์ง๋์น๊ฒ ๋ณต์กํ ํจ์๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์ํ ๋ณต์ก๋๋ฅผ ๋ถ์ํฉ๋๋ค.
- ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํ์ง์ ํ๊ฐํ๊ธฐ ์ํด ์ ์ง๋ณด์์ฑ ์ง์๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ง์์ ์ธ ๋ณต์ก์ฑ ํ๊ฐ๋ฅผ ์ํด CI/CD ํ์ดํ๋ผ์ธ๊ณผ์ ํตํฉ์ ์ง์ํฉ๋๋ค.
- ์ซ์์ ๋ณต์ก์ฑ ์ ์๊ฐ ํฌํจ๋ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
- ํ์ด ์ฅ๊ธฐ์ ์ธ ์ฝ๋ ์ง์ ๊ฐ๋ฅ์ฑ์ ์ํด ๋ฆฌํฉํ ๋ง ์์ ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- Pylint์ Black๊ณผ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป ์๋ํ์ฌ ํฌ๊ด์ ์ธ ์ ์ ๋ถ์ ์ํฌํ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณผ์
Radon์ ๊ท์คํ ๋ณต์ก์ฑ ์งํ๋ฅผ ์ ๊ณตํ์ง๋ง ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ์ง์ ์ ์ธ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๊ฒฐ๊ณผ๋ฅผ ํด์ํ๊ณ ์ ์ ํ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๋ํ, Radon์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ฑฐ๋ ์ฝ๋ฉ ์คํ์ผ ํ์ค์ ์ ์ฉํ์ง ์์ต๋๋ค. ์ ์ฒด ์ ์ ๋ถ์ ์๋ฃจ์ ์ด ํ์ํ ํ์ Radon์ linter ๋ฐ ๋ณด์ ์ค์ฌ ๋๊ตฌ์ ๊ฒฐํฉํ์ฌ ์ฝ๋ ํ์ง ๊ด๋ฆฌ์ ๋ํ ํฌ๊ด์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ทจํด์ผ ํ ์ ์์ต๋๋ค.
ํ๊ด ์
Prospector๋ ์ฌ๋ฌ ๋ฆฐํฐ๋ฅผ ๋จ์ผ ์ธํฐํ์ด์ค๋ก ์ง๊ณํ์ฌ ํฌ๊ด์ ์ธ ์ฝ๋ ํ์ง ๊ฒ์ฌ๋ฅผ ์ ๊ณตํ๋ Python ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. Pylint, Mypy, McCabe์ ๊ฐ์ ๋๊ตฌ๋ฅผ ๊ฒฐํฉํ์ฌ ๊ตฌ๋ฌธ ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๊ณ , ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๊ณ , ๋ณต์ก์ฑ์ ๋ถ์ํฉ๋๋ค. Prospector๋ ํตํฉ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํ์ฌ ์ฝ๋ ๋ถ์์ ๊ฐ์ํํ๋ฏ๋ก Python ์ฝ๋ ํ์ง์ ์ ์งํ๊ธฐ ์ํ ์ค์ ์ง์ค์ ๋๊ตฌ๊ฐ ํ์ํ ํ์ ์ด์์ ์ ๋๋ค.
์ฃผ์ ํน์ง
- Pylint, Pyflakes, McCabe๋ฅผ ํฌํจํ ์ฌ๋ฌ ๊ฐ์ ๋ฆฐํฐ๋ฅผ ํ๋์ ๋๊ตฌ๋ก ์ง๊ณํฉ๋๋ค.
- ์ฝ๋ ๋ณต์ก์ฑ, ์ ์ง ๊ด๋ฆฌ์ฑ ๋ฐ ๋ณด์์ ์ํด ์ฌ์ธต์ ์ธ ์ ์ ๋ถ์์ ์ํํฉ๋๋ค.
- ๋ถ์ ์ถ๋ ฅ์ ์ฌ์ฉ์ ์ ์ํ๊ธฐ ์ํด ์ธ๋ถ์ ์ธ ๊ท์น ๊ตฌ์ฑ์ ํ์ฉํฉ๋๋ค.
- CI/CD ์ํฌํ๋ก์ ํตํฉ๋์ด ์๋ํ๋ ํ์ง ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ์ฌ๋ฌ ์ ์ ๋ถ์ ๋๊ตฌ์ ํต์ฐฐ๋ ฅ์ ๋ด์ ๋จ์ผ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฌ๋ฌ ํ๊ณผ ํ๋ก์ ํธ์์ ์ฝ๋ ํ์ง ๊ด๋ฆฌ ๊ดํ์ ํ์คํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณผ์
Prospector๋ ์ฌ๋ฌ ๋ฆฐํฐ์ ๋ํ ํตํฉ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง๋ง, ๊ฒฝ๊ณ ์ ์ ์์ ์์ด ๋๋ฌด ๋ง์์ ์๋์ ์ผ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋ณด๊ณ ์์์ ๊ณผ๋ํ ๋ ธ์ด์ฆ๋ฅผ ํผํ๊ธฐ ์ํด ๊ตฌ์ฑ์ ์กฐ์ ํด์ผ ํ ์๋ ์์ต๋๋ค.
๋ํ Prospector๋ ๋ ๋ฆฝํ linter์ ๊ฐ์ด IDE ๋ด๋ถ์์ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ฆ์ ์ฝ๋ ๋ถ์๋ณด๋ค๋ ์ง์์ ์ธ ํตํฉ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
SonarQube(ํ์ด์ฌ ํ๋ฌ๊ทธ์ธ)
SonarQube๋ Python ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ์ํฐํ๋ผ์ด์ฆ ์์ค์ ์ฝ๋ ํ์ง ๊ด๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋ ๊ฐ๋ ฅํ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋๋ค. Python ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ฌ์ธต์ ์ธ ๋ณด์, ์ ์ง ๊ด๋ฆฌ ๋ฐ ์์ ์ฑ ๋ถ์์ ์ ๊ณตํฉ๋๋ค. SonarQube๋ ์ฝ๋๋ฒ ์ด์ค์ ์ง์์ ์ธ ๊ฒ์ฌ๋ฅผ ์ง์ํ๊ณ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ํ์ด ์ฝ๋ฉ ํ์ค์ ์ํํ๊ณ ๋ฐฐํฌ ์ ์ ์ทจ์ฝ์ฑ์ ๊ฐ์งํ๋๋ก ๋์ต๋๋ค.
์ฃผ์ ํน์ง
- ๋ณด์ ์ทจ์ฝ์ , ๋ฒ๊ทธ, ์ฝ๋ ์ ์ทจ๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ์ ์ ์ฝ๋ ๋ถ์์ ์ํํฉ๋๋ค.
- ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ Python ์ฝ๋ ํ์ง์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ์ค์ ๋์๋ณด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Jenkins, GitHub Actions ๋ฐ ๊ธฐํ CI/CD ๋๊ตฌ์ ํตํฉ๋์ด ์๋ํ๋ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
- ์ ์ฐ์ฑ์ ์ํด ์จํ๋ ๋ฏธ์ค ๋ฐ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ๋ฐฐํฌ๋ฅผ ๋ชจ๋ ์ง์ํฉ๋๋ค.
- ์ ๊ณ ์ฝ๋ฉ ํ์ค ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํฉ๋๋ค.
- ๋ฌธ์ ์ ์ฐ์ ์์๋ฅผ ํจ์จ์ ์ผ๋ก ์ง์ ํ๊ธฐ ์ํด ์ฌ๊ฐ๋ ๋ถ๋ฅ๋ฅผ ํฌํจํ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์์ฑํฉ๋๋ค.
๊ณ ๋ คํด์ผ ํ ์ ํ ์ฌํญ
SonarQube๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋ฆฌ์์ค ์ง์ฝ์ ์ธ ํน์ฑ์ผ๋ก ์ธํด ๋น๋ ์๋๊ฐ ๋๋ ค์ง ์ ์์ผ๋ฉฐ, ํนํ ๋๊ท๋ชจ Python ํ๋ก์ ํธ์์ ๊ทธ๋ ์ต๋๋ค. ํจ์จ์ ์ผ๋ก ์คํํ๋ ค๋ฉด ์ ์ฉ ์ธํ๋ผ๊ฐ ํ์ํ๋ฏ๋ก ์๊ท๋ชจ ํ์ด๋ ์คํํธ์ ์๋ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค.
๋ํ, SonarQube์ ๋ณด์ ๋ถ์ ๊ธฐ๋ฅ์ ์ ๋ฌธ ๋ณด์ ๋๊ตฌ๋งํผ ๊ด๋ฒ์ํ์ง ์์ต๋๋ค. ์๊ฒฉํ ๊ท์ ์ค์ ์๊ตฌ ์ฌํญ์ด ์๋ ์กฐ์ง์ ์ถ๊ฐ ๋ณด์ ์ค์ฌ ๋ถ์ ์๋ฃจ์ ์ผ๋ก ๋ณด์ํด์ผ ํ ์๋ ์์ต๋๋ค.
๋๋จธ๋ฆฌ ์๋ฆฌ
Vulture๋ ํ๋ก์ ํธ ๋ด์์ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋์ ์ฃฝ์ ์ฝ๋๋ฅผ ๊ฐ์งํ๋๋ก ์ค๊ณ๋ ๊ฐ๋ฒผ์ด Python ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ค๋ณต๋ ํจ์, ๋ณ์ ๋ฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ณํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Vulture๋ ํนํ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ฃผ์ ํน์ง
- Python ์ฝ๋์์ ์ฌ์ฉ๋์ง ์๋ ํจ์, ๋ณ์, ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ์ธ๋ชจ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ํํ๊ณ ์ ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ํ๋ก์ ํธ์๋ ํจ์จ์ ์ ๋๋ค.
- ํน์ ์ฝ๋๋ฒ ์ด์ค ๋ถ๋ถ์ ์ ์ธํ๊ธฐ ์ํด ์ฌ์ฉ์ ์ ์ ๋ฌด์ ๋ชฉ๋ก์ ์ง์ํฉ๋๋ค.
- ์์ฌ์ด ์ฝ๋ ์ ๋ฆฌ ๋ฐ ๋ฆฌํฉํ ๋ง์ ์ํ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ข ํฉ์ ์ธ ์ํฌํ๋ก๋ฅผ ์ํด ๋ค๋ฅธ ์ ์ ๋ถ์ ๋๊ตฌ์ ํธํ๋ฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Vulture๋ ์ฌ์ฉ๋์ง ์๋ ์ฝ๋๋ฅผ ๊ฐ์งํ๋ ๋ฐ ๋ฐ์ด๋์ง๋ง ๋ ผ๋ฆฌ์ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ฑ ๋๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ฌ์ธต ๋ถ์์ ์ํํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋ค๋ฅธ ๋ฆฐํฐ์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ฝ๋ ํ์ง์ ๋ํ ์ ์ฒด์ ์ธ ๊ทธ๋ฆผ์ ์ป์ด์ผ ํฉ๋๋ค.
๋ํ Vulture๋ ๋ฌธ์์ด ๊ธฐ๋ฐ ๋ฆฌํ๋ ์ ์ ํตํด ์ฐธ์กฐ๋๋ ํจ์์ ๊ฐ์ด ๋์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ฝ๋์์ ๊ฑฐ์ง ์์ฑ์ ์์ฑํ ์ ์์ต๋๋ค. ํ์ํ ์ฝ๋๊ฐ ์ค์๋ก ์ ๊ฑฐ๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ข ์ข ์๋ ๊ฒํ ๊ฐ ํ์ํฉ๋๋ค.
ํ์ด์ฝ๋์คํ์ผ
PyCodeStyle์ ์ด์ ์ PEP8๋ก ์๋ ค์ก์ผ๋ฉฐ, Python ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ์ํํ๋ ๋ฐ ์ค์ ์ ๋ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ Python์ ๊ณต์ ์คํ์ผ ๊ฐ์ด๋์ธ PEP 8์ ์ค์ํ๋์ง ํ์ธํ์ฌ ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์์ ์ผ๊ด๋ ์์์ ์ ์งํ๋๋ก ๋์ต๋๋ค. PyCodeStyle์ ๊ฐ๋ณ๊ณ ๊ฐ๋ฐ ์ํฌํ๋ก์ ์ฝ๊ฒ ํตํฉํ ์ ์์ผ๋ฉฐ, ๊นจ๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด Python ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- PEP 8 ์คํ์ผ ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ Python ์ฝ๋๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ค์ฌ์ฐ๊ธฐ, ๊ฐ๊ฒฉ, ์ค ๊ธธ์ด์ ๋ถ์ผ์น๋ฅผ ์๋ณํฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ IDE์์ ์ค์๊ฐ ๋ถ์์ ์ ํฉํฉ๋๋ค.
- ํน์ ์คํ์ผ ๊ท์น์ ๋ฌด์ํ๊ธฐ ์ํ ๊ตฌ์ฑ ์ต์ ์ ์ง์ํฉ๋๋ค.
- ์ฌ์ ์ปค๋ฐ ํํฌ ๋ฐ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ์ํํ๊ฒ ์๋ํฉ๋๋ค.
- Flake8 ๋ฑ ๋ค๋ฅธ ๋ฆฐํฐ์ ํตํฉํด ๋ ๊ด๋ฒ์ํ ์ฝ๋ ๋ถ์์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์ ์ ์ํ ์์ญ
PyCodeStyle์ ์์ ๊ท์น์ ์ ์ฉํ๋ ๋ฐ ํจ๊ณผ์ ์ด์ง๋ง, ๋ ผ๋ฆฌ์ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ฑ ๋๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ์ฝ๋๋ฅผ ๋ถ์ํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ํฌ๊ด์ ์ธ ์ ์ ๋ถ์์ ์ํด Pylint ๋๋ Bandit๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋ํ, ์ผ๋ถ ํ์ PEP 8์ ์๊ฒฉํ ๊ท์น์ด ํน์ ํ๋ก์ ํธ์๋ ๋๋ฌด ์๊ฒฉํ๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค. PyCodeStyle์ ์ฌ์ฉ์ ์ง์ ์ฝ๋ฉ ํ์ค์ ์ ์ํ๊ธฐ ์ํด ์๋ ๊ตฌ์ฑ์ด ํ์ํ๋ฏ๋ก ์ค์ ํ๋ก์ธ์ค์ ๋ณต์ก์ฑ์ด ๋ํด์ง ์ ์์ต๋๋ค.
ํ์ดํ๋ ์ดํฌ
PyFlakes๋ ์คํ์ผ ๊ท์น์ ์ ์ฉํ์ง ์๊ณ ์ฝ๋์ ์ค๋ฅ๋ฅผ ํ์งํ๋ ๋ฐ ์ค์ ์ ๋ Python์ฉ ๊ฒฝ๋ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๊ตฌ๋ฌธ ์ค๋ฅ, ์ ์๋์ง ์์ ๋ณ์ ๋ฐ ์ฌ์ฉ๋์ง ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒ ์๋ณํ์ฌ ๊นจ๋ํ๊ณ ์ค๋ฅ ์๋ Python ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. PyFlakes๋ ์๋์ ํจ์จ์ฑ์ผ๋ก ์ ๋ช ํ์ฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ด์์ ์ ๋๋ค.
์ฃผ์ ํน์ง
- ๊ตฌ๋ฌธ ์ค๋ฅ, ์ ์๋์ง ์์ ๋ณ์, ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ๋น ๋ฅด๋ฉฐ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- PEP 8์ด๋ ๊ธฐํ ์ฝ๋ฉ ์คํ์ผ ๊ท์น์ ์ ์ฉํ์ง ์์ต๋๋ค.
- Flake8 ๋ฑ ๋ค๋ฅธ ๋ฆฐํฐ์ ์ฝ๊ฒ ํตํฉ๋์ด ๋ ๊ด๋ฒ์ํ ๋ถ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ์์ ์๋ํ๋ ์ค๋ฅ ๊ฐ์ง์ ํจ๊ณผ์ ์ ๋๋ค.
- ์ต์ํ์ ๊ตฌ์ฑ๋ง ํ์ํ๋ฏ๋ก ์ด๋ค ํ๋ก์ ํธ์์๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฐ์ ์ ์ํ ์์ญ
PyFlakes๋ ๊ธฐ๋ณธ ์ฝ๋ฉ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๋ ๋ฐ ๋ฐ์ด๋์ง๋ง ๋ณด์ ๊ฐ์ฌ, ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋๋ ๋ณต์ก์ฑ ๊ฒ์ฌ์ ๊ฐ์ ๊ณ ๊ธ ์ ์ ๋ถ์ ๊ธฐ๋ฅ์ด ๋ถ์กฑํฉ๋๋ค. ๋ณด๋ค ์ฌ์ธต์ ์ธ ์ฝ๋ ๋ถ์์ ์ํ๋ ๊ฐ๋ฐ์๋ PyFlakes๋ฅผ ๋ณด์์ ์ํ Bandit ๋๋ ๋ณต์ก์ฑ ์ธก์ ์ ์ํ Radon๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ก ๋ณด์ํด์ผ ํฉ๋๋ค.
๋ํ PyFlakes๋ ์ฝ๋ฉ ์คํ์ผ ๊ท์น์ ์ ์ฉํ์ง ์์ผ๋ฏ๋ก ์คํ์ผ์ ์ผ๊ด์ฑ์ ์ํ๋ ํ์ Black์ด๋ PyCodeStyle๊ณผ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋งฅ์ผ์ด๋ธ
McCabe๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ธก์ ํ๋ Python ์ ์ ๋ถ์ ๋๊ตฌ๋ก, ๊ฐ๋ฐ์๊ฐ ์ง๋์น๊ฒ ๋ณต์กํ ํจ์์ ๋ฉ์๋๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ณต์ก๋ ์ ์๊ฐ ๋์ผ๋ฉด ์ ์ง ๊ด๋ฆฌ, ๋๋ฒ๊น ๋๋ ํ ์คํธํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ ์์ญ์ ๋ํ๋ ๋๋ค. McCabe๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํ๋ฉด ํ์ ๋ณต์กํ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ์ง์คํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- Python ์ฝ๋์ ์ํ ๋ณต์ก๋๋ฅผ ๋ถ์ํฉ๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ง๋์น๊ฒ ๋ณต์กํ ๊ธฐ๋ฅ์ ์๋ณํ๊ณ ๋ฆฌํฉํ ๋งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- Flake8๊ณผ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ๋ฆฐํ ๊ณผ ๋ณต์ก์ฑ ๊ฒ์ฌ๋ฅผ ๊ฒฐํฉํ ์ ์์ต๋๋ค.
- ํจ์์ ๋ฉ์๋์ ์์น์ ๋ณต์ก๋ ์ ์๋ฅผ ํ ๋นํฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ๋ถ์์ ์ ํฉํฉ๋๋ค.
- ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ณต์ก์ฑ ์๊ณ๊ฐ.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
McCabe๋ ์ฝ๋ ๋ณต์ก์ฑ์ ์ธก์ ํ๋ ๋ฐ ์ ์ฉํ์ง๋ง ๋ฌธ์ ๊ฐ ์๋ ์์ญ์ ๋ฆฌํฉํ ๋งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋ณต์ก์ฑ ์ ์๋ฅผ ํด์ํ๊ณ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ์ง์ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค.
๋ํ McCabe๋ ๊ตฌ๋ฌธ ์ค๋ฅ, ๋ณด์ ์ทจ์ฝ์ฑ ๋๋ ์ฑ๋ฅ ๋นํจ์จ์ฑ์ ๋ํด ์ฝ๋๋ฅผ ๋ถ์ํ์ง ์์ต๋๋ค. ์์ ํ ์ ์ ๋ถ์ ์๋ฃจ์ ์ ์ฐพ๋ ํ์ ๋ณด์ ๊ฒ์ฌ๋ฅผ ์ํด Bandit ๋๋ ๊ตฌ๋ฌธ ๊ฒ์ฆ์ ์ํด PyFlakes์ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป McCabe๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๋๋ฆฐํธ
Dlint๋ ๊ฐ๋ฐ์๊ฐ ์ผ๋ฐ์ ์ธ Python ๋ณด์ ์ทจ์ฝ์ฑ์ ํ์งํ๊ณ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ๋ณด์ ์ค์ฌ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. Flake8์ ์ถ๊ฐ ๋ณด์ ๊ฒ์ฌ๋ก ํ์ฅํ์ฌ SQL ์ฃผ์ , ์์ ํ์ง ์์ ์ญ์ง๋ ฌํ ๋ฐ ํ๋์ฝ๋ฉ๋ ์๊ฒฉ ์ฆ๋ช ๊ณผ ๊ฐ์ ๋ณด์ ๊ฒฐํจ์ ๋ฐฉ์งํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๊ฐ ๋์์ต๋๋ค.
์ฃผ์ ํน์ง
- Python ์ฝ๋์ ๋ณด์ ์ทจ์ฝ์ ์ ํ์งํฉ๋๋ค.
- ๋ณด์์ ํนํ๋ ๋ฆฐํ ๊ท์น์ผ๋ก Flake8์ ํ์ฅํฉ๋๋ค.
- ์ ์ฌ์ ์ธ SQL ์ฃผ์ ์ํ๊ณผ ์์ ํ์ง ์์ ํจ์ ์ฌ์ฉ์ ํ์ํฉ๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ๊ณผ ์ฝ๊ฒ ํตํฉ๋์ด ์๋ํ๋ ๋ณด์ ๋ถ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ํจ์จ์ ์ด์ด์ ์ ๊ธฐ์ ์ธ ์ค์บ์ ์ ํฉํฉ๋๋ค.
- ๋ค๋ฅธ ์ ์ ๋ถ์ ๋๊ตฌ์ ํจ๊ป ์๋ํ์ฌ ํฌ๊ด์ ์ธ ๋ณด์ ๋ฒ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณผ์
Dlint๋ ๋ณด์ ์ค์ฌ ์ ์ ๋ถ์์ ํ์ํ์ง๋ง ์ฝ๋ ํ์ง, ์ ์ง ๊ด๋ฆฌ์ฑ ๋๋ ๋ณต์ก์ฑ์ ๋ํ ์์ ํ ๊ทธ๋ฆผ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ํ์ ์ด๋ฅผ ๋ค๋ฅธ ๋ฆฐํ ๋ฐ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ท ํ ์กํ ์ ๊ทผ ๋ฐฉ์์ ์ทจํด์ผ ํฉ๋๋ค.
Dlint์ ํจ๊ณผ๋ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ ๋ณด์ ๊ท์น ์ธํธ์ ๋ฌ๋ ค ์์ต๋๋ค. ์์ฃผ ์ ๋ฐ์ดํธํ์ง ์์ผ๋ฉด ์๋ก์ด ๋ณด์ ์ํ์ ๊ฐ์งํ์ง ๋ชปํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ต์์ ๋ณด์ ๊ดํ์ ๋ํด ๊ณ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค.
Wemake Python ์คํ์ผ ๊ฐ์ด๋
Wemake Python Styleguide๋ Python ํ๋ก์ ํธ์ ๋ํ ์๊ฒฉํ ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๋ ์๊ฒฌ์ด ์๋ ๋ฆฐํ ๋๊ตฌ์ ๋๋ค. Flake8์ ์ ์ง ๊ด๋ฆฌ์ฑ, ๋ณต์ก์ฑ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ถ๊ฐ ๊ท์น์ผ๋ก ํ์ฅํ์ฌ ํ์ด ๊ณ ํ์ง, ์ฝ๊ธฐ ์ฝ๊ณ ์ผ๊ด๋ ์ฝ๋๋ฅผ ์ ์งํ๋๋ก ๋์ต๋๋ค.
์ฃผ์ ํน์ง
- ์ถ๊ฐ์ ์ธ ๋ณต์ก์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ ๊ฒ์ฌ๋ฅผ ํตํด Flake8์ ํ์ฅํฉ๋๋ค.
- ์ฝ๋ ์ ์ทจ, ์ํฐํจํด, ๊ณผ๋ํ ์ค์ฒฉ์ ๊ฐ์งํฉ๋๋ค.
- ๊น๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฅ๋ คํฉ๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ ๋ฐ ๋ฒ์ ์ ์ด ์์คํ ๊ณผ์ ํตํฉ์ ์ง์ํฉ๋๋ค.
- ์ค๋ช ๊ณผ ๊ฐ์ ์ ์์ ๋ด์ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅํ ๊ท์น ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด ๋๊ตฌ๋ฅผ ๊ฐ์์ ํ์์ ๋ง๊ฒ ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ณ ๋ คํด์ผ ํ ์ ํ ์ฌํญ
Wemake Python Styleguide์ ์๊ฒฉํ ๊ท์น์ ๋ง์ ์์ ๊ฒฝ๊ณ ๋ฅผ ์ด๋ํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ฅผ ์๋ํ์ง ์๊ธฐ ์ํด ๊ตฌ์ฑ ์กฐ์ ์ด ํ์ํ ์ ์์ต๋๋ค. ๊ท์น์ ์ต์ํ์ง ์์ ํ์ ์ ์ํ๋ ๋ฐ ์๊ฐ์ด ํ์ํ ์ ์์ต๋๋ค.
๋ํ ์ฝ๋ ๊ตฌ์กฐ์ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ์ง๋ง ์ฌ์ธต์ ์ธ ๋ณด์ ๋ถ์์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ๋ณด์ ์ค์ฌ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ Bandit ๋๋ Dlint์ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ํ์ด๋
Pyre๋ Meta(์ด์ Facebook)์์ ๊ฐ๋ฐํ Python์ฉ ๋น ๋ฅด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ์ ์ ํ ๊ฒ์ฌ๊ธฐ์ ๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ ํ ๊ด๋ จ ์ค๋ฅ๋ฅผ ์ผ์ฐ ํฌ์ฐฉํ์ฌ ์ฝ๋ ์์ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. Pyre๋ ์ฑ๋ฅ์ ์ต์ ํ๋์ด ์์ด ๋๊ท๋ชจ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ์ ํ์ ๋๋ค.
์ฃผ์ ํน์ง
- ๋น ๋ฅด๊ณ ์ ํํ ์ ์ ์ ํ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ํ์ ๋ถ์ผ์น, ๋๋ฝ๋ ์ธ์, ์๋ชป๋ ๋ฐํ ์ ํ์ ๊ฐ์งํฉ๋๋ค.
- ์ ์ง์ ์ธ ๋์ ์ ์ํด ์ ์ง์ ์ธ ํ์ดํ์ ์ง์ํฉ๋๋ค.
- ๊ด๋ฒ์ํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ถ ๋๊ท๋ชจ ํ๋ก์ ํธ์ ์ต์ ํ๋์์ต๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ ๋ด์์ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค.
- ์ง์์ ์ธ ์ ํ ๊ฒ์ฆ์ ์ํด CI/CD ์ํฌํ๋ก์ ํตํฉ๋ฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Pyre๋ ๋งค์ฐ ํจ์จ์ ์ด์ง๋ง, ๊ฐ๋ฐ์๊ฐ ์ ํ ์ฃผ์์ ์ถ๊ฐํด์ผ ํ๋ฉฐ, ์ด๋ ์ ํ ํํธ๊ฐ ์๋ ๊ธฐ์กด ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์๊ฒฉํ ์ ํ ์ ์ฉ์ผ๋ก ์ธํด ์ถ๊ฐ ๋ฆฌํฉํ ๋ง ์์ ์ด ํ์ํ ์ ์์ต๋๋ค.
Pyre๋ ์ ํ ๊ฒ์ฌ์๋ง ์ง์คํ๋ฉฐ ๋ณด์ ์ทจ์ฝ์ฑ์ ๋ถ์ํ๊ฑฐ๋ ์คํ์ผ ๊ท์น์ ์ ์ฉํ์ง ์์ต๋๋ค. ๋ณด๋ค ํฌ๊ด์ ์ธ ์ ์ ๋ถ์ ์ํฌํ๋ก๋ฅผ ์ํด ๋ฆฐํฐ ๋ฐ ๋ณด์ ๋๊ตฌ์ ๊ฒฐํฉํด์ผ ํฉ๋๋ค.
์คํ ํ๋ ์ดํฌ
Autoflake๋ Python ์ฝ๋์์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ์ ๋ณ์๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ๊ฐ๋ฒผ์ด ๋๊ตฌ์ ๋๋ค. ๋ถํ์ํ ์์๋ฅผ ์ ๋ฆฌํ๊ณ ์ ์ง ๊ด๋ฆฌ์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฐ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฃผ์ ํน์ง
- ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ณ์๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํฉ๋๋ค.
- ๋ ผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- Black์ด๋ isort์ ๊ฐ์ ํฌ๋งคํฐ์ ์ ์๋ํฉ๋๋ค.
- ๊ฐ๋ณ๊ณ ํจ์จ์ ์ด์ด์ ๋น ๋ฅด๊ฒ ์ฝ๋๋ฅผ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
- ์๋ ์ ์ฉ์ ์ํ ์ฌ์ ์ปค๋ฐ ํํฌ๋ฅผ ์ง์ํฉ๋๋ค.
- ์ผ๊ด๋ ์ ๋ฆฌ๋ฅผ ์ํด CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉ๋ฉ๋๋ค.
๊ฐ์ ์ ์ํ ์์ญ
Autoflake๋ ์ฌ์ฉ๋์ง ์๋ ์์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ์ค์ ์ ๋์ง๋ง ๊ตฌ๋ฌธ ๊ฒ์ฆ, ๋ณด์ ๊ฒ์ฌ ๋๋ ๋ณต์ก์ฑ ๋ถ์์ ์ํํ์ง ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๊ธฐ์กด linter์ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ๋์ ์ผ๋ก ์ฐธ์กฐ๋๋ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์ ๊ฑฐ๋์ด ์ ํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋์ผ๋ก ๊ฒํ ํด์ผ ํ ์๋ ์์ต๋๋ค.
๋์๋ฝ
Bento๋ ๊ฐ๋ฐ์๊ฐ Python ํ๋ก์ ํธ์์ ์ทจ์ฝ์ ๊ณผ ์ฝ๋ ํ์ง ๋ฌธ์ ๋ฅผ ๊ฐ์งํ๋๋ก ๋๊ธฐ ์ํด ์ค๊ณ๋ ๊ฐ๋ณ๊ณ ๋ณด์ ์ค์ฌ์ ์ ์ ๋ถ์ ๋๊ตฌ์ ๋๋ค. ๋ณด์ ์ํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ ์ง ๊ด๋ฆฌ ๋ฌธ์ ์ ๋ํ ๋น ๋ฅธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ฉฐ, ์ต์ ๊ฐ๋ฐ ์ํฌํ๋ก์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค. Bento๋ ๋ณด์๊ณผ ํจ์จ์ฑ์ ์ฐ์ ์ํ๋ ํ์ ์ด์์ ์ด๋ฉฐ, ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ผ์ดํ์ฌ์ดํด ์ด๊ธฐ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
์ฃผ์ ํน์ง
- SQL ์ฃผ์ ๋ฐ ์์ ํ์ง ์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ํฌํจํ ๋ณด์ ์ทจ์ฝ์ ์ ๊ฐ์งํฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ฝ๋ฉ ์ค์์ ์ ์ง ๊ด๋ฆฌ ๋ฌธ์ ์ ๋ํ ์ ์ ์ฝ๋ ๋ถ์์ ์ํํฉ๋๋ค.
- ๋น ๋ฅธ ๋์ ์ ์ํด ์ต์ํ์ ๊ตฌ์ฑ์ผ๋ก ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ํํ ๋ฒ์ ์ ์ด ๋ถ์์ ์ํด GitHub, GitLab ๋ฐ Bitbucket๊ณผ ํตํฉ๋ฉ๋๋ค.
- ๊ฐ๋ฐ ์๋๋ฅผ ๋ฆ์ถ์ง ์์ผ๋ฉด์๋ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ์์ ์๋ํ๋ ๊ฒ์ฌ๋ฅผ ์ง์ํ์ฌ ๋ณด์ ๋ฐ ์ฝ๋ ํ์ง ํ์ค์ ๊ฐํํฉ๋๋ค.
๊ณ ๋ ค ์ฌํญ ๋ฐ ๊ณผ์
Bento๋ ๋ณด์ ๋ฐ ์ฝ๋ ํ์ง ๋ถ์์ ํจ๊ณผ์ ์ด์ง๋ง ์ฌ์ธต์ ์ธ ์ฑ๋ฅ ํ๋กํ์ผ๋ง์ด๋ ๋ณต์ก์ฑ ํ๊ฐ๋ฅผ ์ ๊ณตํ์ง ์์ต๋๋ค. ์ ์ฒด ์ ์ ๋ถ์ ๋ฒ์๋ฅผ ์ํ๋ ํ์ ๋ณต์ก์ฑ ๊ฒ์ฌ๋ฅผ ์ํ Radon์ด๋ ์ ํ ๊ฒ์ฆ์ ์ํ Mypy์ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
๋ํ, Bento์ ํจ๊ณผ๋ ์ ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ ๋ณด์ ๊ท์น ์ธํธ์ ๋ฌ๋ ค ์์ต๋๋ค. ์์ฃผ ์ ๋ฐ์ดํธํ์ง ์์ผ๋ฉด ์๋กญ๊ฒ ๋ํ๋๋ ๋ณด์ ์ํ์ ๊ฐ์งํ์ง ๋ชปํ ์ ์์ผ๋ฉฐ, ๊ฐ๋ฐ์๋ ์งํํ๋ ๋ณด์ ์ทจ์ฝ์ฑ์ ๋ชจ๋ํฐ๋งํ๋ ๋ฐ ์ ๊ทน์ ์ผ๋ก ๋์์ผ ํฉ๋๋ค.
ํ์ด์ฌ์์ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์ฃผ์ ์ด์
๋ฒ๊ทธ์ ์ฝ๋ ๋์๋ฅผ ์ผ์ฐ ๊ฐ์ง
์ ์ ์ฝ๋ ๋ถ์์ ๊ฐ์ฅ ์ค์ํ ์ฅ์ ์ค ํ๋๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ฒ๊ทธ์ ์ฝ๋ ๋์๋ฅผ ๊ฐ์งํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํ๋ก๊ทธ๋จ์ ์คํํด์ผ ํ๋ ๋์ ๋ถ์๊ณผ ๋ฌ๋ฆฌ ์ ์ ๋ถ์์ ์์ค ์ฝ๋๋ฅผ ์ค์บํ์ฌ ๋ ผ๋ฆฌ์ ์ค๋ฅ, ์ฌ์ฉ๋์ง ์๋ ๋ณ์ ๋ฐ ๋นํจ์จ์ ์ธ ๋ฃจํ๋ฅผ ์๋ณํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ ๊ฐ์ง๋์ง ์์ผ๋ฉด ๋ฐํ์ ์ค๋ฅ, ๋ณด์ ์ํ ๋ฐ ๋๋ฒ๊น ์๊ฐ ์ฆ๊ฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๋ชฉ๋ก์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ์ง๋ง ๋ฏธ๋ฌํ ๋ ผ๋ฆฌ ์ค๋ฅ๊ฐ ํฌํจ๋ ์ด Python ํจ์๋ฅผ ์๊ฐํด ๋ณด์ธ์.
def sum_list(numbers):
total = 0
for num in numbers:
total = num # Incorrectly reassigning instead of adding
return total
print(sum_list([1, 2, 3, 4])) # Output: 4 instead of 10
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ด ๋ฌธ์ ๋ฅผ ๋
ผ๋ฆฌ์ ์ค๋ฅ๋ก ํ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ค์์ ์ฌ์ฉํด์ผ ํจ์ ์์ฌํฉ๋๋ค. total += num ๋์ total = num. ์ด๋ฌํ ์กฐ๊ธฐ ๊ฐ์ง ๊ธฐ๋ฅ์ ํตํด ์ ์ฌ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๊ณ ๋๋ฒ๊น
์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ์ฌ์ฉ๋์ง ์๋ ๋ณ์๋ก, ์ด๋ ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ค๊ณ ํผ๋์ ์ด๋ํ ์ ์์ต๋๋ค.
def calculate_area(radius):
pi = 3.14
unused_var = 10 # This variable serves no purpose
return pi * radius * radius
์ ์ ๋ถ์์ ๋ค์์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค. unused_var, ๊นจ๋ํ๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ ์ ๋ถ์์ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ณด๋ค ์์ ์ ์ด๊ณ ์ต์ ํ๋๊ณ ๋ฒ๊ทธ ์๋ Python ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฑํ ์ ์์ต๋๋ค.
์ฝ๋ ์ฑ๋ฅ ๋ฐ ์๊ฐ ๋ณต์ก๋ ๊ฐ์
์๊ฐ ๋ณต์ก๋๋ฅผ ์ดํดํ๊ณ ์ต์ ํํ๋ ๊ฒ์ ํจ์จ์ ์ธ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ ์ ์ฝ๋ ๋ถ์์ ๋นํจ์จ์ ์ธ ๋ฃจํ, ๋ถํ์ํ ์ฌ๊ท ํธ์ถ ๋ฐ ์ค๋ณต ๊ณ์ฐ์ ์๋ณํ์ฌ ํ๋ก๊ทธ๋จ์ด ๊ฐ๋ฅํ ํ ํจ์จ์ ์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ซ์๊ฐ ์์์ธ์ง ํ์ธํ๋ ํจ์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
def is_prime(n):
for i in range(2, n):
if n % i == 0:
return False
return True
์ด ํจ์๋ O(n) ์๊ฐ ๋ณต์ก๋๋ก ์คํ๋๋ฉฐ, ์ด๋ ํฐ ์์ ๋นํจ์จ์ ์ ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ค์์ ์ฌ์ฉํ์ฌ O(โn) ์๊ฐ ๋ณต์ก๋๋ก ์ต์ ํํ ๊ฒ์ ์ ์ํฉ๋๋ค.
import math
def is_prime_optimized(n):
if n < 2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
๋ฐ๋ณต ํ์๋ฅผ ์ค์ด๋ฉด ํจ์๊ฐ ํฐ ๊ฐ์ ๋ํด ์๋นํ ๋ ๋นจ๋ผ์ง๋๋ค. n.
๋ ๋ค๋ฅธ ์๋ก๋ ๋ฃจํ์์ ์ค๋ณต๋ ๊ณ์ฐ์ด ํฌํจ๋ฉ๋๋ค.
def inefficient_function(numbers):
for num in numbers:
squared = num ** 2
print(squared)
If squared ๋ฃจํ ๋ด์์ ์ฌ๋ฌ ๋ฒ ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ ์ต์ ํ๋ ๊ฐ ๋ฐ๋ณต๋ง๋ค ๊ฐ์ ๋ค์ ๊ณ์ฐํ๋ ๋์ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ์ด๋ฌํ ๋นํจ์จ์ฑ์ ๊ฐ์งํ๊ณ ์ฑ๋ฅ ๊ฐ์ ์ ๊ถ์ฅํฉ๋๋ค.
๋ณด์ ์ทจ์ฝ์ ํ์ง
๋ณด์์ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ์ค์ํ ๋ฌธ์ ์ด๋ฉฐ, Python ์ ํ๋ฆฌ์ผ์ด์ ๋ ์์ธ๋ ์๋๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋๊ธฐ ์ ์ ๋ณด์ ์ทจ์ฝ์ฑ์ ํ์งํ์ฌ ๋ฐ์ดํฐ ์ ์ถ, ์ฃผ์ ๊ณต๊ฒฉ ๋ฐ ๋ฌด๋จ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ณด์ ๊ฒฐํจ ์ค ํ๋๋ ํ๋์ฝ๋ฉ๋ ์๊ฒฉ ์ฆ๋ช ์ ๋๋ค.
DB_PASSWORD = "supersecret123" # Hardcoded password (security risk)
์ ์ ๋ถ์์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
import os
DB_PASSWORD = os.getenv("DB_PASSWORD") # Secure way to retrieve passwords
๋ ๋ค๋ฅธ ๋น๋ฒํ ๋ณด์ ์ํ์๋ SQL ์ฃผ์ ๊ณต๊ฒฉ์ผ๋ก ์ด์ด์ง ์ ์๋, ๊ฒ์ด๋์ง ์์ ์ฌ์ฉ์ ์ ๋ ฅ์ด ํฌํจ๋ฉ๋๋ค.
def get_user_data(user_id):
query = f"SELECT * FROM users WHERE id = {user_id}" # SQL Injection risk
return execute_query(query)
์ ์ ๋ถ์ ๋๊ตฌ๋ ์ ์ฌ์ ์ธ SQL ์ฃผ์ ์ํ์ ๊ฐ์งํ๊ณ ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ ์ ์ํฉ๋๋ค.
def get_user_data_secure(user_id):
query = "SELECT * FROM users WHERE id = %s"
return execute_query(query, (user_id,))
์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ๊ณผ ๊ฐ๋ ์ฑ ํฅ์
๊นจ๋ํ๊ณ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ฑ๊ณต์ ํ์์ ์ ๋๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ง์ ๋ถํ ์ฝ๋๋ฒ ์ด์ค๋ ๋๋ฒ๊น , ์ต์ ํ ๋ฐ ํ์ฅํ๊ธฐ ์ด๋ ค์์ง๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ฝ๋ฉ ํ์ค, ์ ์ ํ ๋ฌธ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ํํ์ฌ ๊ฐ๋ฐ์๊ฐ PEP 8๊ณผ ๊ฐ์ ์ง์นจ์ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค.
ํ์์ด ์๋ชป๋ Python ํจ์๋ฅผ ์๊ฐํด ๋ณด์ธ์.
def add_numbers(a,b):return a+b
์ด ํจ์๋ ์ ์ ํ ๊ฐ๊ฒฉ๊ณผ ๊ฐ๋ ์ฑ์ด ๋ถ์กฑํฉ๋๋ค. ์ ์ ๋ถ์์ ๋ค์์ ๊ถ์ฅํฉ๋๋ค.
def add_numbers(a, b):
return a + b # Improved readability
๊ธฐ์ ๋ถ์ฑ ๊ฐ์
๊ฐ๋ฐ์๊ฐ ์ ์ ํ ์ฝ๋ ๊ตฌ์กฐ๋ณด๋ค ๋น ๋ฅธ ์์ ์ ์ฐ์ ์ํ๋ฉด ๊ธฐ์ ๋ถ์ฑ๊ฐ ๋์ ๋์ด ๋นํจ์จ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๊น๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง๊ณ ๋ฒ๊ทธ ๋ฐ์์ด ๋์ด๋๋ฉฐ ํฅํ ๊ฐ์ ๋น์ฉ์ด ๋ ๋ง์ด ๋ญ๋๋ค.
์ ์ ๋ถ์ ๋๊ตฌ๋ ์ค๋ณต๋๊ณ ์ค๋๋๊ณ ๋นํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์๋ณํ์ฌ ๊ธฐ์ ๋ถ์ฑ๊ฐ ๊ด๋ฆฌ ๋ถ๊ฐ๋ฅํด์ง๊ธฐ ์ ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ค์ ์๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
def calculate_discount(price, discount):
if discount > 0:
new_price = price - (price * discount / 100)
return new_price
else:
return price
์ฌ๊ธฐ, else ๋ฌธ์ฅ์ ๋ถํ์ํด์ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ ์ ๋ถ์์ ๊ทธ๊ฒ์ ๋จ์ํํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค:
def calculate_discount(price, discount):
if discount > 0:
return price - (price * discount / 100)
return price
์ ์ ์ฝ๋ ๋ถ์์ด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ด๋ป๊ฒ ๋์์ด ๋๋๊ฐ
ํ์ด์ฌ์์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ์ง
Python์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ผ๋ฉฐ, ํนํ ์ฅ๊ธฐ ์คํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ทธ๋ ์ต๋๋ค. Python์ ์๋ ๊ฐ๋น์ง ์์ง์ ์ฌ์ฉํ์ง๋ง, ๋ถ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ก ์ธํด ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์๋น๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๋ค์์ ๊ฐ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ์ํ ์ฐธ์กฐ ๋ฐ ๋นํจ์จ์ ์ธ ๊ฐ์ฒด ์ฒ๋ฆฌ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์.
๋ค์ ์์ ์์๋ ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ๋ ์ํ๋ก ๋จ์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค.
class MemoryLeakExample:
def __init__(self):
self.data = [x for x in range(1000000)] # Large list allocation
leak = MemoryLeakExample()
# The object is not explicitly deleted, leading to high memory usage
์ ์ ๋ถ์ ๋๊ตฌ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ฝ ํด์ ๋์ง ์์ ๊ฒ์ผ๋ก ํ์ํ์ฌ ๋ช ์์ ์ญ์ ๋ฅผ ์ ์ํฉ๋๋ค.
del leak # Explicitly deleting the object to free memory
๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์์ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ํ ์ฐธ์กฐ. ๋ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ ๋ Python์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ด๋ฅผ ํด์ ํ์ง ๋ชปํ ์ ์์ต๋๋ค.
class A:
def __init__(self):
self.ref = B(self) # Circular reference
class B:
def __init__(self, obj):
self.ref = obj
a = A()
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ด๋ฌํ ํจํด์ ์๋ณํ๊ณ ์ฌ์ฉ์ ์ ์ํฉ๋๋ค. weakref ์ํ์ ๋์ผ๋ ค๋ฉด:
import weakref
class A:
def __init__(self):
self.ref = weakref.ref(B(self)) # Using weak references
class B:
def __init__(self, obj):
self.ref = obj
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํจ์ผ๋ก์จ ์ ์ ๋ถ์์ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ฅํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค ๋ถํ์ํ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํ์ธ์.
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๋ฐ ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ ์ต์ ํ
์ ์ ์ฝ๋ ๋ถ์์ ๋ ๋ค๋ฅธ ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ค๋ณต๋ ๊ฐ์ฒด ํ ๋น ์๋ณ ๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ต์ ํํฉ๋๋ค. ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ํนํ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๊ทธ๋ ์ต๋๋ค.
๋นํจ์จ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํด ๋ณด์ธ์.
def process_data():
data = [x for x in range(1000000)] # Large list stored in memory
return sum(data)
result = process_data()
์ ์ฒด ๋ชฉ๋ก์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก ํฉ๊ณ๋ง ๊ณ์ฐํ๋ฉด ๋๋ฏ๋ก ๋ถํ์ํฉ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ค์์ ์ ์ํฉ๋๋ค. ๋ฐ์ ๊ธฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๋ ค๋ฉด:
def process_data():
return sum(x for x in range(1000000)) # Generator expression (memory-efficient)
result = process_data()
๋ํ ์ ์ ๋ถ์ ๋๊ตฌ๋ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๊ณ ๋ช ์์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ๋ฅผ ์ ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ์ด ์ด๋ฆฌ์ง๋ง ๋ซํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์ธ์.
def read_file():
file = open("data.txt", "r")
content = file.read() # File remains open (memory leak)
return content
์ ์ ๋ถ์์์๋ ์ปจํ ์คํธ ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ํด์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
def read_file():
with open("data.txt", "r") as file:
return file.read() # File closes automatically after reading
์ด๋ฌํ ์ต์ ํ๋ Python ํ๋ก๊ทธ๋จ์ ๋ณด์ฅํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๋ถํ์ํ ๊ฐ์ฒด ์ ์ง ๋ฐฉ์ง
๊ฐ์ฅ ๊ฐ๊ณผ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์ค ํ๋๋ ๋ถํ์ํ ๊ฐ์ฒด ์ ์ง, ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ํ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ด๋๋ ๊ฒฝ์ฐ. ์ ์ ์ฝ๋ ๋ถ์์ ์ด๋ฌํ ์ธ์คํด์ค๋ฅผ ์๋ณํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ ์ ๋ต์ ๊ถ์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ธ๋ก๋ฒ ๋ชฉ๋ก์ด ๊ณ์ ์ปค์ง๋ ๋ค์ ํจ์๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
cached_data = []
def add_to_cache(data):
cached_data.append(data) # Data is continuously added but never removed
์ ์ ๋ถ์์์๋ ์ด๋ฅผ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ก ํ์ํ๊ณ ์ฌ์ฉ์ ์ ์ํฉ๋๋ค. WeakSet ๋๋ ์บ์ ํฌ๊ธฐ๋ฅผ ๋ช
์์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
from collections import deque
cached_data = deque(maxlen=100) # Limits cache size to prevent excessive memory use
def add_to_cache(data):
cached_data.append(data)
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๊ฐ์ฒด๊ฐ ๋ชฉ๋ก์ ์ ์ฅ๋์์ง๋ง ์ ๊ฑฐ๋์ง ์๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
def store_objects():
obj_list = []
for _ in range(10000):
obj_list.append(SomeObject()) # Objects accumulate without being cleared
์ ์ ๋ถ์์์๋ ๊ฐ์ฒด ๋ณด์กด์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ง์ฐ๊ฑฐ๋ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
def store_objects():
obj_list = [SomeObject() for _ in range(1000)] # Limited object retention
๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด๊ฐ ์ ๊ฑฐ๋๋๋ก ๋ณด์ฅํจ์ผ๋ก์จ ์ ์ ๋ถ์ ๋๊ตฌ๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ์ต์ํํ๋ค ์๊ฐ์ด ์ง๋๋ ํจ์จ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
์๋ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ๋ฐ ๊ฐ๋น์ง ์์ง
Python์ ๋ด์ฅ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ์ง๋ง ๋นํจ์จ์ ์ธ ์ฝ๋๋ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ์๋ํ๋ค, ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ด์ด์ง๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ๊ฐ๋น์ง ์์ง์ ๋นํ์ฑํํ๊ฑฐ๋ ์ค์ฉํฉ๋๋ค..
๋ค์๊ณผ ๊ฐ์ ๊ฐ๋น์ง ์์ง์ ๋นํจ์จ์ ์ธ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์.
import gc
gc.disable() # Disabling garbage collection (bad practice)
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋น์ง ์์ง ๋นํ์ฑํ๊ฐ ๋ค์์์๋ง ์ํ๋์ด์ผ ํ๋ค๊ณ ๊ฒฝ๊ณ ํฉ๋๋ค. ํน์ ์ฑ๋ฅ ์๋๋ฆฌ์ค. ๋์ , ๊ฐ์ฒด๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋๋ก ๋ณด์ฅํ์ฌ ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ๊ณผ๋ํ ์๋ ๊ฐ๋น์ง ์์ง์ ๋๋ค.
import gc
def process_large_data():
data = [x for x in range(1000000)]
del data
gc.collect() # Unnecessary manual garbage collection call
์ ์ ๋ถ์์์๋ Python์ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์๋์ผ๋ก ์ ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
def process_large_data():
data = [x for x in range(1000000)]
# No need for manual gc.collect(); Python will handle it
์ ์ ์ฝ๋ ๋ถ์์ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ๋ถํ์ํ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํผํ์ญ์์ค ์ต์ ํ๋ ์ฑ๋ฅ์ ์ํด Python์ ํจ์จ์ ์ธ ๊ฐ๋น์ง ์์ง ์์คํ ์ ํ์ฉํฉ๋๋ค.
๋งบ์๋ง
์ ์ ์ฝ๋ ๋ถ์์ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ง, ๋ณด์ ๋ฐ ํจ์จ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ดํ์ ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํจ์ผ๋ก์จ ํ์ ์ฝ๋๊ฐ ํ๋ก๋์ ์ ๋๋ฌํ๊ธฐ ์ ์ ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๊ฐ์งํ๊ณ , ์ฝ๋ฉ ํ์ค์ ์ ์ฉํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ต์ ์ํํธ์จ์ด์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ด๋ฌํ ๋๊ตฌ๋ ๊ฐ๋ฐ์๊ฐ ๊นจ๋ํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ ์ค์ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ณด์ ์ทจ์ฝ์ฑ์ ์๋ณํ๋ , ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํํ๋ , ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํ๋ , ์ ์ ๋ถ์์ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์ ๋ฐ์ ์ธ ์ํํธ์จ์ด ์์ ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ ์ ๋ถ์์ ์ฐ์ ์ํ๋ ์กฐ์ง์ ์์ฐ์ฑ ์ฆ๊ฐ, ๋ฐํ์ ์ค๋ฅ ๊ฐ์, ๋ณด์ ๊ฐํ์ ์ด์ ์ ์ป์ต๋๋ค.
์ฌ๋ฐ๋ฅธ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ์ Black์ ์ฌ์ฉํ์ฌ ์๊ฒฉํ ์์ ํ์ค์ ์ ์ฉํ๋ ๊ฒ๋ถํฐ Bandit์ ์ฌ์ฉํ์ฌ ๋ณด์ ์ํ์ ์๋ณํ๊ฑฐ๋ Mypy๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ ์์ ์ ์ต์ ํํ๋ ๊ฒ๊น์ง ํน์ ํ๋ก์ ํธ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ฌ๋ฌ ๋๊ตฌ๋ฅผ ๊ฒฐํฉํ๋ฉด ์ฝ๋ ํ์ง, ๋ณด์ ๋ฐ ์ฑ๋ฅ์ ํฌ๊ดํ๋ ํฌ๊ด์ ์ธ ๋ถ์์ด ๋ณด์ฅ๋ฉ๋๋ค. Python์ด ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ฃผ์ ์ธ์ด๋ก ๊ณ์ ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ์ ์ฝ๋ ๋ถ์์ ์ฑํํ๋ฉด ๊ฐ๋ฐ์ด ๊ฐ์ํ๋ ๋ฟ๋ง ์๋๋ผ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ฑ์ผ๋ก๋ถํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐํํ ์ ์์ต๋๋ค. ์ ์ ๋ถ์์ ์ํํธ์จ์ด ๋ผ์ดํ์ฌ์ดํด์ ํต์ฌ ๋ถ๋ถ์ผ๋ก ๋ง๋ค๋ฉด ๊ฐ๋ฐ์๋ ์ ๊ณ ํ์ค๊ณผ ๋น์ฆ๋์ค ๋ชฉํ๋ฅผ ์ถฉ์กฑํ๋ ๊ฐ๋ ฅํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์ ์์ต๋๋ค.