๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๐ŸŒฎ ๐Ÿ’ฌ
๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป

์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ

by ๋ฐ”์ฟ„๋ฆฌ 2025. 2. 20.

 

์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋„๊ตฌ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ–ˆ๋‹ค.

์‚ฌ์šฉํ•  ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ

  1. Sonar : ์ฝ”๋“œ ํ’ˆ์งˆ ๋ถ„์„, ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€
  2. Black : ์ฝ”๋“œ ์Šคํƒ€์ผ ์ž๋™ ํฌ๋งทํŒ…
  3. Flake8 : ์ •์  ์ฝ”๋“œ ๋ถ„์„ (PEP 8, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ)
  4. isort : import ๋ฌธ ์ž๋™ ์ •๋ ฌ
  5. pytest : Python ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ

 

1๏ธโƒฃ Sonar (SonarQube / SonarCloud)

  • Sonar๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ถ„์„ํ•˜๋Š” ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ
  • SonarQube, SonarCloud ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ๋กœ ์ œ๊ณต

โœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๋กœ์ปฌ์—์„œ SonarQube๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ (sonarqube + sonar-scanner ์‚ฌ์šฉ)
  • CI/CD ํ™˜๊ฒฝ์—์„œ๋Š” SonarCloud๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ถ„์„
sonar-scanner \
  -Dsonar.projectKey=my_project \
  -Dsonar.organization=my_org \
  -Dsonar.host.url=https://sonarcloud.io \
  -Dsonar.login=my_sonar_token

 

2๏ธโƒฃ Black

  • Python ์ฝ”๋“œ formatter
  • ์ฝ”๋“œ ์Šคํƒ€์ผ ์ž๋™ ์ •๋ฆฌ

โœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install black

 

2. ์ฝ”๋“œ ํฌ๋งทํŒ… ์‹คํ–‰

black my_script.py

 

3. ํŠน์ • ํด๋”์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ ํฌ๋งทํŒ…

black .

 

3๏ธโƒฃ Flack8

Python์˜ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ โ†’ ์ฝ”๋“œ ์Šคํƒ€์ผ, ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ์ฒดํฌํ•˜๋Š” ์—ญํ• 

 

โœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install flake8

 

2. ์ฝ”๋“œ ๊ฒ€์‚ฌ ์‹คํ–‰

flake8 my_script.py

 

3. ํŠน์ • ํด๋” ๊ฒ€์‚ฌ

flake8 my_project/

 

โœ” .flake8 ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ํŠน์ • ๊ทœ์น™ ๋ฌด์‹œ ๊ฐ€๋Šฅ

[flake8]
max-line-length = 100
ignore = E203, E266, E501

 

4๏ธโƒฃ isort

Python import ์ˆœ์„œ ์ž๋™ ์ •๋ฆฌ

 

โœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install isort

 

2. ํŠน์ • ํŒŒ์ผ ์ •๋ฆฌ

isort my_script.py

 

3. ํŠน์ • ํด๋” ๊ฒ€์‚ฌ

isort .

 

5๏ธโƒฃ pytest

Python ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„ ์›Œํฌ โ†’ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ

  • assert ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
  • @pytest.mark.parametrize๋กœ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐํ™” ๊ฐ€๋Šฅ
  • pytest.fixture๋กœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฆฌํฌํŠธ ์ง€์›
  • ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๊ฐ€๋Šฅ (pytest-xdist ํ™œ์šฉ)

โœ” ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

1. ํŒจํ‚ค์ง€ ์„ค์น˜

pip install pytest

 

2. ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

def add(a, b):
    return a + b

def test_add():
    assert add(2, 3) == 5

 

3. ํ…Œ์ŠคํŠธ ์‹คํ–‰

pytest

 

โ†’ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์™€ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  test_*.py ๋ฐ *_test.py ํŒŒ์ผ์„ ์ฐพ์•„ ์‹คํ–‰

โ†’ ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ !!

 

4. ํŠน์ • ํŒŒ์ผ์˜ ํ…Œ์ŠคํŠธ ์‹คํ–‰

pytest test_example.py

 

5. ํŠน์ • ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋งŒ ์‹คํ–‰

pytest test_example.py::test_add

 

โ†’ test_example.py ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” test_add ํ•จ์ˆ˜๋งŒ ์‹คํ–‰

 

6. ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋งŒ ๋‹ค์‹œ ์‹คํ–‰

pytest --lf

 

7. ํ…Œ์ŠคํŠธ ์ƒ์„ธ ๋ฆฌํฌํŠธ ์ถœ๋ ฅ

pytest -v

 

 

โœ… Git pre-commit hook ์„ค์ •

Git์˜ pre-commit hook์„ ์„ค์ •ํ•˜๋ฉด, black, flake8, isort, pytest ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ฝ”๋“œ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ณ , ๋ฒ„๊ทธ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ

โœ” ๋™์ž‘ ๋ฐฉ์‹

  1. git commit -m "๋ฉ”์‹œ์ง€" ์ž…๋ ฅ
  2. pre-commit์ด ์‹คํ–‰๋˜๋ฉด์„œ black, flake8, isort, pytest ์ฒดํฌ
  3. ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์ปค๋ฐ‹์ด ์ทจ์†Œ๋จ
  4. ๋ชจ๋“  ๊ฒ€์‚ฌ ํ†ต๊ณผ ์‹œ ์ปค๋ฐ‹ ์„ฑ๊ณต !

โœ” ์„ค์ • ๋ฐฉ๋ฒ•

 

1. pre-commit ํŒจํ‚ค์ง€ ์„ค์น˜

pip install pre-commit

 

 

2. pre-commit-config.yaml ํŒŒ์ผ ์ƒ์„ฑ

- ํ”„๋กœ์ ํŠธ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .pre-commit-config.yaml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‚ด์šฉ ์ถ”๊ฐ€

- ํŒŒ์ผ ์˜ˆ์‹œ:

repos:
  - repo: https://github.com/psf/black
    rev: 23.7.0  # ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
    hooks:
      - id: black

  - repo: https://github.com/PyCQA/flake8
    rev: 6.1.0  # ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
    hooks:
      - id: flake8

  - repo: https://github.com/PyCQA/isort
    rev: 5.12.0  # ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
    hooks:
      - id: isort
        args: ["--profile", "black"]  # black ์Šคํƒ€์ผ๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ์„ค์ •

  - repo: https://github.com/pytest-dev/pytest
    rev: 7.4.2  # ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
    hooks:
      - id: pytest

 

3. Git Hook ํ™œ์„ฑํ™” (pre-commit install)

- ์ด์ œ pre-commit์„ Git์˜ pre-commit hook์œผ๋กœ ๋“ฑ๋ก

pre-commit install
 

 

โœ” ํ…Œ์ŠคํŠธ ์‹คํ–‰

์„ค์ • ํ™•์ธ์„ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ

pre-commit run --all-files