회사에 하루하루 적응해 가면서, 이런저런 개발 경험의 변화를 겪고 있기도 합니다!
그중 가장 가깝게 느껴지는 것 중 하나가.. 2년간 Vscode를 사용해 오다가 Jetbrains IDE로 갈아탄 것이었는데, 그와 함께 "개발 생산성"..을 새삼 다시 해 보게 되지 않나 싶습니다 :)
그러던 중 최근 동료분께서, 디버깅 시에 사용할 수 있는 Jetbrains IDE의 Breakpoint 관련 이런저런 팁을 알려주셔서!
배웠던 내용을 기록할 겸, Breakpoint에 대해 알아 볼 겸 본 포스팅을 작성합니다 :)
잘못된 내용에 대한 피드백은 언제나 감사드립니다! (_ _)
(Vscode에도 Breakpoint 기능은 있었는데.. 그냥 console.log 찍었던 과거의 나...)
이하의 예시 코드는 Spring Boot + Kotlin 환경의 서버에서, JUnit으로 실행하였습니다!
Jetbrains 공식 문서 - debugging code
기억보다 기록을 - IntelliJ 디버깅 해보기
사진과 같이, 코드 Line에 breakpoint를 설정해 줍니다!
그리고, 테스트 코드를 통해 Debug 모드로 실행을 해 주면~~
@SpringBootTest
class TestServiceTest @Autowired constructor(
private val testService: TestService,
) {
@Test
fun `simplePrint를 실행합니다`() {
testService.simplePrint(
printArg = "예시 파라미터"
)
}
}
해당 지점에서 프로그램이 중단되며, printArg
를 확인할 수 있네요! :)
이번에는, 메서드 정의 부분에 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 확인을 위해, TestService
를 살짝 수정해주고, varyingField
에 Watchpoint를 걸어 줍니다!
테스트 코드로 varyingField
를 "변경값"으로 수정하는 로직을 실행해 보면~!
@SpringBootTest
class TestServiceTest @Autowired constructor(
private val testService: TestService,
) {
@Test
fun `testForField를 실행합니다`() {
testService.testForField(
changeTo = "변경값"
)
}
[ #1. "초기값"으로 초기화될 때 ]
[ #2. "변경값"으로 변경될 때 ]
총 2번 Breakpoint를 잡아주네요!
Throwable
및 Throwable
의 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 설정 시에, 특정한 조건에서만 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 ]
[ Stack Trace ]
본 포스팅에서는 IntelliJ에서 사용할 수 있는 Breakpoint의 종류,
그리고 간단한 옵션 몇 가지를 알아보았습니다!
Breakpoint에서의 코드 실행이나 제어..?에 대해서도 조금 알아보고 싶은데,
다음 포스팅에서 마저 진행하려고 합니다! :)