IntelliJ IDEA 디버깅 도구로 시작하는 코드 흐름 분석

Trace Your Code with Precision Using the Debugger in IntelliJ IDEA
디버깅은 단순히 오류를 찾는 작업을 넘어, 코드의 흐름을 이해하고 내부 상태를 면밀히 관찰할 수 있도록 도와주는 중요한 과정입니다. IntelliJ IDEA는 이러한 과정을 정밀하게 지원할 수 있는 강력한 디버깅 도구를 제공합니다. 우리가 프로그램을 디버깅할 때 실제로 어떤 흐름으로 동작이 진행되는지, 변수와 객체가 어떤 값을 가지게 되는지를 눈으로 직접 확인할 수 있다는 점은, 복잡한 로직을 이해하고 문제를 해결하는 데 있어 매우 큰 이점을 제공합니다.
이번 글에서는 IntelliJ IDEA 디버거의 핵심 기능 중에서도 브레이크포인트(Breakpoint) 설정과 스테핑(Stepping) 기능에 집중하여, 실전 상황에서 어떻게 활용할 수 있는지를 단계별로 살펴보겠습니다.
이 글에 포함된 모든 예제는 macOS 환경에서 IntelliJ IDEA를 기준으로 작성되었습니다.
1. Breakpoint: 디버깅의 시작점
디버깅을 시작하기 위해서는 먼저 코드의 실행을 어느 지점에서 중단할 것인지 지정해야 합니다. 이때 사용하는 기능이 브레이크포인트입니다. 브레이크포인트는 코드의 특정 줄에 설정할 수 있으며, 실행 중 해당 줄에 도달하면 프로그램이 일시 정지하게 됩니다. 이렇게 중단된 상태에서는 현재까지의 실행 흐름, 변수 값, 객체 상태, 스택 프레임 등을 직접 확인할 수 있어 로직을 세밀하게 점검할 수 있습니다.
- 단축키: ⌘ Cmd + F8
- 코드 에디터의 라인 넘버(Gutter) 클릭
브레이크포인트는 디버깅을 시작하기 전 미리 설정해둘 수도 있고, 디버깅 세션 도중 언제든 추가하거나 제거할 수도 있습니다. 일반적으로 조건문이나 반복문 앞, 특정 입력에 따라 흐름이 갈릴 수 있는 메서드 진입부 등에 설정하는 경우가 많습니다. 상황에 따라 조건부 브레이크포인트로 설정하여 특정 값이 주어졌을 때만 정지되도록 설정할 수도 있으며, 이는 디버깅 중 불필요한 중단을 줄이는 데 도움이 됩니다.

브레이크포인트를 설정한 후 디버깅 모드로 애플리케이션을 실행하면, 해당 지점에서 코드 실행이 자동으로 중단됩니다.

이 상태에서는 디버그 도구창을 통해 변수 값이나 콜 스택을 확인하고, 필요한 경우 스택 프레임 간 이동이나 객체 필드 확인 등도 수행할 수 있습니다. 디버그 창의 레이아웃이나 포커스는 마우스 우클릭을 통해 상황에 맞게 조정할 수 있으며, 이를 통해 디버깅 환경을 보다 자신에게 익숙한 형태로 구성할 수 있습니다.

2. Stepping
브레이크포인트를 통해 프로그램 실행을 특정 지점에서 일시 정지한 후에는, 그 다음 흐름을 직접 따라가며 확인할 수 있어야 합니다. 이를 가능하게 해주는 기능이 바로 스테핑(Stepping)입니다. 스테핑은 한 줄씩 코드를 실행하며, 코드가 실제로 어떤 순서로 평가되고 동작하는지를 개발자가 직접 추적할 수 있도록 도와줍니다.
이 기능은 특히 조건 분기, 반복문, 중첩된 메서드 호출 등 실행 경로가 복잡한 코드에서 매우 유용하게 활용됩니다. 다음에서는 IntelliJ IDEA에서 제공하는 다양한 스테핑 도구들에 대해 살펴보겠습니다.

2-1. Step Over
Step Over는 현재 라인을 실행한 뒤, 다음 라인으로 이동하는 기능입니다. 실행 중인 줄에 메서드 호출이 포함되어 있더라도, 그 메서드의 내부로는 진입하지 않고 호출 결과만 처리한 다음 다음 줄로 넘어가게 됩니다. 다시 말해, 메서드의 외부에서 전체 흐름만 따라가고자 할 때 사용하는 기능입니다.
이 기능은 호출되는 메서드의 동작을 이미 알고 있거나, 내부 구현에 대한 검토가 필요하지 않을 때 유용하게 사용할 수 있습니다. 예를 들어, 컬렉션 정렬과 같이 표준 라이브러리에서 제공되는 메서드나, 별도로 검증이 완료된 유틸리티 메서드의 경우 내부 흐름까지 확인할 필요 없이 Step Over를 사용하여 흐름을 간단히 넘길 수 있습니다.
- 단축키: F8

2-2. Step Into
Step Into는 현재 줄에 포함된 메서드 호출의 내부로 직접 진입하여, 해당 메서드가 어떤 방식으로 동작하는지를 한 줄씩 따라가며 확인할 수 있게 해주는 기능입니다. 이 기능은 메서드가 예상과 다르게 작동하거나, 전달된 인자에 따라 다른 경로로 흐름이 갈리는 경우처럼 로직의 세부 처리를 확인할 필요가 있을 때 효과적입니다.
특히 메서드 내부에서 조건 분기나 상태 변경이 발생하는 경우, Step Into를 통해 실제 흐름을 추적함으로써 문제의 원인을 더 명확하게 파악할 수 있습니다.
- 단축키: F7

한 줄에 여러 개의 메서드가 포함되어 있을 경우 IntelliJ IDEA는 Smart Step Into 기능을 통해 사용자가 진입할 메서드를 직접 선택할 수 있도록 지원합니다.

2-3. Step Out
Step Out은 현재 진입해 있는 메서드를 더 이상 분석할 필요가 없을 때, 해당 메서드의 나머지를 자동으로 실행하고 이를 호출한 상위 코드로 빠져나가는 기능입니다. 즉, 하위 호출 스택에서 상위 호출 지점으로 복귀하고자 할 때 사용하는 도구입니다.
Step Into를 통해 메서드 내부로 들어갔다가, 내부 동작을 충분히 확인한 이후 더 이상 분석할 필요가 없다고 판단되면 Step Out을 통해 빠르게 상위 흐름으로 되돌아갈 수 있습니다. 복잡한 호출 체계 내에서 현재 스택 프레임의 실행을 종료하고자 할 때 특히 유용합니다.
- 단축키: ⬆ Shift + F8

2-4. Run to Cursor
Run to Cursor는 현재 위치에서 커서가 놓인 줄까지 코드를 한 번에 실행하고, 해당 줄에서 다시 일시정지하는 기능입니다. 실행 흐름을 특정 지점까지 빠르게 넘기고자 할 때 매우 편리하게 사용할 수 있으며, 중간 과정을 생략하고자 할 때 유용합니다.
예를 들어 반복문 내부나 초기화 코드 등 중간 단계의 흐름은 생략하고, 특정 조건문 앞이나 메서드 진입 직전까지만 실행을 진행하고자 할 때 이 기능이 효과적입니다. 실행 중 설정한 커서 위치까지는 별도의 브레이크포인트 없이도 자동으로 도달할 수 있으므로 디버깅의 흐름을 단순화하는 데 도움이 됩니다..
- 단축키: ⌥ Opt + F9

2-5. Reset Frame
Reset Frame은 현재 메서드를 처음부터 다시 실행하고자 할 때 사용하는 기능입니다. 메서드 진입 이후 상태를 잘못 분석했거나, 변수 값을 수동으로 변경한 뒤 동일한 흐름을 반복 확인하고 싶을 때 활용됩니다.

이 기능은 현재 스택 프레임만을 되돌리므로, 프로그램 전체가 초기화되는 것은 아닙니다. 다시 말해, 전역 상태나 외부 리소스는 그대로 유지된다는 점에 유의해야 합니다. 예를 들어 메서드 내부에서 외부 파일을 수정하거나 데이터베이스에 값을 저장하는 등의 작업이 이미 수행되었다면, Reset Frame을 사용하더라도 해당 부작용은 취소되지 않습니다. 따라서 이 기능은 상태 변경이 최소화된 순수 로직을 재확인할 때 더욱 안전하게 사용할 수 있습니다.
2-6. Resume Program
Resume Program은 현재 일시정지된 실행을 다시 이어가도록 하는 기능입니다. 이후 코드 흐름을 중단 없이 진행하다가, 다음 브레이크포인트가 있는 지점에서 다시 멈추게 됩니다. 새로운 분석 지점까지 빠르게 이동하고자 할 때 가장 일반적으로 활용되는 도구입니다.
주의할 점은, 현재 이후에 브레이크포인트가 설정되어 있지 않은 경우 프로그램이 종료될 수 있다는 점입니다. 따라서 Resume을 사용하기 전에는 다음 중단 지점이 제대로 설정되어 있는지를 확인하는 것이 좋습니다. Resume은 전체 흐름을 한 번에 실행하되, 특정 조건에서 다시 분석을 이어가고자 할 때 매우 효율적으로 사용할 수 있습니다.
- 단축키: ⌥ Opt + ⌘ Cmd + R

3. 정리하며
지금까지 IntelliJ IDEA의 디버깅 기능 중에서도 가장 자주 활용되는 브레이크포인트 설정과 다양한 스테핑 기능에 대해 살펴보았습니다. 이러한 기능들은 코드의 흐름을 보다 정확히 이해하고, 특정 시점의 상태를 직접 확인하는 데 큰 도움이 됩니다.
디버깅은 단순한 오류 수정 도구를 넘어서, 코드가 의도한 대로 동작하고 있는지를 검증하고 설계 구조를 재확인하는 데 매우 효과적인 수단이 될 수 있습니다.