본문 바로가기
  • 개발하는 곰돌이
Development/etc.

[IntelliJ] Remote JVM Debug를 사용해서 서버를 원격으로 디버깅 하기

by 개발하는 곰돌이 2024. 10. 2.

목차

    들어가기 전에

    프로젝트를 개발하다보면 테스트 코드로 검증을 했다고 하더라도 로컬 환경이나 서버가 배포될 환경에서 애플리케이션을 실행했을 때 의도대로 동작하지 않는 경우가 발생합니다.

     

    로컬 환경이라면 그냥 IDE의 디버그 모드를 사용해서 수정이 가능하지만 여러가지 이유로 로컬에서 테스트가 불가능한 로직은 개발 서버 등의 환경에 배포를 하고 테스트를 진행하다보니 일반적인 디버그가 어렵습니다.

     

    이 때 IDE의 Remote JVM Debug 기능을 사용하면 서버에 배포된 애플리케이션이라도 로컬 환경에서 디버그 하듯이 디버그를 진행할 수 있습니다.

    Remote JVM Debug의 동작 원리

    자바의 디버거는 실행중인 애플리케이션에 디버거가 접속하여 동작합니다.

    출처 : https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/architecture.html

     

    IDE를 사용하여 디버깅을 하는 경우 위 그림에서 debuggee에 해당하는 VM이 디버깅을 하고자 하는 애플리케이션이 되고 JDI에 해당하는 front-end는 실제로 디버깅을 진행하는 IDE가 됩니다.

     

    이렇게 VM과 디버거는 JDWP라는 프로토콜을 통해 연결되어 디버깅을 수행하는 것이죠.

     

    이 점은 로컬에서 디버깅을 할 때도 동일한데요, 인텔리제이에서 디버그를 시작하면 콘솔에 아래와 같은 메시지가 찍혀있는 것을 볼 수 있습니다.

    위 메시지는 쉽게 말해 127.0.0.1의 2062 포트에 접속해서 디버깅을 할 애플리케이션에 연결을 했다는 뜻입니다.

     

    그렇다면 위의 127.0.0.1:2062에 해당하는 주소를 원격으로 디버깅하려는 서버의 주소로 변경을 하면 되겠네요!

    원격 디버그 준비하기

    원격 디버그를 하려면 서버에서 실행중인 애플리케이션에 IDE의 디버거가 접속해야 합니다.

     

    애플리케이션이 실행되고 있는 포트와는 별개로 디버거가 접속할 포트가 외부에 열려있어야 합니다.

    이 글에서는 서버의 13211 포트를 사용해서 원격 디버그를 해보겠습니다.

     

    먼저 인텔리제이에서 원격 디버그 설정을 하기 위해 RunEdit Configurations...로 들어갑니다.

    +버튼을 클릭하여 Remote JVM Debug를 선택하면 아래와 같은 설정 화면이 나옵니다.

    우측에서 눈여겨 볼 내용은 HostPort, Command line arguments for remote JVM에 해당하는 내용입니다.

     

    Host에는 디버깅할 애플리케이션이 실행되고 있는 서버의 IP 또는 도메인 주소를, Port에는 디버거가 접속할 포트를 입력해줍니다.

    애플리케이션이 실행될 포트가 아니라 디버거가 접속하기 위해 외부에 오픈해놓은 포트를 입력해야 합니다!

    그러면 Command line arguments for remote JVM의 내용이 조금 바뀌는데 이 내용을 복사하고 OK 버튼을 눌러서 설정을 저장합니다.

     

    그리고 서버에서 jar 또는 war 파일을 실행할 때 위에서 복사한 내용을 인수에 추가해서 실행하면 준비가 완료됩니다.

    java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:13211 -jar {실행할 파일명}

    원격 디버그 접속하기

    옵션을 주고 애플리케이션을 실행하면 13211 포트가 Listening 상태라는 메시지가 뜨면서 애플리케이션이 실행됩니다.

     

    이제 인텔리제이에서 준비해놓은 Remote JVM Debug 설정으로 디버그를 하면...

    로컬에서 디버깅을 할 때와 동일하게 VM에 연결되었다는 메시지가 콘솔에 출력됩니다.

     

    이 상태에서는 로컬 디버깅과 동일하게 브레이크 포인트를 설정하고 디버그가 가능해집니다.

    /hello-debug에 접속을 해보면 로컬에서 디버깅 할때와 똑같이 브레이크 포인트에서 디버깅할 수 있는 것을 볼 수 있습니다.

    댓글