<청춘> 격정적으로 사는 것

밤을 새고 공부한 다음 날 새벽에 느꼈던 생생한 환희와 야생적인 즐거움을 잊을 수 없다

BOOK REVIEW/실전 스프링 부트 워크북

[실전 스프링 부트 워크북] CH12 스프링 부트 배포 - JAR 만들기 & WAR 만들기

수학도 2021. 8. 19. 21:27

1. 프로젝트를 단독형 앱 형태로 배포해보자 - JAR 만들기

스프링 부트로 실행 가능한 JAR 파일을 만드는 방법은 기본적으로 자바와 같다.

하지만 main  메서드가 위치한 클래스를 알아서 찾아내고 앱 생성에 필요한 모든 코드를 자동으로 생성하므로 훨씬 간단하다.

 

패키징

$ ./mvnw package

위의 메이븐 명령어를 실행하면 target/spring-boot-journal-0.0.1-SNAPSHOT.jar 파일이 생성된다.

  • JAR 파일 안에서 의존체를 모조리 쓸어 담는다.
  • 앱 관련 정보는 MANIFEST.MF 파일에 넣는다.
  • 앱을 시작하는 메인 클래스는 Main-Class 및 Start-Class에 자동 세팅된다.

 

실행

만들어진 JAR 파일은 아래 명령으로 실행한다.

$ java -jar target/spring-boot-journal-0.0.1-SNAPSHOT.jar

 

이 파일을 다른 사람에게 보내 서드파티 라이브러리 없이도 돌려보게 할 수 있다.

 


2. 실행과 배포 가능한 WAR 만들기

 

pom.xml (또는 build.gradle) 파일에서 두가지만 수정하면 된다.

  1. <packaging> 태그값을 jar에서 war로 변경한다. (그레이들은 war 플러그인을 적용한다.)
  2. spring-boot-starter-tomcat 의존체를 추가하고, scope를 provided로 세팅한다. (그레이들은 configurations 섹션명을 providedRuntime으로 바꾼다.)

 

톰캣 의존체는 전부 spring-boot-starter-web 폼에서 내려받기 때문에 이전 폼 파일에는 없었는데, WAR 파일을 만들기 위해서는 따로 추가해주어야 한다. 따로 추가한 후 앱을 패키징하면 '팻JAR' 내부에서 전체 라이브러리는 WEB-INF/lib에, 톰캣 라이브러리는 WEB-INF/lib-provided에 따로 모인다. 이렇게 해야 컨테이너가 탑재된 단독형 앱을 확장 가능한 형태로 유지할 수 있다. 

WEB-INF/lib에 추가한 라이브러리는 모두 컨테이너 차지라서 톰캣 라이브러리를 여기에 넣으면 JAR 파일이 충돌하면서 컨테이너가 시동 실패한다. 따라서 스프링 부트에서는 WEB-INF/lib-provided라는 공간을 따로 만들어 톰캣 라이브러리를 담은 것이다.

 

 

패키징

$ .mvnw clean package -DskipTests=true

-DskipTests : 테스트를 건너뛰는 옵션

 

실행

$ java -jar target/spring-boot-journal-0.0.1-SNAPSHOT.war

 


3. 톰캣 기반 서버에 배포하기 (CLI)

 

1. 톰캣 기반 서버 설치

http://tomcat.apache.org/ 

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the

tomcat.apache.org

 

1. 톰캣 서버를 강력하게 만든 피보탈 tc 서버 설치 (추천)

https://network.pivotal.io/products/pivotal-tcserver 

 

Download VMware tc Server — VMware Tanzu Network

Explore, download, and update software and services.

network.pivotal.io

 

 

2. 서버 설치 경로로 가서 tcruntime-instance.sh 쉘 파일 실행

 

 

 

3. myserver라는 하위 폴더를 만들고 그 안에 8.0.30.C.RELEASE 버전의 톰캣 설치 파일을 모두 옮기기

$ ./tcruntime-instance.sh create -i . myserver -v 8.0.30.C.RELEASE

 

 

4. myserver/webapps 폴더에 spring-boot-journal-0.0.1-SNAPSHOT.war 파일을 복사하고 이름을 journal.war로 변경

$ cd myserver
$ cd webapps
$ cp ~/pro-spring-boot/ch12/spring-boot-journal/target/spring-boot-journal-0.0.1-SNAPSHOT.war ./journal.war

 

 

5. MYSQL 서버 시동

 

 

6. bin 폴더에서 tc 서버 켜기

$ cd
$ cd bin
$ ./tcruntime-ctl.sh start

 

 

7. tc 서버 로그를 보기 위한 명령

$ tail -f ../logs/catalina.out

 

 

8. http://localhost:8080/journal 접속

 

 


톰캣 기반 서버에 배포하기 (STS IDE)

피보탈 tc 서버가 내장되어 있기때문에 별도 설치 x

 

1. Servers 뷰에서 Pivotal tc Server Developer Edition v3.2 > Add and Remove

 

2. spring-boot-journal 선택 > Add > Finish

 

3. 기본적으로 컨텍스트 경로는 프로젝트명과 동일하게 세팅된다. 컨텍스트 경로를 /journal로 줄이려면 Package Explorer 창의 Servers 섹션에서 server.xml의 다음 코드를 찾아 path를 수정한다.

<Context docBase="spring-boot-journal" path="/journal" reloadable="true" .../>
</Host>

 

4. Servers 뷰 오른쪽 서버 실행 아이콘을 클릭하여 tc서버 시동

 

5. http://localhost:8080/journal 접속

 


스프링 부트 앱을 단독형으로 실행하는 것과 tc 서버에 배포/실행하는 것은 무슨 차이일까?

단독형 앱으로 실행할 때는 https://localhost:8443 URL로 SSL 접속을 하지만, tc 서버에 배포할 때는 SSL/HTTPS를 사용하지 않는다. 컨테이너에 배포할 때는 단독형으로 실행할 때만 유의미한 프로퍼티를 스프링 부트가 알아서 누락시키기 때문이다. 따라서 톰캣 서버에 보안을 적용하려면 다른 방법을 사용해야 한다.