728x90
반응형

 

이전에 Spring Boot + Gradle 프로젝트를 Jar로 배포하는 방법을 알아보았습니다.

 

하지만 Spring Boot 에선 Jar로 배포시 JSP 사용이 불가하고 webapp 폴더를 무시한다고 합니다.

 

그렇다면 국내 솔루션 업체들이 license 를 제공하는 방식이 WEB-INF 안에 파일유무를 체크하는데 

 

Jar 로 배포하면 사용하지 못한다는게 현실입니다.

 

https://gigas-blog.tistory.com/114

 

[Spring] Spring Boot 2.0 Gradle Jar 배포

Spring Boot 의 강점은 내장 서버가 있어 실행 가능한 Jar 파일을 만들어 배포가 쉽습니다. Spring Boot의 많은 의존성 Library 와 사용자가 추가한 Library 를 하나의 Jar파일로 패키징 해준다는게 정말 대단한것..

gigas-blog.tistory.com

 

 

 

 

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 설정에 대해서 알아보겠습니다.

 

728x90
반응형

+ Recent posts