[IntelliJ] Breakpoint 활용하기 #1. Breakpoint 유형과 옵션

toto9602·2024년 9월 16일
1

IntelliJ

목록 보기
2/4

회사에 하루하루 적응해 가면서, 이런저런 개발 경험의 변화를 겪고 있기도 합니다!
그중 가장 가깝게 느껴지는 것 중 하나가.. 2년간 Vscode를 사용해 오다가 Jetbrains IDE로 갈아탄 것이었는데, 그와 함께 "개발 생산성"..을 새삼 다시 해 보게 되지 않나 싶습니다 :)

그러던 중 최근 동료분께서, 디버깅 시에 사용할 수 있는 Jetbrains IDE의 Breakpoint 관련 이런저런 팁을 알려주셔서!
배웠던 내용을 기록할 겸, Breakpoint에 대해 알아 볼 겸 본 포스팅을 작성합니다 :)

잘못된 내용에 대한 피드백은 언제나 감사드립니다! (_ _)

(Vscode에도 Breakpoint 기능은 있었는데.. 그냥 console.log 찍었던 과거의 나...)

이하의 예시 코드는 Spring Boot + Kotlin 환경의 서버에서, JUnit으로 실행하였습니다!

참고자료

Jetbrains 공식 문서 - debugging code
기억보다 기록을 - IntelliJ 디버깅 해보기

Breakpoint의 유형

Line breakpoint

  • 지정한 코드 line에 도달했을 때, 프로그램을 중단하는 breakpoint !
  • 실행 가능한 모든 코드 line에 설정이 가능

예시

사진과 같이, 코드 Line에 breakpoint를 설정해 줍니다!

그리고, 테스트 코드를 통해 Debug 모드로 실행을 해 주면~~

@SpringBootTest
class TestServiceTest @Autowired constructor(
    private val testService: TestService,
) {

    @Test
    fun `simplePrint를 실행합니다`() {
        testService.simplePrint(
            printArg = "예시 파라미터"
        )
    }

}

해당 지점에서 프로그램이 중단되며, printArg 를 확인할 수 있네요! :)

Method breakpoint

  • 특정 메서드 진입/종료 시점에 프로그램을 중단하는 breakpoint !

예시

이번에는, 메서드 정의 부분에 Breakpoint를 걸어 줍니다!

그리고, 위 예시와 동일하게 테스트 코드로 실행해 보았습니다!

@SpringBootTest
class TestServiceTest @Autowired constructor(
    private val testService: TestService,
) {

    @Test
    fun `simplePrint를 실행합니다`() {
        testService.simplePrint(
            printArg = "예시 파라미터"
        )
    }

}


메서드 진입 시점의 파라미터, 그리고 그 파라미터로 코드가 실행되는 내용도 보여주네요!

[ cf. Class에 Breakpoint 설정 ]
아래와 같이, Class가 선언된 코드 line에도 Method breakpoint 형태로 breakpoint를 넣어줄 수 있습니다!

이 경우, 아래와 같이 Class가 초기화되는 시점을 잡아서 break해 주네요!

Field watchpoint

  • 특정 필드가 읽히거나, 값이 write될 때 프로그램을 중단하는 breakpoint !

예시

Field watchpoint 확인을 위해, TestService를 살짝 수정해주고, varyingField에 Watchpoint를 걸어 줍니다!

테스트 코드로 varyingField를 "변경값"으로 수정하는 로직을 실행해 보면~!

@SpringBootTest
class TestServiceTest @Autowired constructor(
    private val testService: TestService,
) {
    @Test
    fun `testForField를 실행합니다`() {
        testService.testForField(
            changeTo = "변경값"
        )
    }

[ #1. "초기값"으로 초기화될 때 ]

[ #2. "변경값"으로 변경될 때 ]

총 2번 Breakpoint를 잡아주네요!

Exception breakpoint

  • ThrowableThrowable의 subClass가 throw되었을 때 프로그램을 중단하는 breakpoint !
  • 전역적으로 적용되어, 별도의 소스 코드 참조가 필요하지 않습니다 :)

예시

Mac OS의 경우, cmd + shift + F8 을 입력하여 Breakpoint 관리 창을 띄워 줍니다!

Any exception을 선택하여 모든 예외를 다 잡을 수도 있지만,
본 예시에서는 ArithmeticException을 잡는 breakpoint를 만들어 보려고 합니다!

cmd + N로 새 Breakpoint 생성 > ArithmeticException을 선택해 줍니다!


위 설정을 마치고, TestService도 살짝 수정해 줍니다!

[ #1. 다른 예외(IllegalArgumentException) ]
throwOtherException을 실행하면...

프로그램 중단 없이 바로 IllegalArgumentException이 throw되네요!

[ #2. breakpoint 대상 Exception ]
throwArithmeticException을 실행하면...

예외가 발생한 지점에서 프로그램을 중단하고, 해당 부분을 저희에게 보여주는 걸 확인할 수 있네요! :)

Breakpoint 세부 설정하기

조건 설정하기

Breakpoint 설정 시에, 특정한 조건에서만 break를 걸도록 조건을 설정해 줄 수 있습니다!

예시

Line breakpoint 설정 부분을 우클릭해서,
printArg가 "이상한값"일 때만 break를 걸어주는 조건을 추가해 봅니다!

"멀쩡한값"을 넣어서 실행하면..

@SpringBootTest
class TestServiceTest @Autowired constructor(
    private val testService: TestService,
) {

    @Test
    fun `simplePrint테스트`() {
        testService.simplePrint("멀쩡한값")
    }
}    

중단 없이 멀쩡한 값이 출력되었네요!

이번엔 동일한 코드에 "이상한값"을 넣어서 실행해 보겠습니다!

@SpringBootTest
class TestServiceTest @Autowired constructor(
    private val testService: TestService,
) {

    @Test
    fun `simplePrint테스트`() {
        testService.simplePrint("이상한값")
    }

}

Breakpoint가 잘 잡히고, "이상한값"이 입력되었다는 걸 확인할 수 있네요! bb

이외 세부 옵션

Line Breakpoint 우클릭 후, More로 들어가면 Breakpoint에 대해 세부 설정을 할 수 있는 창이 나옵니다!

몇 가지 옵션들에 대해서는 간단히만 알아보려 합니다!

[ "Breakpoint hit" message ]

  • Breakpoint 진입 시에, 이를 설명하는 간단한 메시지를 출력합니다!

[ Stack Trace ]

  • 진입 시점의 Stack trace를 출력해 줍니다.

마무리

본 포스팅에서는 IntelliJ에서 사용할 수 있는 Breakpoint의 종류,
그리고 간단한 옵션 몇 가지를 알아보았습니다!

Breakpoint에서의 코드 실행이나 제어..?에 대해서도 조금 알아보고 싶은데,
다음 포스팅에서 마저 진행하려고 합니다! :)

profile
주니어 백엔드 개발자입니다! 조용한 시간에 읽고 쓰는 것을 좋아합니다 :)

0개의 댓글