10. AWS EC2 + Spring boot (6) - war 파일 tomcat 실행 에러

2021. 2. 24. 06:43프로젝트/Salle(살래) 중고거래 웹

이전 글에서 tomcat web application 매니저 GUI를 통해 WAR 파일을 deploy하고 실행시켰을 때 뜨는 에러를 vi(nano) tomcat.../logs/catalina.out 파일을 열어 로그를 확인해보았습니다. 해결하려는 과정에서 잘 되지 않은 부분도 있었고 근본적인 해결책이 있었다는 것도 알 수 있었습니다.

프로젝트를 만들 때, 프로그래밍 언어, Framework 디자인 패턴은 물론이고 그외 기술스펙 설정(DB, API, Library)와 서버 배포방식(AWS, Docker, Git...)은 만들면서 정하는 것이 아니라 처음부터 청사진을 설계하고 구현을 시작해야 효율적인 코드가 나오며 건축 중에 재설계 하는 비효율이 없을 거라는 것을 경험을 통해 알게 되었습니다.

 

발생한 에러 정리


H2.driver unregister error

catalina(톰캣 서버의 servlet) 로그를 확인해보니 h2.driver unregister error가 찍혀있었다. Spring boot application이 실행되면 h2 드라이버가 자동으로 다시 unregister 되어야 하는데 남아있어 생긴 오류였다. Stackoverflow에 답변이 있어 그대로 따라 해결할 수 있었다. Main 클래스에 수동으로 unload() 되는 메서드를 선언해주는 방법이다. 아래 링크 참고

https://stackoverflow.com/questions/61253876/spring-boot-memory-leak-h2-database-does-not-unregister-driver

 

Spring Boot - Memory Leak - H2 Database - Does not unregister driver

Completely reworked due to new information: Initial problem: JBoss killed itself with "OutOfMemoryError: Metaspace", when redeploying a simple Spring Boot app (2.2.6) multiple times Usi...

stackoverflow.com

 


JAR file error Missing TLD(Tag Library Descriptor)

JSP파일에 쓰이는 태그 라이브러리가 JAR 파일에 누락됐다는 에러. 구체적인 파일명이 명시되어 있지 않아 자세한 error log를 봐야됐다. Tomcat logging.properties 설정을 만지면 좀 더 자세한 log 내용을 볼 수 있다. 이 답변도 Stackoverflow 참고. 모르는 기술을 빨리 배우려면 원어 읽을 일이 많아질 것 같아서 되도록 영문 검색을 하고 있다. 참고로 comment(주석처리) uncomment(주석해제) 얼핏보면 uncomment가 코드를 비활성화 하는 의미같다. 그 반대니 참고!

https://stackoverflow.com/questions/12905001/at-least-one-jar-was-scanned-for-tlds-yet-contained-no-tlds

 

At least one JAR was scanned for TLDs yet contained no TLDs

I keep getting this on tomcat 7.30 (eclipse juno) At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scan...

stackoverflow.com

 


H2 DB datasource.url 설정오류

DB를 H2로 사용했는데, 이유는 console로 조작이 가능하고 메모리를 적게 차지해 테스트용으로 적격이기 때문이다. 하지만 프로젝트를 서버에 배포하는 과정에서 그 장점이 제약으로 작용하는 것 같다. 최적화가 덜 되어 있어 그런지 몰라도 작은 에러들이 발생한다. 에러내용은 이와 같다.

org.h2.message.DbException: Log file error: "/opt/h2.trace.db", cause: "java.io.FileNotFoundException: /opt/h2.trace.db (Permission denied)" \[90034-200\

구글링을 총 동원해 h2를 ubuntu에 설치하고, home 디렉터리를 변경해보고, chown, chmod로 권한 설정을 바꿔주고, ./h2.sh 파일을 쉘에서 실행시켜 브라우저로 띄워보려는 등 여러가지를 해봤는데 하나도 안됐다. 결국 application.properties에서 h2 설정을 모두 지우고 난 다음 해보니 실행됐다. 결국 에러의 원인은 ubuntu의 권한도 h2 미설치도 아닌 잘못된 Spring boot application 내부 h2 spring.datasource.url 설정이 일으킨 문제였다.

수정한 상태의 WAR파일은 서버에 실행되지만 h2 console에서 url 접근이 안되고 있는 상태다. 이렇듯 에러 때문에 H2 보다 AWS RDS로 이관해 외부 친화적인 방향으로 개선시킬지 고민중이다. 일단 지금은 WAR파일을 제거하고 재업로드하는 tomcat application manager 방식이 비효율적이라 git을 install해 쉘에서 바로 업로드 하고 제거하는 JAR 파일 방법을 시도해보고 있다.


개발을 잘하려면, 시간을 아끼려면

이 방법 밖에 없나? 왜 이 방법을 쓰고 있나?라는 질문을 끊임없이 해야한다. 그래야 더 나은 서비스 구현방식을 찾을 수 있고 효율화, 자동화를 이룰 수 있다고 생각한다. 안정적이고 클라이언트 친화적인 서비스를 만들기 위해 개발자가 가져야할 자세. 에러가 났을 땐 서칭을 통해 가설을 세우고 서칭은 어떤 키워드로 얼마나 시간을 투자할 것인지 정해놓고 하는게 시간 낭비를 줄일 수 있다.

개발 = 가설에 따른 실험 + 새로운 기술을 빨리 습득할 수 있는 효율화, 자동화할 수 있는 방법을 찾기