2023. 12. 28. 22:25ㆍ팁 모음 장소
[ 작성 이유 ]
"스프링 입문을 위한 자바 객체 지향의 원리와 이해" 책을 보다보니 JVM의 메모리 구조와 스택 프레임에 관한 이해를 돕기 위해 STS(Spring Tool suite)를 이용해서 Line 별 체크 포인트에 따라 어떻게 변하는 지를 보여주는 대목이 있다. 이 부분을 보는데 인텔리제이를 주로 사용하는 나는 무슨 버튼을 눌러야 하는지에 대해서 전혀 감이 오지 않았다. 그래서 이 부분을 한번 연습해보고 괜찮은 기능을 정리해보려고 한다.
[ 디버거 버튼 별 사용 용도 ]
우선 디버거와 관련해서는 다음과 같은 버튼이 있다. 향로님의 게시글에서 가져온 이미지인데 현재 최신버전과는 drop frame 부분이 조금은 다르지만 이 부분을 제외하고 한꺼번에 정리되어있어서 너무 좋은 이미지라고 생각한다.
우선 Line 별로 이동하는 Step into와 step out에 대해서 알아보려고 했다. Step over는 현재 break된 파일에서 다음 라인으로 이동을 한다하고 아래에는 이 기능을 몰라서 라인 하나하나에 전부 break를 걸었다면 Step over를 사용하자라는 말이 적혀있었다. 그리고 Step into에는 현재 break된 라인에서 실행하고 있는 라인으로 이동한다라고 적혀있었다.
그래서 라인 하나하나에 break를 걸었다면 step over를 사용하자라는 말 때문에 나는 step over는 라인별 이동, step into는 breakpoint 별 이동이라고 생각을 했었다. 참고로 보고 있던 책에서 쉬운 예시였던 start4.java라는 코드에 breakpoint를 다음과 같이 걸었다.
그런데 이상하게도 step into랑 step over 모두가 똑같이 작동을 했다. 그래서 엥....? 이러고는 다른 웹사이트에서 찾아보았는데 stackoveflow에 있는 한 Step into와 Step over의 차이를 보고나니 좀 이해가 됐다.
이렇게 적혀있었고 예시로 준 파일은 조금 다르지만 다른 것도 설명하기 위해 이렇게 바꿔보았다.
testprog.java와 testprog2.java를 이렇게 작성을 하고 f(x)에 체크포인트로 설정을 해놓았다. 이 상태에서 testprog를 돌려보면 step into와 step over의 차이점을 알 수 있다.
step into는 현재 작동 중인 line에서 메서드가 있으면 해당 메서드 내부로 들어간다. 그렇기 떄문에 step into를 누르면 testprog2.java의 9번 라인 다음 이동 장소로 5번을 이동한다.
step over는 현재 작동 중인 line에서 메서드가 있건 말건 해당 메서드는 무시하고 다음 line으로 이동한다. 그렇기 때문에 step over를 누르면 testprog2.java의 9번라인 다음 라인인 10번라인으로 이동한다.
그러면 Step out이라는 키도 있는데 이건 뭘까? Step out은 step into랑 짝으로 생각하면 된다. 현재 Step into로 메서드 내부로 이동해서 내부 코드를 보고 있다면 Step out을 눌렀을 때 해당 메서드의 바깥으로 나올 수 있다. 해당 키를 누르면 마치 메서드에 들어가기 전 step over를 누른 것과 동일한 효과가 나타나게 된다. 5번라인으로 이동하고 step over를 눌러보고 6번 라인으로 이동하고 step over를 눌러보면 무슨 이야기인지 알 수 있다.
그런데 step into가 생각을 해보면 꼭 갈 필요가 없는 getter나 constructor 같은 메서드에 갈 수도 있고 외부 라이브러리 코드로도 갈 수 있다. 이걸 굳이 가야될 필요가 있을 것 같지는 않다. 본인이 작성한 코드의 메서드 내부로만 들어가는 걸로 충분하다. 그렇기 때문에 불필요한 디버깅이 일어나지 않도록 skip하는 기능을 인텔리제이에서는 제공을 한다.
이 세팅은 window 기준으로 ctrl + alt + s 버튼을 누르고 stepping이라고 검색을 하면 다음과 같이 나온다.
이렇게 이미지가 나오고 simple getter와 constructor를 skip하는 걸 누르면 이에 대해서 step into를 눌렀을 때 step over처럼 작동하게 만들 수 있다. 하지만 확인할 필요가 있을 수도 있는데 이 경우에는 force step into라는 기능이 있다. window 기준으로 alt + shift + F7 버튼을 누르면 되고 원래는 skip하기로 한 것에 대해서 들어가서 확인할 수 있게 해준다.
그럼 되돌기리 기능은 어떻게 하는 걸까? 이 부분은 drop frame이라는 기능이 있다. 이전 실행으로 돌아가는 것인데, 인텔리제이를 2020년도 버전으로 업데이트를 하지 않았다면 위의 이미지를 참고해서 해당 버튼을 누르면 되고 최신 버전을 사용하고 있는 사람은 일단 debug를 통해서 뭔가 이동을 해야된다.
위의 이미지를 보면 g:10 testprog2 옆에 되돌리기 버튼 같이 생긴게 있고 그걸 누르면 된다. Delete 버튼을 사용해도 된다.
맨 오른쪽 버튼인 Run to Cursor 버튼을 누르면 내가 지금 눌러서 지정된 라인으로 이동하게 된다. 아래의 이미지를 보면 현재 9번 라인에 있다고 생각을 하고 Step over를 누르면 10번 라인으로 갈거고 Step into를 누르면 5번 라인으로 이동을 할 것이다. 그런데 나는 그냥 9-5-6-10-5-6 이렇게 작동을 하고 11번라인으로 바로 가고 싶을 떄 사용할 수 있다. Run to Cursor버튼을 다음처럼 세팅하고 눌러보면 알 수 있다.
대신 중간에 break 포인트가 있으면 break point로 이동을 하고 break point를 걸지 않고 임시로 걸어두기에 좋다고 한다.
추가적으로 할 수 있는 일들도 있다. 반복문의 경우에는 어떻게 특정 값이 들어갔을 때의 상황을 체크할 수 있을까? break 포인트 점에 우측 마우스를 클릭하면 창이 나온다. 그 창에 이번에는 x == 3이라는 조건문을 넣어보자.
이렇게 되면 f(x)가 모든 상황에서 멈추는 게 아닌 x == 3인 상황에서만 멈추게 된다. 그래서 debugging을 해보면 g(2)는 끝나고 g(3)에서 f(x)가 딱 작동하려는 시점에서 break 포인트가 걸리게 된다. 반복문 상황 같이 순회하는 상황에서 특정 값을 가지는 경우에서 어떤 일이 일어나는지 디버깅할 때에 유용하다고 한다. 대신 break를 건 장소에서의 스택 프레임 상황에서 해당 변수가 접근이 가능한 변수인지를 살펴보아야된다. 안 그러면 에러난다.
내용이 길어져서 다음 게시글에는 간략한 JVM 상의 메모리 구조와 이를 debugger로 확인하는 방법에 대해서 적어보려고 한다.
[ 내용 및 이미지 출처 ]
'팁 모음 장소' 카테고리의 다른 글
JPA 프로그래밍 - LazyInitializationException (1) | 2024.02.18 |
---|---|
스프링 부트 3.x - queryDSL gradle 설정 방법 (0) | 2024.02.14 |
Spring 3.X Hibernate5Module 설정 방법 (1) | 2024.02.14 |
H2 DB 사용 방법 (0) | 2024.01.22 |
인텔리제이 한글 깨짐 (0) | 2024.01.19 |