Python 개발을 위한 다양한 IDE 가 존재하지만, 통상적으로 JetBrain의 PyCharm 을 많이 사용한다. 나 또한 몇 년간 애용했지만, License 갱신 이슈와 한정된 Plugin 으로 VSCode 를 사용하기 시작했다.
간단히, VSCode의 장점 3가지
1. 실무 프로젝트 작업시 좀 더 부드럽게 작업가능 (속도가 훨씬 빠름)
2. 다양한 Plugin (다른 언어도 개발 가능)
3. 무료 & Github 연동 가능
이번 글에는 Python Django 프로젝트와 디버깅 세팅에 대해 다룬다.
VScode 공식문서에도 설명이 잘 되어 있지만, 직접 구성해본 경험을 바탕으로 가능한 간편하게 설명해보겠다.
링크: https://code.visualstudio.com/docs/python/tutorial-django
개발환경
Python 3.9.4
django 4.0
djangorestframework 3.13.1
# 패키지 설치
pip install django
pip install djangorestframework
테스트용 view로 health_check 를 만들고,
# test_project/views.py
from django.http import HttpResponse
def health_check(request):
number = 10
number += 10
return HttpResponse(status=200)
# test_project.urls.py
from django.contrib import admin
from django.urls import include, path
from django_debug.views import health_check
urlpatterns = [
path('admin/', admin.site.urls),
path('health_check/', health_check)
]
위 코드에서 number 에 20이 할당되는지와 health_check 에서 HTTP 200 코드를 반환하는지 확인하면 성공.
health_check 에 breakpoint를 찍어주고 실행한 후, 브라우저로 localhost:8000/health_check/ 로 요청을 보내주면 Python debugger에서 값을 확인할 수 있다.
성공 🙌
Add-on (1) 디버깅 개발환경 분리
추가로, Django 배포 시, production/develop 서버로 나누어 운영할 때 디버깅 환경을 나누어보자. 매우 쉽다.
Django의 기본설정값은 project/settings.py 를 사용하지만, 운영환경을 나누어 디버깅을 해보자.
# base.py (production)
# 기존 settings.py 대신 사용
...
BASE_VARIABLE = 'this is base'
# dev.py (develop)
from project.settings.base import *
# base 의 설정값 상속
DEV_VARIABLE = 'this is dev'
설정 파일을 2개로 구성하여, 테스트해보자.
디버깅 환경 구성은 마찬가지로 디버깅 탭에서 create a launch.json file 을 눌러 Python -> Django 환경을 만들자.
그러면, .vscode/launch.json 파일이 생기고, 아래와 같이 설정값이 생긴다.
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"args": [
"runserver",
"--settings=project.settings.base" <- 이부분을 추가
],
"django": true
}
]
}
Django에서 runserver 기준으로 setting 값을 지정하는 경우, 아래와 같이 setting_file 을 지정해주는데, settings에 대한 명시를 위의 args 에 추가하면 된다.
python manage.py runserver --settings=settings.setting_file
그럼 위에서 설정한 base 와 dev 의 차이를 비교해보자. 참고로, 환경을 2개 구성하였기 때문에 launch.json 은 아래처럼 되어있다.
보통 AWS Secret Manager를 사용하여 환경변수를 넣는 작업에서 값을 헷갈리는 경우가 발생하는데, 위와 같이 로컬에서 미리 나누어 작업하면 보다 수월하게 작업이 가능하다. 너무 쉽다.
Add-on (2) Django Test 환경 설정
로컬에서 Django test를 쓰는 경우도 마찬가지이다. Python의 unittest 혹은 pytest 를 많이 사용하는데, VScode에서 설정해보자.
Django에서 기본적으로 unittest 를 지원하기 때문에, Add-on(1) VScode 의 launch.json 설정값 내용을 토대로 python manage.py test 를 추가해주면 쉽다.
아래는 pytest 기준으로 간단히 적어본다. 테스트코드는 Django의 TestCase 사용 (결국 unittest& pytest 짬뽕이다.. pytest가 보기 편하다)
# pytest 의존성 패키지 설치
pip install pytest
pip install pytest-django
아래 코드는 위에 작성한 health_check 에 대한 테스트케이스이다.
from django.test import Client, TestCase
from django.urls import reverse
class HealthCheckTestCase(TestCase):
def test_health_check(self):
client = Client()
# health_check url은 django.urls.reverse로 가져옴
response = client.get(reverse('health_check'))
self.assertEqual(response.status_code, 200)
빠른 실행은 쉘에서 아래 명령어를 통해 base 와 dev 환경 모두 테스트 가능하다. (pytest.ini 파일을 사용한 방법도 있다. 문서 참고)
# base 환경으로 테스트 실행
pytest --ds=django_debug.settings.base
# dev환경으로 테스트 실행
pytest --ds=django_debug.settings.dev
pytest 문서: Configuring Django settings — pytest-django documentation
이를 VScode 디버깅 환경으로 만들면 끝이다. pytest의 경우, VScode에서 자동인식이 안되서 그런지, 직접 입력해줬다.
# launch.json
이전설정들.
...
{
"name": "Run Test[Pytest]",
"type": "python",
"request": "launch",
"module": "pytest",
"args": ["--ds=django_debug.settings.base"], # <- base/dev 환경설정
"django": true
}
]
이제 개발 & 테스트 과정 모두 디버깅이 가능하다.
디버깅은 프로그래밍에서 가장 기본이며, 필수요건이다. Pycharm과 같이 잘 만들어진 IDE를 사용하는것도 좋지만, 개발자 스스로 직접 환경을 구성해보며 배우는게 훨씬 유연하게 작업이 가능하기에 큰 도움이 된다고 생각한다
끝.