이전에 Spring Boot + Gradle 프로젝트를 Jar로 배포하는 방법을 알아보았습니다.
하지만 Spring Boot 에선 Jar로 배포시 JSP 사용이 불가하고 webapp 폴더를 무시한다고 합니다.
그렇다면 국내 솔루션 업체들이 license 를 제공하는 방식이 WEB-INF 안에 파일유무를 체크하는데
Jar 로 배포하면 사용하지 못한다는게 현실입니다.
https://gigas-blog.tistory.com/114
War는 별도의 내장 서버를 사용하지 않고 외장 서버에 배포할 수 있습니다.
예전부터 웹 서버에 반영을 해본분들은 War 배포를 많이 아시겠지만 요즘 새로 시작하시는분들은 낮설 수 있어서 알아보려고 합니다.
Sprint Boot + Gradle 프로젝트를 SpringBootTest 이름으로 생성했습니다.
생성할때 Packaging 을 War로 선택하시면 SevletInitializer.java 라는 파일이 생성됩니다.
SpringBoot 에서는 web.xml 을 사용하지 않기 때문에 이곳에서 설정이 가능합니다.
그리고 War 로 배포할때엔 여기서 main을 구축해야만 합니다.
기존처럼 SpringBootTestApplication.java 를 사용하지 않기 때문에 전체를 주석처리 하거나 삭제합니다.
개발은 내장톰켓을 사용하시는 분들은 주석처리하는게 편하실겁니다.
//@SpringBootApplication
//public class SpringBootTestApplication {
// public static void main(String[] args) {
// SpringApplication.run(SpringBootTestApplication.class, args);
// }
//}
ServletInitializer class 에 @SpringBootApplication 어노테이션을 추가합니다.
configure 함수의 SpringBootTestApplication.class 에서 SevletInitializer.class 로 수정하고, main 함수도 정의해주겠습니다.
Java 에서의 설정은 이것으로 마무리 하고 Gradle 설정을 해보겠습니다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
// War
@SpringBootApplication
public class ServletInitializer extends SpringBootServletInitializer {
// DevTool
// @Override
// protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
// return application.sources(SpringBootTestApplication.class);
// }
// War Packaging
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ServletInitializer.class);
}
public static void main(String[] args) {
SpringApplication.run(ServletInitializer.class, args);
}
}
build.gradle 파일을 열어서 War plugin을 추가해줍니다.
plugins {
id 'war'
}
// or
apply plugin: 'war'
build.gradle 에서 War 생성관련 설정을 할 수 있습니다.
Name 과 Version, File Name 등을 설정할 수 있으며 따로 설정이 없다면 프로젝트명 + Version 이 붙어서 생성됩니다.
bootWar {
archiveBaseName = '-'
archiveFileName = '-.war'
archiveVersion = "0.0.0"
}
그리고 외부 톰캣을 사용한다는 providedRuntime 을 설정해주어야합니다.
기존에 사용하던 runtimeOnly 'org.springframework.boot:spring-boot-devtools' 이부분은 주석처리하거나 제거해주면 됩니다.
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
준비는 끝났으며 War 를 만들어줍니다.
CLI 터미널에서 명령어로 생성해보겠습니다.
만들어준 SpringBootTest 경로로 들어갑니다.
Spring Boot 를 War로 생성하기 때문에 bootWar 명령어롤 통해 War 를 생성합니다.
빌드가 성공하면 프로젝트 경로로 들어가서 확인할 수 있습니다.
build > libs 안에 War 파일이 생성됨을 알 수 있습니다.
IntelliJ 에서는 Gradle 탭에서 간단하게 생성이 가능합니다.
Tasks > build 안에 실행가능한 bootWar 스크립트를 더블클릭하면 됩니다.
정상적으로 실행이 되면 아래와 같은 문구가 보여질 것입니다.
War 파일을 생성했으니 실행하는 방법을 알아보겠습니다.
서버와 마찬가지로 로컬에도 톰캣을 돌려서 실행할 수 있습니다.
저는 Tomcat 9 를 설치한 다음 webapps 폴더 안에 .war 를 넣어주었습니다.
Deploy 절차를 진행하기 위해 Tomcat을 새로 시작하겠습니다.
터미널 에서 tomcat 이 설치된 경로에서 bin파일로 진입합니다.
많은 실행파일이 있지만 shutdown.sh 와 startup.sh 파일을 사용해서 tomcat 서버를 종료하거나 실행하면됩니다.
tomcat 종료 ./shutdown.sh
tomcat 실행 ./startup.sh
정상적으로 오류없이 서버가 동작하였습니다.
Tomcat 을 실행하면 war 파일을 Deploy 하여 폴더가 만들어지게 됩니다.
잘 로드 되는지 확인해보겠습니다.
war 파일명으로 폴더가 생성되기때문에 조금 긴 접속 경로가 설정되었네요.
http://localhost:8080/SpringBootTest-0.0.1-SNAPSHOT/
페이지는 따로 만들지 않았기 때문에 아래와 같이 나온다면 정상적으로 War 배포가 된것을 확인할 수 있습니다.
War로 배포했을때 ContextRoot 경로때문에 정보가 잘 나오지 않을 수 있습니다.
다음글에선 ROOT 설정에 대해서 알아보겠습니다.
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Thymeleaf Template 를 사용한 JavaMailSender (0) | 2019.04.28 |
---|---|
[Spring] Spring Boot Hibernate dialect (0) | 2019.04.25 |
[Spring] IntelliJ Lombok Plugin 설치 (0) | 2019.04.24 |
[Spring] Spring Boot 2.0 Gradle Jar 배포 (0) | 2019.04.23 |
[Spring] Spring Boot 2.0 Error Custom Page NEW (0) | 2019.04.23 |