본문 바로가기

프로그래밍/기타

Intellij IDEA에서의 Remote Debug 설정 방법

MongoDB 공부를 하던 과정에서 공교롭게 Remote Debug를 해야 할 상황이 있어서 작업을 하게 되었다. 근데 공교롭게도 관련 설정에 대한 내용을 검색했을때 구버전에 대한 내용만 있어서 한번 정리를 하게 되었다. 사용된 IntellJ 버전은 2020.1 이다

 

이 글의 내용은 개인적인 경험을 바탕으로 쓴 글이어서 일부 부정확한 내용이 있을수 있다. IntelliJ의 Help 에서도 이에 대한 설명을 찾을수가 없어서 구글링을 통해 검증한 것이라 틀릴수도 있음을 말해둔다.

 

Run ->Edit Configurations... 메뉴를 들어가면 나오는 화면에서 좌측 상단의 + 를 클릭하면 Add New Configuration 이 나온다. 여기서 Remote를 선택한다.

 

좌측 상단의 + 를 클릭한 상태에서 Remote 를 선택한다

 

그러면 다음과 같이 Remote Debug에 대한 설정이 아래 화면과 같이 나온다. 이 글에서 설명할 항목에 대해서는 붉은색 사각형으로 표시해두었다.

 

 

1. Name : 이 항목은 붉은 사각형으로 표시하지는 않았지만 설명하자면 이렇게 만든 디버그 설정의 이름을 정하는 항목이다. 나중에 디버그 실행할때 Name 항목에 입력한 설정 이름을 선택하면된다.

 

2. Debugger mode : Remote Debug 동작 방법을 결정하는 항목이라 보면 된다. 여기에는 크게 2개의 항목이 있는데 Attach to remote JVM 과 Listen to remote JVM 이렇게 2개의 항목이 있다. 2개 모두 최종적인 동작형태는 다른게 없지만 동작 방법에 있어서 차이가 있다. 2개의 항목 이름이 동작 방법을 그대로 설명하고 있는데 Attach to remote JVM 은 디버깅 대상이 되는 원격 JVM에 접속해서 디버깅을 하는 것이다. 그리고 Listen to remote JVM은 디버깅 대상이 되는 원격 JVM이 IntelliJ에 접속을 해서 디버깅을 하는 것이다. 이해를 돕기 위해 예시를 좀 들어서 설명하도록 하겠다.

 

예를 들어 내가 만든 jar 파일을 remote debug한다고 가정해보고 이 jar 파일을 A 라고 하자. Attach to remote JVM은 A를 실행할때 A를 디버깅하기 위한 통신 port가 A쪽에서 열려지고 이를 IntelliJ가 접속해서 연결하는 형태이다. 그리고 Listen to remote JVM은 A를 디버깅하기 위한 통신 port가 IntelliJ에서 열려지고 A가 IntelliJ 쪽에 접속해서 연결하는 형태이다. 그래서 Attach to remote JVM 방식으로 하게 되면 먼저 대상이 되는 jar 를 실행시킨뒤 그 다음에 IntelliJ 디버깅을 실행하는 것이고, Listen to remote JVM은 거꾸로 IntelliJ 디버깅을 먼저 실행한 뒤 대상이 되는 jar 파일을 실행하는 것이다. IntelliJ에서 디버깅하는 결과는 두 가지 방법 모두 동일하나 어떤것을 디버깅하느냐에 따라 어떤것을 이용해야 할지가 갈려지게 된다.

 

위에서 얘기한 A가 spring boot로 만들어진 web app 이라고 가정해보자. 만약 내가 디버깅 하는 것이 화면 UI의 이벤트나 또는 web app에 접속하는 url 에 대한 디버깅을 한다면 Attach to remote JVM을 선택하면 된다. Attach to remote JVM은 위에서 설명한 대로 디버깅 대상이 되는 원격 JVM에 접속해서 디버깅 하는 것이기 때문에 디버깅 대상이 되는 A가 먼저 실행이 된뒤에 IntelliJ의 디버깅을 실행시키면 된다. 그러나 web app의 설정항목에 대한 디버깅이나 초기화 되는 과정에서의 디버깅 같이 web app이 로딩되는 과정에 대한 디버깅을 해야 할 때는 Listen to remote JVM을 선택해야 한다. 왜냐면 Attach to remote JVM은 먼저 디버깅 대상이 되는 jvm인 web app을 먼저 실행시켜버리기 때문에 web app을 먼저 실행시킨뒤 IntelliJ 디버깅을 실행시켜 버리면 web app이 이미 초기화 과정을 거친 뒤에 IntelliJ 디버깅이 붙는 상황이 되어버리므로 이러한 부분을 디버깅할 수 없다. 그러나 Listen to remote JVM은 위에서 설명한대로 IntelliJ의 디버깅을 먼저 실행한뒤 web app을 실행시켜서 web app이 IntelliJ에 붙는 형태이기 때문에 web app이 로딩하는 과정에서 벌어지는 상황에 대한 디버깅이 가능해진다. 그리고 Listen to remote JVM은 위에서 언급했던 Attach to remote JVM에서 디버깅 했던 항목들도 디버깅이 가능하기 때문에(이미 web app이 실행된 이후의 동작에 대한 디버깅이므로..)

Listen to remote JVM을 선택하면 모든 항목에 대한 디버깅이 가능해진다. 다만 Listen to remote JVM으로 하게 되면 IntelliJ의 디버그가 실행되어 있지 않으면 대상이 되는 Remote JVM이 실행되지 않기 때문에(왜냐면 IntelliJ 디버그를 실행해야 Remote JVM이 접속하게 될 port가 열려지게 될텐데 디버그가 실행되지 않으면 이 port가 열려지지 않기 때문에 Remote JVM 이 접속을 할 수 없게 되어서 실행이 되질 않는다) 운영서버 같이 민감한 서버일 경우엔 Attach to remote JVM으로도 디버깅이 가능한 항목이면 Attach to remote JVM을 하는 것이 좋다

 

3. Host : 원격 JVM이 실행되는 host machine의 hostname 이나 ip를 적어주면 된다

 

4. Port : 디버깅을 하기 위해 접속하는 Port 번호를 넣어주면 된다.

 

5. JDK 5-8: 이 부분은 원격 JVM의 JRE 버전을 설정하는 것으로 JDK 5-8을 클릭하면 JDK 9 or later, JDK 5-8, JDK 1.4.x, JDK 1.3.x or earlier 이렇게 4개 중 하나를 선택할 수 있다. 

 

6. Command line arguments for remote JVM : 이 항목은 붉은색 사각형으로 표시하지는 않았지만 부가설명을 조금 해야 할것 같아서 넣었다. 지금까지 설명한 1번에서 4번까지의 설정을 하게 되면 이 항목에 표시되는 문자열 값들이 1번에서 4번까지의 설정 항목에서 어떤 값을 했냐에 따라 약간약간 바뀌는 부분이 있다. 이 항목에서 표시하는 명령어 라인을 원격 JVM을 실행할때의 Option 으로 사용하면 된다.

 

7. Use module classpath : 이 항목은 디버그 하고자 하는 IntelliJ Module을 설정하면 된다.

 

이러한 과정을 거쳐서 만든 디버그 설정을 나중에 Run -> Debug... 메뉴를 실행시킨뒤 1번에서 입력한 디버그 설정 이름을 선택하여 디버그를 실행시키면 된다. 다만 이러한 디버그를 실행하는 시점을 2번 항목에서 설명한 대로 실행시켜주면 된다.