개발/Spring

[Spring] Spring ant 빌드 후 톰캣 배포 삽질기

hojak99 2017. 10. 18. 15:03


내가 맡은 프로젝트에 대해서 배포할 수 때가 생길 수 있으니 기존에 톰캣 말고 새로운 톰캣을 설치해서 새로운 톰캣에 배포하는 식으로 테스트를 해보았다.





우선 MAVEN 으로만 빌드 해보다가 Ant 빌드를 하려고 하니 잘 몰랐던 것 같다. 원래는 .war 파일을 이용해 배포하는 식으로 했었는데 지금 내가 맡은 프로젝트에서 배포하는 법은 .war 이 아닌 .class 파일들과 .lib 파일들이 들어있는 폴더를 이용해 배포한다. 


즉, 쉽게 말하면 .war 파일을 압축해제 시켜놓은 폴더를 이용해 배포하고 있었다. 



혹시 나중에 까먹을 수 있으니까 써놓는데, .war 파일은 톰캣 설치폴더의 webapps 폴더에 놓아두면 알아서 톰캣 서버가 실행될 때 압축 풀어서 사용한다. 


다시 본론으로 돌아와서, 톰캣 서버를 다시 재시작하고 나서 톰캣 디폴트 페이지에서 manager 페이지로 접속해 /{빌드한 폴더명} 을 start 했다. 


오류가 발생했다. 


[사진 1: FAIL - Application at context path /{플젝이름} could not be started]


[사진 1] 과 같은 메시지를 내뿜고 있었다. 여기까진 고추참치다. 괜찮다.



이제 여기서 뇌를 가지고 있는 사람이라면 "로그 파일을 보아야겠다!" 라는 생각을 할 것이다. 아니면 빨간집모기에 물린 것이니 일본뇌염 검사를 받아보시길 바랍니다 :)






[사진 2: 톰캣 로그 폴더]


보면 .log 라는 확장자를 가진 파일들이 많이 보일 것이다. 여기서 catalina~.log 파일을 열어보자. 






[사진 3: 오류]


로그 파일에선 정말 정확히 알려준다. 

심각: Context [/{플젝이름}] startup failed due to previous errors 라고 친절히 알려준다^^


그러면 이제 localhost ~.log 파일을 열어보자. 그냥 뭐가 무슨 파일인지 모르겠으면 다 열어봐서 심각이라고 써있는 부분보면서 고쳐나가면 된다.



localhost~ .log 파일을 열어보니 다음과 같은 오류가 발생해있다.

심각: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'commonDS' defined in ServletContext resource [/WEB-INF/config/dataSource.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jdbc/common] is not bound in this Context. Unable to find [jdbc].
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5110)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5633)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
	at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1312)
	at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:683)
	at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:209)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:136)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:615)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:662)
Caused by: javax.naming.NameNotFoundException: Name [jdbc/common] is not bound in this Context. Unable to find [jdbc].
	at org.apache.naming.NamingContext.lookup(NamingContext.java:825)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:159)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:836)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:159)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:836)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:173)
	at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
	at javax.naming.InitialContext.lookup(InitialContext.java:392)
	at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
	at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:88)
	at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:153)
	at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
	at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
	at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
	at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:200)
	at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:186)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
	... 45 more


다음 에러로그를 보면서 확인할 수 있는 것은 [/WEB-INF/config/dataSource.xml] 에 정의된 'commonDS' 라는 이름의 bean을 생성하는 중 오류가 발생했단 뜻인 것 같다. 그리고 마지막에 [jdbc/common] 을 바인드 되어 있지 않다며 [jdbc] 를 찾을 수 없다고 한다.


그러면 해당 경로로 한 번 들어가보자.



[사진 4: dataSource]


'commonDS' bean 을 보면 <value>java:comp/env/jdbc/common</value> 라고 되있는 부분이 있다. 모르겠으면 검색하고 오자. 어쨌든 눈치를 보면 <value> 를 이용해 'commonDS' 라는 bean 을 생성하는 것 같으니까 <value> 에 있는 값은 DB 접속과 관련된 부분이라고 유추할 수 있다. 



기존에 사용했던 톰캣에서 server.xml 파일을 확인해보았다. 그랬더니 다음과 같은 DB 접속 코드가 존재했다.


<Context docBase="{플젝명}" path="/" reloadable="true" source="org.eclipse.jst.jee.server:{플젝명}"> <Resource driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" name="jdbc/common" 

    ~~~         ~~~ /> </Context>

참고로 해당 코드는 <Host> 안에 존재한다.


그래서 해당 코드를 새로 설치한 톰캣에 server.xml 에 그래도 넣어줬더니 해결~


그리고 <Context> 에서 path="/" 로 설정해주었기 때문에 localhost:8080 이런 식으로 바로 접속 할 수 있다.



반응형