Post
Intellij JMX 연결 관련 에러
오프라인 환경에서 개발을 진행해야 할 때가 많다.
기업의 측면에서는, 보안이 중요하기 때문에 접근 권한을 정해서 보안을 설정하는 경우가 많다.
- Positive 방식: 접근을 허용하는 데 초점을 맞춘 접근법입니다. 즉, 특정 엔티티나 조건이 충족될 때만 접근을 허용하며, 기본적으로 모든 접근을 제한합니다. (Whitelist)
- Negative 방식: 접근을 차단하는 데 초점을 맞춘 접근법입니다. 즉, 특정 엔티티나 조건이 충족될 때만 접근을 차단하며, 기본적으로 모든 접근을 허용합니다. (Blacklist)
여기서, Positive 방식으로 보안을 설정하면 개발자 입장에서는 각종 접하지 못했던 에러에 대해서 맞닥뜨리게 된다.
1.Whitelist에 모든 인가된 프로그램 설치 해야 함 ( 보안 담당자가 모르면 그냥 설치 안됨)
2.웹페이지 당연히 다 접근 안됨 열어 놓은 부분만 됨
3.당연히 인터넷이 안되니 메이븐, 그래들 빌드 툴 될리가 없지, lib에 미리 받아서 다 넣어야됨.
이런 말도 안되는 상황에서 개발자는 개발을 해야겠지……. 그지 같아도 우리는 해야 하니까
java관련해서 도구로는 보통 Eclipse와 intellij를 많이 쓴다.
이 중 Intellij의 Debug모드에서 문제가 발생하는 경우가 있어서 남겨 놓는다.
1. 기본 디버깅 설정
Eclipse
- 설정 방식: Eclipse에서 Spring Boot 앱을 디버그 모드로 실행하려면, 기본적으로 “Debug As > Java Application” 또는 “Spring Boot App”을 선택합니다. Spring Tools Suite(STS) 플러그인을 설치하면 “Debug As > Spring Boot App” 옵션이 제공되어 JMX 설정을 간접적으로 활용할 수 있습니다.
- JMX 활성화: JMX를 명시적으로 사용하려면 애플리케이션 실행 시 JVM 인자(-Dcom.sun.management.jmxremote)를 추가해야 합니다. Eclipse에서는 “Run Configurations” > “Arguments” 탭에서 VM arguments를 수동으로 설정합니다.
- 예: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
- 특징: JMX 디버깅을 위해 JConsole이나 VisualVM 같은 외부 툴을 별도로 실행해 연결해야 하는 경우가 많습니다. Eclipse 자체적으로 JMX MBean을 탐색하는 UI는 기본 제공되지 않습니다.
IntelliJ IDEA
- 설정 방식: IntelliJ에서는 “Run > Debug” 메뉴를 통해 디버그 모드를 실행하거나, Spring Boot 실행 구성을 생성합니다. “Run/Debug Configurations”에서 Spring Boot 템플릿을 선택해 쉽게 설정 가능합니다.
- JMX 활성화: IntelliJ는 Spring Boot와의 통합이 더 깊어, JMX를 기본적으로 지원합니다. application.properties 또는 application.yml에 spring.jmx.enabled=true를 설정하면 JMX가 자동 활성화됩니다. 추가로 VM 옵션을 “Run/Debug Configurations” > “VM options”에 추가할 수 있습니다.
- 특징: IntelliJ는 “Services” 창에서 Spring Boot 애플리케이션의 JMX MBean을 직접 탐색할 수 있는 기능을 제공합니다(Beans, Health, Mappings 탭). 외부 툴 없이 IDE 내에서 JMX 데이터를 확인할 수 있어 편리합니다.
2. JMX 통합 및 모니터링
Eclipse
- JMX 모니터링: Eclipse는 JMX를 바로 보여주는 전용 UI가 없어, JConsole이나 VisualVM 같은 외부 툴을 실행해 JMX 포트(예: 1099)에 연결해야 합니다. Spring Boot Actuator가 제공하는 MBean을 보려면 외부 툴에서 org.springframework.boot 도메인을 탐색합니다.
- Spring Boot와의 통합: STS 플러그인을 사용하면 Spring Boot Dashboard가 제공되지만, JMX에 대한 직접적인 통합은 제한적입니다. 디버깅 중 MBean 상태를 확인하려면 수동으로 외부 툴을 띄워야 합니다.
IntelliJ IDEA
- JMX 모니터링: IntelliJ는 “Services” 창에서 Spring Boot 애플리케이션의 상태(Beans, Health, Mappings)를 실시간으로 보여줍니다. 이는 Spring Boot Actuator와 JMX를 기반으로 동작하며, 별도의 툴 없이도 MBean 정보를 확인할 수 있습니다.
- Spring Boot와의 통합: IntelliJ는 Spring Boot Actuator와 긴밀히 통합되어 있어, JMX를 통해 노출된 엔드포인트(예: /actuator/health, /actuator/beans)를 IDE 내에서 바로 모니터링할 수 있습니다. 디버깅 중에도 이 정보를 실시간으로 확인 가능합니다.
3. 사용자 인터페이스와 편의성
Eclipse
- UI: Eclipse의 디버깅 UI는 전통적이며, 변수 검사, 브레이크포인트 설정 등이 직관적이지만, JMX 관련 정보는 기본적으로 표시되지 않습니다. JMX 디버깅은 외부 툴에 의존해야 하므로 작업 흐름이 분리됩니다.
- 편의성: JMX 설정과 디버깅이 수동적이며, Spring Boot 프로젝트에서 JMX를 활용하려면 추가적인 환경 설정이 필요합니다.
IntelliJ IDEA
- UI: IntelliJ의 “Services” 탭은 JMX 기반 정보를 통합적으로 보여주며, 디버깅 중에도 브레이크포인트와 변수 상태를 확인하면서 JMX 데이터를 동시에 볼 수 있습니다.
- 편의성: Spring Boot와 JMX 설정이 자동화되어 있어, 설정 과정이 간소화되고 IDE 내에서 모든 작업을 처리할 수 있습니다. 예를 들어, spring.jmx.enabled=true만 추가하면 “Services” 창에서 바로 MBean을 확인할 수 있습니다.
4. 디버깅 워크플로우 차이
Eclipse
- 워크플로우:
- Spring Boot 앱을 디버그 모드로 실행.
- JMX를 활성화하려면 VM 인자를 수동 추가.
- JConsole/VisualVM을 실행해 JMX 포트에 연결.
- 디버깅 중 MBean 상태를 확인하려면 IDE와 외부 툴을 번갈아 사용.
- 장점: 오픈소스 기반으로 커스터마이징이 자유롭고, 외부 툴과의 연계가 익숙한 개발자에게 적합.
- 단점: JMX 디버깅이 IDE에 통합되지 않아 작업이 분산됨.
IntelliJ IDEA
- 워크플로우:
- Spring Boot 앱을 디버그 모드로 실행.
- spring.jmx.enabled=true 설정으로 JMX 자동 활성화.
- “Services” 창에서 Beans, Health, Mappings 등 JMX 데이터를 실시간 확인.
- 디버깅과 JMX 모니터링을 IDE 내에서 동시에 수행.
- 장점: 통합된 환경에서 디버깅과 JMX 모니터링을 처리 가능, 생산성 향상.
- 단점: IntelliJ의 Spring Boot 통합 기능은 Ultimate Edition에서 최적화됨(Community Edition에서는 제한적).
5. Spring Boot Actuator와의 연계
- Eclipse: Actuator 엔드포인트를 JMX로 노출하려면 spring.jmx.enabled=true를 설정하고, 외부 툴에서 org.springframework.boot 도메인을 확인해야 합니다. STS의 Boot Dashboard는 일부 Actuator 정보를 보여주지만, JMX 전용 UI는 부족합니다.
- IntelliJ IDEA: Actuator와 JMX가 IDE에 통합되어 있어, “Services” 창에서 Actuator 엔드포인트(예: Health 상태, Bean 목록)를 바로 볼 수 있습니다. 디버깅 중에도 이 데이터를 실시간으로 모니터링 가능합니다.
Eclipse에서는 상관 없었지만, IntelliJ에서 Run할때는 크게 문제가 없었는데 Debug모드 진행 시 아래와 같은 에러가 발생했다.
JDWP는 Java Debug Wire Protocol의 약자로, Java 애플리케이션 디버깅을 위한 통신 프로토콜입니다. 이 프로토콜은 디버거(예: IDE의 디버깅 툴)와 JVM(Java Virtual Machine) 간의 통신을 가능하게 하여 개발자가 코드 실행을 모니터링하고 제어할 수 있도록 합니다. JDWP는 Java 플랫폼의 디버깅 인프라에서 핵심적인 역할을 합니다.
JDWP 부분에서 문제가 생겼을거라 판단 Run과 , Debug 부분을 확인해서 하나씩 바꿔보면서 테스트
테스트 시 , server=y에서 유의미한 테스트 점 발견
server=n인 경우 intellij 내부에서 진행하는 것 같은데 y인 경우 직접 debug 를 attach할 수 있어 보였다.
Run 할 때 VM Option에서 해당 부분을 추가한 후 테스트 했을 시 수동으로 Debug모드를 진행할 수 있음을 확인하고 진행했을 때. 아래와 같이 Debug 모드로 테스트 할 수 있음을 확인했다.
이렇게 되면 Javascript debugger 켯을 때 처럼 두개 실행되는 것을 확인할 수 있다.
하나는 Debug용이고 , 하나는 어플 실행 부분이다.
유지보수를 하다 보면 별의 별일이 다 생기는데, AI 모델의 발전이 없었으면 이걸 해결할 수나 있었을까 싶다.
현재 Vue js Toy project진행하는데 Prontend 개발 맡겨 놨는데 프롬프트로만 수준급의 소스를 만들어 내는 것을 보고 많이 놀랐다. 이전 코로나 때, 한국에 크게 개발자가 늘어난 것을 봤을 때, 유의미하게 커리어를 발전 시키고 자리를 지키고 더 괜찮은 곳에 터전을 마련하기 위해서는 스스로의 자기계발 시간을 계속 가져나가야 가지 않을까 싶고, 너무 안일했던 나를 반성해 보는 시간을 가진다.
댓글