!! 중요: 설치할 때 버전 확인을 잘 해야한다. 버전에 따라 Servlet, JSTL, EL, JDK 버전이 다르기 때문에 내가 어떤 버전의 톰캣을 사용할 지 알고있어야 한다. ("Which version?"에 나와있다.)
나는 Tomcat 9를 사용했다.
Tomcat 10 부터는 Java EE가 아닌 Jakarta EE 패키지를 사용하기 때문에 이식성이 높지 않다고 생각했다.
물론 Migration Tool이 있다고는 하지만 Migration Tool 관련 문서를 참고할 시간에 그냥 Tomcat 9 쓰는게 낫다고 판단했다.
설치 과정은 그냥 zip 파일 다운 받아서 압축 해제 하면 된다.
# intelliJ 프로젝트 생성
intelliJ 버전: 2020.03.1
## File → new → project → Java Enterprise
Project template는 Web application, REST service, Library가 있는데 Web application을 선택, 다른 template은 사용해보지 않았다.
Application Server는 설치한 Tomcat의 경로로 설정해주면 된다.
Build tool은 더 익숙하기도 하고 편하기도 한 Gradle 선택
## Java EE (Jakarta EE), Libraries and Framework
Tomcat 9를 사용하기 때문에 Jakarta EE가 아닌 Java EE를 선택했고, 간단하게 톰캣 연동과 마이바티스만 추가할 것 이기 때문에 별도의 라이브러리나 프레임워크는 선택하지 않았다. (Servlet은 기본 선택인듯 하다)
이후 Name, Group, Location 등 설정 후 Finish
# Tomcat 설정
프로젝트 빌드가 성공적으로 된다면 build.gradle, Servlet, jsp 파일이 생성되어 있을 것이다.
나는 이전에 톰캣 Configuration을 추가해서 저렇게 있지만 없다면 직접 추가하면 된다.
Edit configurations 선택
## 톰캣 Run/Debug Configuration 추가, 설정
Tomcat Server → Local 선택
처음 선택하면 아래쪽에 "Warning: No artifacts marked for deplyment"가 있다. artifact를 추가해주기 위해 Deployment 탭으로 이동한다.
Artifact 선택
war 와 war (exploded)가 있다.
war (Archive)
아카이브(.war, .ear) 파일로 배포
WAS(Tomcat)에 의해 압축이 풀린다.
파일이 많은 경우 압축을 푸는 시간이 오래 걸릴 수 있다.
원격 서버에 배포시 하나의 파일만 전송하면 된다.
WAS에서 제공하는 업로드를 통한 배포가 가능하다.
exploded (Expended)
아카이브를 압축 해제한 형태의 디렉토리로 배포
별도의 디렉토리에 원본 소스를 복사하여 만든다.
압축 및 해제 과정이 불필요하다.
원본 소스를 건드리지 않고 배포하는 경우에 적합하다.
나는 exploded를 선택했다.
Application context가 길게 쓰여있는데 그대로 사용해도 되지만 나는 / (root)로 변경 후 설정 완료했다.
# 서버 실행
이제 서버를 실행 해보자
실행해보면 로그가 쭉 뜨다가 완료되었다고 뜬다.
근데 이상하다. 보통 다른 블로그 참조했을 때는 실행이 완료되었다고 뜨면서 자동으로 브라우저가 실행되던데.. 브라우저가 실행되지도 않고 밑의 창을 자세히 보면 주황색 X 아이콘이 보이고 로그도 not found for the web module이라고 뜬다. 뭔가 잘못 된 것 같다.
localhost:8080으로 접속해봐도 index.jsp가 나오지 않고 404페이지가 나온다.
# Artifact를 다시 한 번 보자
연필모양 눌러보면 artifacts settings 창이 나온다
저 경로를 자세히 보면 project/build/libs/exploded/project~~~.war로 되어있다.
근데 실제 경로를 확인해보면 libs디렉토리 내에 exploded라는 디렉토리는 없고 바로 project~~~.war만 있다. 그러므로 libs뒤에 있는 exploded를 지워준다.
# 수정 후 서버 다시 실행
not found the web module이라는 로그도 안보이고, 브라우저도 자동으로 실행된다.
# Artifact를 exploded로 선택한 이유
exploded가 아니라 war를 선택한다면 위 설정(경로에 exploded 빼는 것)할 필요없이 잘 된다. 근데 exploded를 선택한 이유는
바로 요놈 때문이다.
자바 코드가 변경되면 (클래스, 패키지, 라이브러리 등) 서버를 재시작 해야한다.
이것은 내장톰캣 쓸때도 마찬가지였기 때문에 상관 없는데
문제는 resource(html, jsp, css 등)도 바로 적용이 안된다는 것이다. 내장 톰캣 쓸 때는 바로 적용이 되었는데.. 외장 톰캣을 쓰니 바로 적용이 안되어서 매우 불편했다.
찾아보니 exploded로 deployment 설정을 해야 저 on update → update classes and resources가 생긴다고 하더라.
그래서 exploded를 사용했다.
# 후기(?)
그냥 내장 톰캣 쓰는게 나을 것 같다 ㅋㅋ;; 어짜피 스프링부트도 내장 톰캣 사용하는데.. 스프링은 아닌가?