
IntelliJ에서 디버깅을 누르면 콘솔창에서 아래와 같은 문구를 볼 수 있습니다.
Connected to the target VM, address: '127.0.0.1:56147', transport: 'socket'
이 말을 해석해보면 127.0.0.1:56147'인 VM에 소켓으로 연결했다 라는 말이 될 것 같네요.
이를 좀 더 자세히 확인해보기 위해 위의 문구에서 나온 포트정보를 lsof 명령어로 확인해보겠습니다.
📒
lsof명령어
list open files의 약자로 시스템에서 열려있는 파일에 대한 정보를 출력해주는 명령어입니다. 리눅스에서 파일은 매우 광범위하기 때문에 단순한 파일 뿐만 아니라 네트워크 소켓, 파이프, 디렉토리, 장치 파일 등도 포함됩니다.
> lsof -i :56147
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
idea 12220 user123 382u IPv6 0x2e6c54e476458215 0t0 TCP localhost:56147->localhost:56148 (ESTABLISHED)
java 30710 user123 5u IPv4 0x2e6c54e474aaaa65 0t0 TCP localhost:56148->localhost:56147 (ESTABLISHED)
이를 확인해보면 56147 포트가 사용되는 소켓 연결이 2개 있고 양방향으로 통신할 수 있다 라는 말인 것 같네요! 그러면 다른 하나의 포트인 56148 포트는 무엇인지 JVM 프로세스를 보여주는 jps 명령어를 사용해 확인해보겠습니다.
> jps -l | grep 30710
30710 com.twoez.zupzup.ZupzupApplication
바로 프로젝트의 JVM 프로세스였습니다!
즉 이를 통해 에디터에서 사용하는 Java 디버깅 기능에 대해서 정리해보면
56147 포트)을 활용해 디버깅 세션을 만든다.56148 포트)을 만들어 에디터에서 만든 디버깅 세션과 연결한다.가 될 것 같네요!
양방향이 필요한 이유는.. 간단하게 생각해보면
(물론 훨씬 많은 것들이 있을테지만요!)
IntelliJ 에서는 이를 활용해 다른 물리적 서버를 활용하는 자바 어플리케이션에 대해서도 로컬에서 디버깅할 수 있는 원격 디버깅 기능 또한 제공하는데요! 처음에는 이 기능이 굉장히 새롭고 신기해보였지만, 위의 과정들을 알고 나니 기존에 사용하는 디버깅 기능을 거의 똑같이 사용하는 것이란 생각이 들었습니다.
원격 디버깅을 위해서는 디버깅 대상이 되는 자바 어플리케이션에서 디버깅 세션과 연결할 수 있는 추가 포트를 열어 디버깅 세션의 연결 요청이 올 때 소켓으로 연결이 되면 되겠죠?
그러기 위해서 다음과 같은 옵션을 자바 실행 명령에 추가하면 됩니다.
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
이 옵션에서는 다음과 같은 설정을 할 수 있습니다.
agentlib:jdwp : jdwp 를 사용transport=dt_socket : 소켓을 활용한 통신server=y : client-server 관계에서 누가 서버 역할을 하는지에 대한 설정입니다. y로 설정했으니 자바 어플리케이션이 디버깅 세션에 attach 요청을 listen 하고 있을 것 입니다.suspend=n : 디버깅 세션이 붙을 때까지 어플리케이션 실행을 지연시킬 것인지에 대한 설정입니다.y 로 설정한다면 어플리케이션은 디버깅 요청이 올 때까지 실행되지 않고 기다릴 것입니다.address=*:5005 : 서버가 가진 ip 주소 중 어떤 ip 주소에서의 접속을 허용할 것인지, 어떤 포트로 접근하게 할 것인지에 대한 설정을 할 수 있습니다. JDWP (Java Debug Wire Protocol)
protocol used for communication between a debugger and the Java virtual machine (VM) which it debugs (hereafter called the target VM)
=> 디버거와 JVM 사이 통신을 위한 프로토콜입니다. 소켓을 활용하니 TCP Layer의 프로토콜이 될 것 같네요!
Ref