[Java] 인텔리제이에서 Maven 기반 프로젝트를 Tomcat 에 배포하기

개요top

무료 개발통합도구인 인텔리제이 커뮤니티에서 Maven 기반 스프링 애플리케이션을 외부에 구축된 Tomcat 서버에 배포하는 한가지 방법을 소개합니다. CI(지속적 통합)를 쓰지 않고 Maven만으로 외부 Tomcat에 배포를 쉽게 할 수 있도록 할 것입니다.

1. 실습 준비top

먼저, 다음 2개의 글을 보고 실습 준비를 해야합니다.

찬찬히 읽어보시고 내용대로 해보시는 조건에서 다음 내용을 따라할 수 있습니다.

2. 톰켓 관리자 도구로 WAR 배포하기top

서블릿, 서블릿 컨테이너, 그리고 서블릿 컨테이너인 톰켓에 대해서 간단하게 소개하고 톰켓에서 제공하는 앱 관리자 웹페이지를 통해 WAR를 배포하는 방법을 소개하겠습니다.

2.1 서블릿과 서블릿 컨테이너

서블릿(Servlet)은 javax.servlet.Servlet 인터페이스 구현체이며 서블릿 컨테이너(Servlet Container)에서 생성, 호출, 소멸 관리됩니다. 서블릿 컨테이너는 네크워크 통신, 서블릿의 생명주기 관리, 스레드 기반의 병렬처리등을 자동으로 하며, 웹 클라이언트로 부터 HTTP 요청을 해석하여 적절한 서블릿의 service 메서드를 ServletRequet, ServletResponse 매개변수와 함께 호출해 주는 역할들을 하게 됩니다.

2.2 서블릿 컨테이너, 톰켓

톰켓(Tomcat)은 서블릿 컨테이너 구현체 중 하나입니다. 개발자가 Java로 제작한 서블릿을 WAR로 압축하여 Tomcat의 웹 애플리케이션 루트인 tomcat/webapps 디렉토리에 이 WAR를 올리면 톰켓이 자동으로 압축을 풀어 서블릿으로 등록하고 관리해줍니다(참고로 자동 압축 풀기는 톰켓 옵션으로 설정할 수 있습니다).

2.3 톰켓 앱 관리자 활성화

WAR를 tomcat/webapps에 올리기만 하면 되기 때문에, FTP로 myapp.war를 올리면 톰켓이 자동으로 압축을 풀어 앱으로 등록합니다. 그럼 http://{주소}:{포트}/myapp 으로 접근이 가능하게 됩니다. 그러니 FTP도 WAR 배포수단이 될 수 있습니다.

다른 방법으로 톰켓 애플리케이션 관리자 도구로도 배포할 수도 있습니다. 지금부터 이 관리자로 WAR 파일을 업로드해서 배포하는 방법을 소개합니다.

위 화면은 톰켓 설치후 실행한 다음 브라우저에서 접근하면 나오는 웹페이지 입니다.

터미널에서 /tomcat/webapps 디렉토리 내부를 보면 ROOT, docs, examples, host-manager, manager 등이 있습니다. 위 웹페이지 화면은 ROOT를 바라보고 있는 것입니다. 즉, http://{주소}:{포트}/로 접근하면 ROOT에 라우팅하는 것이지요. 예상할 수 있겠지만 ROOT.war를 여기에 복사하면 톰켓은 이 WAR파일을 자동으로 압축을 풀고 기존 ROOT를 대체하게 됩니다.

/tomcat/webapps에 있는 host-manager, manager등도 각각 http://{주소}:{포트}/host-manager, http://{주소}:{포트}/manager 등으로 접근하면 됩니다. 마찬가지로 manager.war, docs.war를 /tomcat/webapps/ 폴더에 배포하면 압축을 풀며 기존의 host-manager와 manager폴더가 대체되는 식이지요. 이때 톰켓을 재실행할 필요 없습니다.

하지만 ROOT, host-manager, manager는 일단 건드리지 않도록 합시다. 왜냐하면 이들을 이용해서 서블릿 배포, 세션정리, 메모리누수 분석, 각종 서버상태 확인을 할 수 있기 때문입니다.

앱 관리자 페이지에 접근해 보겠습니다. 관리자 페이지는 http://{주소}:{포트}/manager 로 접근하면 되겠습니다.

하지만 위 화면처럼 403 에러가 발생하며 접근이 불가능합니다. 관리자 페이지에 접근하기 위해서는 톰켓에 있는 conf/tomcat-users.xml에 role과 user 정보를 셋팅을 해야함을 위 화면 빨간박스 부분에서 보여주고 있습니다.

관리자 페이지에 접근할 수 있도록 권한을 부여해 보겠습니다.

먼저 터미널에서 vim /tomcat/conf/tomcat-users.xml로 접근해 봅니다. (vim이 설치되어 있고 vim 사용법을 알고 있다는 전재로 설명합니다.)

그럼 위 화면을 볼 수 있습니다. <tomcat-users> 태그 안에 다음 코드를 입력하겠습니다.

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="s3cret" roles="manager-gui,manager-script"/>

위 화면처럼 입력합니다. role은 manager-gui를 관리자 기능을 웹페이지에서 볼 수 있게 합니다. 그리고 manager-script는 war파일을 관리자를 통해 업로드 배포가 가능하도록 합니다. 그리고 사용자로 tomcat(비밀번호 s3cret)을 등록했고 주어진 role인 memager-gui, manager-script를 사용할 수 있도록 했습니다. 저장 후 나갑니다.

한가지 더 할 일이 있습니다. 현재 상태에서는 localhost나 127.0.0.1 에서만 접근이 가능합니다. 그러므로 로컬이 아닌 원격지에서도 접근이 가능하게 하려면 한가지 더 설정해야 합니다. 해보겠습니다. /tomcat/conf/Catalina/localhost/에 manager.xml을 만들고 아래 내용을 입력합니다.

<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
        <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$"/>
</Context>

이 설정에서 원격지에서 접근할 수 있도록 허용한 부분은 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$"/>입니다. allow로 정규식 ^.*$를 주었기 때문에 전체 접근 허용을 한 것입니다. 보안상 위험한 일이나 일단 테스트니 넘어갑니다.

톰켓 관리자를 사용하기 위한 설정을 완료했습니다.

이제 톰켓을 재구동하고 관리자 페이지에 접근해 보겠습니다.

위 화면처럼 shutdown.shstartup.sh를 터미널 창에서 실행해서 톰켓을 재시작할 수 있도록 합니다.

http://{주소}:{포트}/manager에 접근해보겠습니다. 그럼 위와 같은 화면을 볼 수 있습니다. 방금전 manager-gui role를 부여받은 유저인 아이디 tomcat와 비밀번호 s3cret를 입력하세요. 그럼 다음과 같은 화면을 보실 수 있습니다.

Application 항목에는 서블릿 ROOT와 docs, examples, host-manager, manager가 구동중임을 알 수 있습니다. 그리고 아래부분에 Deploy항목이 있고 WAR file to deploy 가 있습니다.

여기서 파일업로드 기능으로 WAR 파일을 올리면 자동 배포가 됩니다.

2.4 톰켓 관리자 웹페이지에서 war 올려보기

실제로 톰켓에 WAR를 올려보겠습니다.

위 사이트의 내용 실습을 마쳤다고 가정하겠습니다.

먼저 인텔리제이에서 위 화면처럼 Edit Configuration을 선택합니다.

위와 같은 팝업창이 뜨면 왼쪽 상단의 + 버튼을 누르고 Maven을 선택하세요.

그리고 오른쪽 화면에서 Name과 Command line에 각각 complie war, compile war:war를 입력합니다. 그리고 OK 버튼을 눌러 저장합시다.

방금 만든 설정(compile war)을 선택하고 실행하세요.

위와 같은 콘솔로그를 보셨다면 빌드 성공하고 war를 생성한 것입니다.

위 화면과 같이 생성된 war는 bsspring-0.1.war이름으로 프로젝트의 target폴더 내에 있습니다. war의 파일 이름은 pom.xml에서 artifactId를 bsspring, version을 0.1로 해서 이 조합으로 만들어진 것입니다.

참고로, pom.xml의 build 태그 내에 finalName 태그를 넣어 컴파일하면 이 이름으로 war 파일이 생성됩니다.

자, 생성한 myproject.war를 톰켓 관리자 도구 페이지를 통해 배포해 보겠습니다.

위 관리자 페이지에서 Deploy > WAR file to deploy에서 myproject.war를 선택한 뒤 Deploy버튼을 눌러 파일업로드 해주세요.

그럼 잠시 후, 위 화면처럼 Application에 myproject가 올라와 있는 것을 확인할 수 있습니다.

웹브라우저에서 http://{주소}:{포트}/myproject/ 이나 http://{주소}:{포트}/myproject/json 으로 접근해 보세요.

위와 같은 화면이 나왔다면 성공한 것입니다.

이상으로 톰켓 관리자 웹페이지를 통해 war를 배포하는 방법을 설명했습니다.

더 자세한 내용을 공부하시려면 아래 사이트도 확인하세요.

3. 인텔리제이에서 클릭 한번으로 빌드 후 WAR를 톰켓에 배포하기top

지금까지 관리자 웹페이지에서 war를 배포하는 방법을 소개했습니다. 이제 톰켓에서 제공하는 관리자 API를 사용해 배포하는 방법을 다뤄봅니다.

3.1 톰켓에서 제공하는 관리자 명령 소개

톰켓의 관리자는 http://{주소}:{포트}/manager/text/{명령}?{인자} 형태의 명령 API를 제공합니다.

한가지 명령을 확인해 봅시다. 웹 브라우져에서 http://{주소}:{포트}/manager/text/serverinfo 로 접근해 보세요.

그럼, 위와 같이 서버 정보를 확인할 수 있습니다. 명령으로 serverinfo 를 주었기 때문에 이런 결과를 받을 수 있는 겁니다.

다른 명령을 써보겠습니다. http://{주소}:{포트}/manager/text/list로 접근해 보세요.

위 화면처럼 톰켓에 등록된 애플리케이션 목록과 각 상태를 확인할 수 있습니다.

배포는 deploy 명령으로 할 수 있습니다. http://{주소}:{포트}/manager/text/deploy?war=myproject.war 식으로 제공됩니다. 톰켓 Maven 플러그인을 사용하면 Maven으로 올릴 수 있습니다. 또한 인텔리제이에서 이 Maven을 실행할 수 있기 때문에 설정만 하면 버튼 한번 클릭으로 바로 톰켓에 빌드 후 배포를 할 수 있게 되는 겁니다.

이 명령에 대한 자세한 내용은 아래 사이트에서 확인할 수 있습니다.

Manager App HOW-TO :
https://tomcat.apache.org/tomcat-9.0-doc/manager-howto.html

3.2 Maven기반 톰켓 배포 환경 설정

인텔리제이에서 톰켓으로 배포하기 위한 환경 설정을 해보겠습니다. 먼저 프로젝트에서 pom.xml를 수정합니다.

위 화면처럼 플러그인으로 톰켓 maven을 추가합니다.

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <url>http://{주소}:{포트}/manager/text</url>
        <server>TomcatServer</server>
        <path>/${project.build.finalName}</path>
    </configuration>
</plugin>

{주소}:{포트}는 여러분 환경에 맞게 넣으세요. 그리고 server명으로 TomcatServer라고 했음을 기억합시다. pom.xml 설정은 완료 했습니다.

다음으로 settings.xml을 만들 것입니다. 사용자 폴더에 .m2 폴더가 있습니다. 윈도우라면 C:\Users\{사용자명}\.m2 정도가 되겠습니다. 여기에 settings.xml을 만들고 다음 내용을 넣습니다.

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                    https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository/>
  <interactiveMode/>
  <usePluginRegistry/>
  <offline/>
  <pluginGroups/>
  <servers>
    <server>
        <id>TomcatServer</id>
        <username>tomcat</username>
        <password>s3cret</password>
        <configuration>
            <endpointChecking>false</endpointChecking>
        </configuration>
    </server> 
  </servers>
  <mirrors/>
  <proxies/>
  <profiles/>
  <activeProfiles/>
</settings>

위 settings.xml의 servers에 server가 들어갔고 id로 TomcatServer로 했습니다. 방금전 pom.xml의 톰켓 Maven에서 서버를 TomcatServer로 한 것과 일치함을 확인하세요. 그리고 여기에 username, password로 톰켓의 conf/tomcat-users.xml에서 설정한 사용자의 이름과 비밀번호를 입력했습니다. 이렇게 해서 접속정보에서 민감한 부분은 settings.xml로 외제화 하게 되는 것입니다.

이제 한번 버튼 클릭으로 배포하도록 설정해 봅니다.

Edit Configuration으로 들어가세요.

추가를 위해 +버튼을 누르고 Maven을 선택합니다.

위처럼 name에 tomcat deploy 입력하고 Command line에 tomcat7:redeploy 를 입력합니다. 그리고 OK버튼을 눌러 등록을 완료하세요.

인텔리제이에서 Maven플러그인을 사용해 빌드 후 톰켓에 WAR를 배포할 모든 준비가 완료되었습니다.

3.3 인텔리제이에서 Maven으로 톰켓에 WAR 배포하기

인텔리제이에서 방금 Configuration에 등록한 tomcat deploy를 실행해 봅니다.

인테리제이 화면에서 실행버튼을 클릭하세요.

실행시 마지막에 위와 같은 화면이 나오면 배포가 완료된 것입니다. 화면에서 http://{주소}:{포트}/myproject를 클릭하면 바로 브라우저 창으로 톰켓에 올라간 애플리케이션 동작을 브라우저를 통해 확인할 수 있습니다.

만약 배포시 위와 같은 메시지를 봤다면 톰켓에 배포하지 못한 것입니다. 이런 경우에는 pom.xml에 설정된 url, server 그리고 settings.xml에 설정된 server, username, password, 실제 Tomcat 설정등에 문제 없나 재확인해야 합니다.

결론top

이상으로 인텔리제이 커뮤니티 무료 버전에서 개발중인 Maven 스프링 프로젝트를 한번 클릭으로 톰켓에 WAR를 배포하는 방법을 알아보았습니다. 실무에 도움되시길 바랍니다.