내가 프로그래밍을 할때 주로 사용하는 IDE는 IntelliJ이다. 회사에서는 라이센스를 구매해 주기 때문에 Ultimate 버전을 사용하고, 집에서 간단한 예제 코드등을 실행할때는 무료버전인 Community Edition을 사용한다.
지금 공부하고 있는 책의 예제 코드가 메이븐 + 스프링부트 프로젝트여서 코드를 돌려보기 위해 IntelliJ Community Edition 에 import하고 디버깅을 하기 위해 braekpoint를 걸었으나 걸리지 않는 문제가 발생했다.
이상하다 싶어 Ultimate 버전에 import 하고 똑같이 braekpoint를 걸어 디버깅을 시도 해봤는데 아무 이상 없이 디버깅이 잘 되었다. 뭐가 다른걸까 하고 봤는데 스프링 부트를 실행시키는 방법에 차이점이 있었다.
Ultimate 버전은 공식적으로 Spring boot 통합 환경을 지원해준다. 그래서 IntelliJ가 지원하는 Spring boot Run Configuration 기능을 이용해 애플리케이션을 실행시켰고, CE버전은 Spring boot 환경을 지원하지 않기 때문에 maven 명령어인 spring-boot:run
으로 실행하였다. Ultimate 버전에서도 maven 명령어로 스프링 부트를 실행하면 디버깅을 할 수 없는 문제가 똑같이 발생했다.
원인은 아직 잘 모르겠으나 Spring boot가 내장 톰켓을 사용하기 때문인것 같았다. 디버깅 할 수 있는 방법이 없을까 하다가 원격 디버깅 기능을 이용해 문제를 해결하였다.
먼저 원격 디버깅 세션을 활성화 하기 위해 아래와 같이 VM Option을 추가해준다.-Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"
그런 다음, Edit configuration -> + 버튼 클릭 -> Remote Debug Configuration
을 만들어 준다.
마지막으로 디버깅을 하기 위해선 먼저 만든 maven run configuration 으로 애플리케이션을 실행한 다음, 두번째로 만든 remote debug configuration을 실행하면 된다. (물론 debug 모드로 실행해야 한다.)
번거롭긴 하지만 위 방법을 이용하면 IntelliJ CE에서도 Spring boot 지원 없이 디버깅을 할 수 있다.