디버깅(feat.Intellij)
프로그램이 정상 동작하지 않을때 커뮤니티에 도움을 요청하면 항상 오는 답중에 "디버깅 해보세요" 가 있었다.
또한, 요즘 프로젝트 규모가 커지면서 많은 이슈들이 발생하는데 디버거의 사용법을 정확히 알아둬야 할때가 온 것 같다.
디버깅?
대략적으로 코드를 한줄한줄 플로우를 확인하면서 문제가 있는 부분을 확인하는 방법이라는 것만 알고 사용하진 않았던것 같다.
그동안 log
나 System.out.println
으로 결과를 찍어보면서 문제를 해결했던것같다.
디버깅이라는게 테스트 코드 처럼 유지보수에 꼭 등장하는 중요개념인것같아서 내 주 개발환경인 Intellij에서 디버깅을 사용하는 방법을 상세히 정리해보려고 한다.
intellij의 debugging
//알아두면 좋은 단축키
shift + shift : 전체 검색 (file, action 모두 검색)
ctrl + e : 최근 열었던 파일 리스트 보기
ctrl + ] or [ : {} 시작 끝으로 이동
Break Point
습관적으로 run
을 실행하지만, 로컬 개발에서는 웬만하면 debug
로 실행하자.
어플리케이션 구동 중에 Break Point를 사용하려면 debug
여야만 한다.
프로그램에 브레이크 포인트를 부여해서 디버그로 실행시 해당 지점에서 잠시 중단된다.
코드 번호 옆에 빈공간을 클릭하면 지정이 가능하다.
Break Point 조건 추가
Break Point를 우클릭 하면 조건으로 break를 걸 수가 있다.
productId가 2L일때만 위 point에서 break가 되도록 지정
ex) 1000번 반복하는 반복문같은 경우 조건을 통해 98번째에서 break 걸리도록 할수있다.
디버깅 버튼
브레이크 포인트에서 중단되면 저 디버깅 버튼들이 활성화 된다. 하나하나 기능을 알아보자.
resume
- 단축키 :
F9
- 기능 : 다음 break point로 이동
step over
- 단축키 :
F8
- 기능 : 현재 break 된 파일에서 다음 라인 이동
break 걸린 라인을 전부 실행 후, 다음라인으로 이동한다.
step into
- 단축키 :
F7
- 기능 : 현재 break 된 라인에서 실행하고 있는 라인으로 이동한다.
Member member = new Member("김씨 아재")
여기서 break된 상태라면 F8과 달리 다음 라인으로 이동하지 않고 Member 생성자로 들어간다.
Force step into
- 단축키 :
alt+shift+F7
- 기능 : 다음 실행되는 라인으로 이동하나,
step into
와 달리Stepping
을 무시하고 진행한다.
shift + shift -> stepping
에서 stepping을 설정할수있는데 ex) getter는 skip
이런 설정들을 무시하고 getter도 into 하는것이다.
Step out
- 단축키 :
shift+F8
- 기능 : 현재 break 된 라인에서 호출한 곳으로 이동한다.
보통은 step into
로 파고들어간 라인을 빠져나오려할때 많이 사용한다.
step out은 해당 라인이 실행된 후 빠져나가게 된다.
Drop Frame
- 단축키 : 없음
- 기능 : call stack을 거슬러 올라간다.
Step into나 over , out 등 버튼들을 사용할때마다 call Stack이 쌓인다. 이 call Stack을 되돌아 가는 것
이것만 보면 step out과 별차이 없어 보이는데, 큰 차이점은 drop frame은 해당 라인이 실행되기 전으로 돌아간다.
Run to Cursor
- 단축키 :
option+F9
- 기능 : 포커스 되어있는 라인으로 이동
브래이크 포인트를 안걸어도 현제 커서가 가르키는 곳으로 브래이크 포인트를 이동시킨다.
break 된 상태에서 테스트 코드를 실행할 수 있는 방법은 2가지가 있다.
Evaluate
- 단축키 :
alt+F8
- 기능 : break 된 라인에서 사용가능한 모든 코드를 실행할 수 있음
Evaluate를 클릭하면 팝업이 하나 등장하는데, 여기서 확인하고 싶은 코드를 입력하고 실행시키면 결과를 바로 확인할 수 있다.
현재 라인에서 사용 가능한 코드 (메소드 변수, 클래스 필드 등)만 사용할 수 있다.
Watch
이런식으로 브래이크 포인트에서 확인하고싶은 데이터를 고정적으로 추가할수있다.
이제 getClass가 Variables 항목에 추가될것이다.
Evaluate의 경우 코드를 계속 수동 실행해야하지만, Watch의 경우 삭제하지 않는한, break line이 실행될때마다 자동 실행된다.
문제는 둘다 실제로 코드에 반영이 되기 때문에 setter는 조심해야한다.
Reference
https://www.youtube.com/watch?v=gkutTlwi70s
https://jojoldu.tistory.com/149
'개발자 준비 > 개발 공부' 카테고리의 다른 글
매개변수 3개는 무조건 피해야할까? (0) | 2022.11.08 |
---|---|
CI/CD(feat. DevOps) (0) | 2022.05.22 |
VUE.js + SpringBoot 환경 CORS 이슈 해결(feat.SPA 원리) (0) | 2022.02.15 |
Polling보다 WebSocket이 무조건 좋은가? (0) | 2022.02.12 |
예외처리의 기본 (0) | 2022.01.25 |