제목의 과정에 해당하는 소스 구동시 다음과 같은 오류가 발생한다.
2025-01-24T17:43:05.983+09:00 ERROR 7916 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed
org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [JedisPool [maxTotal=8, blockWhenExhausted=true, maxWaitDuration=PT-0.001S, lifo=true, fairness=false, testOnCreate=false, testOnBorrow=false, testOnReturn=false, testWhileIdle=false, durationBetweenEvictionRuns=PT-0.001S, numTestsPerEvictionRun=3, minEvictableIdleTimeDuration=PT30M, softMinEvictableIdleTimeDuration=PT-0.001S, evictionPolicy=org.apache.commons.pool2.impl.DefaultEvictionPolicy@6199579c, closeLock=java.lang.Object@28936391, closed=false, evictionLock=java.lang.Object@9eb18ad, evictor=null, evictionIterator=null, factoryClassLoader=java.lang.ref.WeakReference@16bcf72e, oname=org.apache.commons.pool2:type=GenericObjectPool,name=pool, creationStackTrace=java.lang.Exception
at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:407)
at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:147)
at redis.clients.jedis.util.Pool.<init>(Pool.java:16)
강의에서는 redis port번호를 변경 후 정상접속이 되던데 git에서 받은 소스는 포트번호가 정확해서 해당 이유도 아닐 것 같은데 안됨.
RedisConfig를 다음과 같이 수정하여 해결. 메세지만 봤을때는 JMX의 빈 명칭이 충돌하는 것이 원인인 것 같은데 아래와 같은 설정으로 jmx모니터링만 포기하면 진행 가능하다.
package com.example.jediscache;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Component
public class RedisConfig {
@Bean
public JedisPool createJedisPool() {
// return new JedisPool("localhost", 6379);
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setJmxEnabled(false); // JMX 등록 비활성화
return new JedisPool(poolConfig, "127.0.0.1", 6379);
}
}
좀 더 사유를 찾아보니 Spring은 애플리케이션 실행 시 Bean으로 등록된 객체를 자동으로 MBean으로 등록하는데 Spring 초기화 시 JedisPool을 MBean으로 등록한 상태에서 JedisPool 객체가 연결(pool)을 생성하고 반환하면서 동일한 JedisPool 객체를 다시 MBean으로 등록하려고 시도하면서 중복된 MBean 이름으로 인해 오류가 발생하는 거라고 함.