이클립스에서 톰캣 사용하는 방법 / 톰캣 에러 해결
이클립스에서 톰캣 사용 방법
윈도우 톰캣 설치
https://tomcat.apache.org
프로젝트에 맞는 버전의 톰캣 선택 > 64-bit Windows zip으로 다운로드 > 압축 해제하면 설치 완료입니다.
이클립스에 톰캣 연동 방법
이클립스 하단 Servers 탭 내부 우클릭 > New > Server > Apache > Tomcat v(설치한 버전) Server 선택 > Next > Tomcat installation directory: Browse…를 통해 설치한 톰캣 폴더 선택 > JRE: 프로젝트에 맞는 버전의 JRE 선택 > Finish
톰캣에 프로젝트 추가 방법
이클립스 하단 Servers 탭에서 톰캣 우클릭 > Add and Remove… > Available: 목록의 프로젝트 더블클릭 > 프로젝트가 Configured: 목록으로 이동한 것 확인 > Finish
톰캣 프로젝트 Path 변경 방법
이클립스 하단 Servers 탭에서 톰캣 더블클릭 > 하단 Modules 탭 > Web Modules 선택 > Edit… > Path : /로 수정 > OK : Ctrl + S로 저장
톰캣 경로 수정 방법
Windows > Preferences > Server > Runtime Environments > 톰캣 선택 > Edit > Browse > 톰캣 폴더 선택 > Finish > Apply and Close
프로젝트에 톰캣 라이브러리 추가 방법
프로젝트 우클릭 > Java Build Path > Libraries > Add Library > Server Runtime > Next > 이클립스에 연동한 Apache Tomcat v(버전) 선택 > Finish 합니다.
톰캣 설정 방법
server.xml DB 설정 방법
<Resource auth="Container" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" driverClassName="com.mysql.cj.jdbc.Driver" global="jdbc/DB명" maxTotal="400" maxIdle="400" maxWaitMillis="30000" name="jdbc/DB명" type="javax.sql.DataSource" url="jdbc:mysql://DB서버IP또는도메인:3306/DB명?characterEncoding=UTF-8&allowMultiQueries=true" username="DB계정명" password="DB계정비밀번호" statementTimeout="30" validationQuery="select 1" testOnBorrow="true" testOnReturn="false" testWhileIdle="true" timeBetweenEvictionRunsMillis="60000" minEvictableIdleTimeMillis="300000" />
위와 같이, <GlobalNamingResources> 태그 내부에 DB 리소스를 입력합니다.
개발 DB 정보를 쓰면 개발 DB에 연결되고, 운영 DB 정보를 쓰면 운영 DB에 연결됩니다.
server.xml 프로젝트 경로 설정 방법
<Context docBase="프로젝트폴더명" path="URL시작경로" reloadable="true" source="org.eclipse.jst.jee.server:프로젝트명"/>
server.xml 최하단 Engine 태그 안에서는 Add 한 프로젝트 Context 정보가 맞는지 확인합니다.
프로젝트 Context는 Add 시 최하단 </Host> 위에 자동 생성되며, path를 /로 변경해주면 localhost:HTTP포트만으로 접근 가능합니다.
context.xml 설정 방법
<ResourceLink global="jdbc/DB명" name="jdbc/DB명" type="javax.sql.DataSource"></ResourceLink>
최하단 </context> 위에 DB 리소스 링크를 입력합니다.
이클립스 톰캣 에러 해결 방법
Add and Remove 시 에러
There are no resources that can be added or removed from the server.
위 팝업이 나오면, 추가하거나 삭제할 프로젝트 리소스가 없다는 뜻입니다.
<Context docBase="프로젝트폴더명" path="URL시작경로" reloadable="true" source="org.eclipse.jst.jee.server:프로젝트명"/>
톰캣 server.xml 최하단 </Host> 위에 위와 같이 프로젝트 Context를 직접 추가하고 이클립스 workspace 폴더의 .metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps 폴더 안에 프로젝트명\src\main\webapp 폴더와 유사한 폴더를 넣으면 실행은 되는데, jsp 수정 반영이 안됩니다.
이클립스와 톰캣을 아예 새로 설치하고 다시 Add 해주니까 잘 됩니다.
톰캣 실행 시 에러
Context 정보가 프로젝트 폴더와 매핑이 안되는 에러
server.xml에서 Context 태그의 docBase, source 정보가 맞는지 확인합니다.
DB 연결이 안되는 에러
SEVERE: 자식 컨테이너를 시작 중 실패했습니다.
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 구성요소 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]을(를) 시작하지 못했습니다.
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:873)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:794)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:140)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:248)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:433)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:921)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
server.xml에서 Resource 태그의 DB 정보와 context.xml의 ResourceLink 정보가 맞는지 확인합니다.
DB 정보가 맞는데도 에러가 나서 Maven update 후 다시 시도했더니 톰캣 실행이 잘 되었습니다.
톰캣 시작 시간 초과 에러
Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
프로젝트 톰캣 실행 시 DB에서 많은 정보를 불러오거나 읽을 라이브러리가 많은 경우 시간 초과가 날 수 있습니다.
Servers 탭 > 톰캣 더블 클릭 > Overview > Timeouts > Start 시간을 180초로 변경하면 됩니다.
운영 중 DB 연결 실패 에러
Communications link failure The last packet successfully received from the server was 4,708,795 milliseconds ago. The last packet sent successfully to the server was 4,708,796 milliseconds ago.
톰캣 JDBC 커넥션 풀이 세션이 종료된 커넥션을 재사용하면서 발생하는 문제입니다.
MySQL 서버가 wait_timeout 시간이 지난 세션을 종료해도, 커넥션 풀은 비활성화된 커넥션을 감지하지 못합니다.
DB 연결 실패 방지 설정
SHOW VARIABLES LIKE 'wait_timeout';
위 쿼리로 DB wait_timeout 시간을 확인하고, 이보다 짧게 트리거를 설정하는 것이 좋습니다.
톰캣 server.xml DB Resource 설정 수정 시 톰캣 재기동 해야 반영이 됩니다.
validationQuery="select 1"
testOnBorrow="true" <!-- 쿼리 실행 전 validationQuery 실행 활성화 -->
testOnReturn="false" <!-- 커넥션 반환 전 validationQuery 실행 비활성화 -->
testWhileIdle="true" <!-- 주기적으로 유휴 커넥션 검사 실행 활성화 -->
timeBetweenEvictionRunsMillis="60000" <!-- 1분마다 유휴 커넥션 검사 -->
minEvictableIdleTimeMillis="300000" <!-- 5분 이상 유휴 상태인 커넥션 제거 -->
DB와 연결을 유지하고 있지만 사용되지 않고 대기 중인 유휴 커넥션 정리 설정 예시입니다.
testOnBorrow=”true”는 모든 쿼리 전 validationQuery를 실행하므로 트래픽이 많아지면 DB에 부하를 줄 수 있지만,
커넥션 풀에서 끊어진 커넥션을 즉시 걸러낼 수 있어 커넥션 실패 문제를 예방할 수 있는 가장 확실한 방법입니다.
Leave a comment