최근에 저는 리눅스 서버에 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에 대한 배포 오류는 때때로 복잡하고 헷갈릴 수 있습니다. 하지만 에러 메시지를 철저히 분석하고, 문제의 원인을 찾아서 해결하는 과정을 통해 이해도를 높이고 스킬을 향상시킬 수 있습니다. 다음에 비슷한 문제가 발생하더라도, 이번 해결 과정이 도움이 되길 바랍니다.
'JAVA' 카테고리의 다른 글
[2023] Spring Security의 context-security.xml 설정 분석하기 (0) | 2023.08.08 |
---|---|
log4j2.xml을 사용하여 애플리케이션의 로깅 구성 관리 (0) | 2023.07.20 |
Maven에서 Tibero6 JDBC 의존성 추가하기 (0) | 2023.07.14 |
eGovFrame 프로젝트 설정: "Invalid LOC Header (Bad Signature)" 에러 해결 (0) | 2023.07.14 |
Java 빌드 오류 해결: "HIGHEST_SPECIAL cannot be resolved or is not a field" (0) | 2023.07.13 |