javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication (feat.JMX의 역할)
이번에 Spring framework로 구성되어 있던 기존 서비스를 Spring Boot로 올리면서 우여곡절을 많이 겪고 있다.
Boot로 올린 후 테스트삼아 서버를 켜봤는데, 아래와 같은 에러메시지가 떴다.
javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1095) ~[na:1.8.0_161]
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getClassLoaderFor(DefaultMBeanServerInterceptor.java:1444) ~[na:1.8.0_161]
at com.sun.jmx.mbeanserver.JmxMBeanServer.getClassLoaderFor(JmxMBeanServer.java:1324) ~[na:1.8.0_161]
at javax.management.remote.rmi.RMIConnectionImpl$6.run(RMIConnectionImpl.java:1365) ~[na:1.8.0_161]
at java.security.AccessController.doPrivileged(Native Method) [na:1.8.0_161]
at javax.management.remote.rmi.RMIConnectionImpl.getClassLoaderFor(RMIConnectionImpl.java:1362) ~[na:1.8.0_161]
...
다행히도 stackOverflow에서 답을 찾을 수 있었다.
javax.management.InstanceNotFoundException: org.springframework.boot:type=Admin,name=SpringApplication
I developed a Spring boot application and the functionality of the application is working fine. However, at the time of startup, I see the below exception multiple times. When I ran the same
stackoverflow.com
아무래도 InteliJ의 디폴트 설정값 때문에 발생한 문제로 보였다.
'Enable JMX agent' 설정을 꺼주면 위와 같은 문제가 발생하지 않는다는데, 정말 그랬다!
왜 그걸 꺼주면 문제가 발생하지 않는지에 대한 답변 또한 있었다.
위 답변에 의하면...
JMX/LifeCycle이 즉시 시작되지만,
SpringBoot는 application.properties와 빈 등록, 오토와이어링 등 여러 가지를 해결해야 하기 때문에 시간이 더 걸린다.
때문에, JMX는 시작되고 SpringBoot는 아직 시작되지 않은 채로 JMX는 SpringBootApplication을 찾는다.
하지만 SpringBootApplication은 아직 시작되지 않았기 때문에 찾을 수가 없어 에러/예외가 발생한다.
JMX agent Enabled 설정을 끄면 저런 예외도 발생하지 않지만,
포트 정보를 볼 수 없게 되며 포트가 "알 수 없는 포트"로 나타난다.
결국 해당 설정을 켜고 포트 정보를 보든가, 설정을 끄고 수동으로 포트 정보를 추적하든가... 인데.
그래서 결국 JMX가 뭐길래? 싶어서 정보를 쪼끔 더 찾아봤다.
JMX는 자바 플랫폼에서 애플리케이션과 시스템의 관리 및 모니터링을 위한 프레임워크로,
애플리케이션의 상태를 관리하고, 설정을 변경하며, 애플리케이션을 모니터링할 수 있도록 다양한 기능을 제공한다.
JMX는 크게 4가지의 요소를 가지고 있는데, 간단하게 요약하면
1. MBean(Managed Bean) : 관리 가능한 자원(어플리케이션 상태, 설정 등)을 표현하는 자바 객체
2. MBeanServer : MBean을 관리하고 등록하는 핵심 컴포넌트로, JMX Client가 MBean에 접근하거나 관리할 수 있게 한다.
3. JMX Connector : 원격에서 JMX를 사용할 수 있도록 하는 인터페이스로, 네트워크를 통해 원격 시스템에서 어플리케이션을 관리 및 모니터링할 수 있다.
4. JMX Client : JMX에 접근하여 MBean을 관리하고 모니터링하는 클라이언트 어플리케이션
따라서.. 위와 같은 예외를 보고 싶지 않다면,
단순히 JMX를 꺼버리거나, SpringBoot가 실행되는 과정에서 MBean을 적절하게 등록할 수 있도록 별도 설정을 해 주는 절차를 거쳐야 한다
'이럴땐 이렇게' 카테고리의 다른 글
Execution failed for task ':compileJava'. (0) | 2024.07.29 |
---|---|
mybatis xml파일 내 if문에서 단일 문자로 비교되지 않는 문제 (0) | 2024.07.16 |
JSON.parse한 Object 내 프로퍼티가 undefined로 나오는 경우 (0) | 2024.04.24 |