JAVA

리눅스 jBoss 서버에 egovframe 3.8 배포시 "Failed services" 오류 해결 방법

wooyit 2023. 7. 20. 11:16

최근에 저는 리눅스 서버에 jBoss 서버를 설정하고 egovframe 3.8을 배포하는 과정에서 'Failed services' 오류에 부딪혔습니다. 오류 메시지에서는 batchScheduler 라는 빈의 초기화 과정에서 문제가 발생하였음을 알 수 있었습니다. 이는 NullPointerException이 발생하면서 빈을 생성하는 과정에서 실패했음을 나타냅니다.

원인 파악:
에러 로그를 보면, 초기화를 위해 context-*.xml 파일에 정의된 빈들이 잘못된 순서로 로드되는 문제가 있음을 알 수 있습니다. 이 문제는 빈들이 의존성 순서에 따라 올바르게 초기화되지 않을 때 발생합니다.

 

"{\"WFLYCTL0080: Failed services\" => {\"jboss.undertow.deployment.default-server.default-host./\" => \"java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'batchScheduler' defined in VFS resource [\\\"/opt/wildfly/standalone/deployments/egovframework-all-in-one.war/WEB-INF/classes/egovframework/spring/com/scheduling/context-scheduling-sym-bat.xml\\\"]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'batchScheduler' defined in VFS resource [\\\"/opt/wildfly/standalone/deployments/egovframework-all-in-one.war/WEB-INF/classes/egovframework/spring/com/scheduling/context-scheduling-sym-bat.xml\\\"]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'batchScheduler' defined in VFS resource [\\\"/opt/wildfly/standalone/deployments/egovframework-all-in-one.war/WEB-INF/classes/egovframework/spring/com/scheduling/context-scheduling-sym-bat.xml\\\"]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    Caused by: java.lang.NullPointerException\"}}"

 

참고 사이트

https://www.macaronics.net/index.php/m05/egov/view/1620

 

마카로닉스

Meet a variety of information and useful content at macaronics.net

www.macaronics.net


해결 방법:
Spring에서는 context-*.xml에 정의된 빈들을 순서대로 초기화합니다. 이 순서는 보통 별도로 지정하지 않으면 파일명의 알파벳 순서에 따라 결정됩니다. 하지만, 이 경우에는 빈들의 초기화 순서가 중요하므로, 빈들이 올바른 순서로 초기화되도록 지정해야 합니다.

이 문제를 해결하기 위해 다음과 같은 변경을 EgovWebApplicationInitialize.java 파일에 적용했습니다. 먼저, context-*.xml 파일에 있는 빈들을 초기화하고, 그 다음으로 이외의 빈들을 초기화하도록 setConfigLocations를 수정하였습니다.

 

수정 전:

XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
rootContext.setConfigLocations(new String[] { "classpath*:egovframework/spring/com/**/context-*.xml" });
rootContext.refresh();
rootContext.start();

수정 후:
XmlWebApplicationContext rootContext = new XmlWebApplicationContext();
rootContext.setConfigLocations(new String[] { "classpath*:egovframework/spring/com/context-*.xml","classpath*:egovframework/spring/com/*/context-*.xml" });
rootContext.refresh();
rootContext.start();

 

 

결과:
수정 후 다시 빌드와 배포를 진행한 결과, 이전에 발생했던 Failed services 오류는 더 이상 발생하지 않았습니다. 이 방법을 통해 빈들이 올바른 순서로 초기화되어 애플리케이션이 정상적으로 작동하는 것을 확인할 수 있었습니다.

추가 팁:
이번 오류 해결 과정에서 중요했던 점은 에러 로그를 꼼꼼하게 분석하고 이해하는 것이었습니다. NullPointerException 같은 오류는 보통 특정 객체가 아직 생성되지 않았는데 참조하려고 할 때 발생합니다. 그래서 문제가 발생한 부분의 코드를 살펴보고, 어떤 객체가 null인지, 왜 null인지를 파악하는 것이 중요합니다.

결론:
egovframe에 대한 배포 오류는 때때로 복잡하고 헷갈릴 수 있습니다. 하지만 에러 메시지를 철저히 분석하고, 문제의 원인을 찾아서 해결하는 과정을 통해 이해도를 높이고 스킬을 향상시킬 수 있습니다. 다음에 비슷한 문제가 발생하더라도, 이번 해결 과정이 도움이 되길 바랍니다.