print로 디버깅?
서버 런타임 중에 버그가 발생했다고 가정해보자.
내가 원하는 값을 반환해주어야 하는데 엉뚱한 값이 나온다.
버그를 찾아 고치기 위해 작성된 코드를 보지만 어디서부터 잘못된 건지 모르겠다.
그럴 때 흔히 하는 방법이 print()로 코드 중간중간을 출력하는 것이다.
의심스러운 지점에 print를 배치하고 내가 생각한 대로 작동하는지 출력해본다.
하지만 이 방법은 리소스가 많이 든다.
개발자가 직접 코드를 작성해야하고 상태나 변수명을 직접 호출해야 한다.
설령 버그를 발견하고 고치더라도 print 지우는 것을 까먹어 불필요한 코드까지 커밋해버리기도 한다...ㅜㅜ
다행히도 VSCode는 우리가 손쉽게 디버깅 할 수 있도록 도와준다.
이번 글에서는 Python - FastAPI 서버를 기준으로 VSCode 디버깅 환경을 세팅하고 사용법을 알아보자.
launch.json 세팅
먼저 디버깅 환경 세팅이다.
VSCode 왼쪽 디버그 탭을 누르고 'launch.json 파일 만들기'를 선택한다.
(launch.json 파일을 만드는 이유는 이후에 버튼 하나만으로도 디버깅 모드를 실행하기 위함이다)
나의 경우 'Python' 선택 - 'FastAPI' 선택 그리고 입력창에 'app' 이 있는 경로를 입력해준다.
(ex. project.main -> project 폴더 안에 main.py 안에 app이 있다.)
아래 영상을 참고하자.
FastAPI의 경우 'app'의 경로를 요구하지만 다른 언어나 프레임워크는 다를 수 있다.
하지만 애플리케이션 '실행파일'이 있는 곳을 지정하는 것은 동일할 것이다.
디버그 모드 실행
디버그 탭에서 좌 상단의 녹색 재생 버튼을 누른다.
실행과 동시에 FastAPI서버가 실행되고 VSC 위에 다음과 같은 컨트롤 패널이 뜰 것이다.
맨 우측 빨간 네모는 디버깅 모드 종료를 뜻한다.
초록색 원형 화살표는 재시작을 뜻한다. (코드에 변경사항이 있을 경우 새로고침을 위해 사용한다.)
맨 왼쪽은 다음 중단점으로 계속 실행하는 것을 뜻한다.
가운데 세 가지 화살표는 차례대로 '단위 실행', '단계 정보', '단계 출력'이라고 부르는데,
이에 대해서는 직접 영상으로 보는 것이 이해가 빠를 것이다.
*참고. 서버에서 디버깅을 할 때는 그 특성상 먼저 요청을 받아야한다. 아래 영상들은 리퀘스트 요청을 받은 후의 상황들이다.
단위 실행
중단점과 상관없이 차례대로 확인한다.
단, 내부 함수처럼 스코프가 다른 경우 무시한다.
단계 정보
중단점과 상관없이 차례대로 확인한다.
내부 함수처럼 스코프가 달라도 모두 확인한다.
단계 출력
개발자가 지정한 중단점만 확인한다.
print처럼 빠르게 해당 부분만 확인할 때 유용하다.
화면 구성
위의 영상을 보고 이미 눈치챘겠지만
코드의 현재 실행 위치에 따라 호출 스택이나 변수가 어떤 상태인지 보여준다.
화면 구성을 함께 살펴보자.
가운데 빨간 점은 '중단점'으로 디버깅 모드에서 반드시 멈추는 지점을 뜻한다.
중단점은 개발자가 직접 지정 및 해제할 수 있다.
중단점 사이에 있는 노란 화살 표식은 현재 진행 중인 실행 위치를 뜻한다.
좌 상단에는 전역, 지역 변수에 대한 정보를 보여준다.
좌 하단에는 조사식이라고 해서 개발자가 직접 원하는 변수나 식을 입력해 값을 확인할 수 있다.
(위 이미지에서는 아직 'z' 변수가 할당되지 않아 에러가 뜬 것을 볼 수 있다)
조사식의 경우, 한번 입력해 두면 디버깅 중 변하는 과정을 직접 확인할 수 있고,
코드에 없는 식도 개발자가 직접 입력하여 확인할 수 있다.
조사식이 '지정된 식'의 '지속적인 변화'를 관찰할 수 있다면,
디버그 콘솔에서는 식을 Python IDLE처럼 사용할 수 있다.
예를 들어, 새로운 변수를 할당할 수도 있고 이를 기존 변수와 상호작용할 수도 있다.
마무리
문제지점이 명확한 버그를 빠르게 확인할 때는 print가 더 효율적일수도 있겠다.
하지만 어디서부터 버그가 생겼는지 모르는 경우가 대부분일 것이다.
그럴 때에는 VSCode의 디버그 모드를 활용하기 바란다.
추가.
테스트 코드의 경우 아직 디버깅해보지 못했는데
pytest를 디버깅하는 방법도 추후 올려보겠다.
'나는 이렇게 학습한다 > Debug' 카테고리의 다른 글
pytest _ mock 사용하여 테스트 코드 작성하기 (0) | 2022.08.14 |
---|---|
docker-compose 작성하면서 생긴 이슈 세 가지 (feat. m1) (3) | 2022.05.10 |
SQLAlchemy _ NotSupportedError(InvalidCachedStatementError) 에러 해결 (0) | 2022.04.29 |
컬럼 속성 변경 후 alembic migration할 때 ‘None’ 생기는 현상 (0) | 2022.04.26 |
pytest _ 하나의 함수에서 복수 케이스 테스트 하는 방법 (0) | 2022.04.20 |