Spring boot로 개발하고 WAR로 배포하기

Kai·2024년 9월 20일
0

스프링

목록 보기
18/18

☕ 개요


요즘 개발되는 거의 모든 Spring 프로젝트는 Spring boot + 내장 WAS 조합을 사용할 것이다.
하지만, 현실적인 조건 때문에 외장 WAS를 사용해야하는 경우가 있을 수 있다. 이런 경우 부득이하게 War로 배포를 해야하는데, Spring boot를 사용하면 Jar 배포가 기본적으로 적용되기 때문에 War로 배포하기 위해서는 추가적인 설정이 필요하다.

개발할 때는 내장 WAS를 써서 편리하게 개발하고, 배포할 때는 외장 WAS를 사용하도록 하는 방법에 대해서 빠르게 알아보자! 🚀


🐘 build.gradle


1) war 플러그인

plugins {
    id 'war'
    ...
}

war {
    archiveFileName = '{War 파일 이름}.war'
}

...

War 빌드를 위해서 war 플러그인을 사용하였고, 추가적인 설정들도 위와 같이 작성해주었다.

war플러그인에서 War 파일 빌드 방법은 내장/외장 WAS 사용이 모두 가능한 bootWar 명령어와 외장 WAS만 사용 가능한 war 명령어가 제공되는데, 글에서는 war 명령어를 사용해서 War 빌드를 하도록 하겠다.

2) WAS 관련 설정

...
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
...

톰캣 WAS를 런타임 시에만 선택적으로 사용하도록 하기 위해서 providedRuntime으로 라이브러리를 명시해주었다. providedRuntimewar 플러그인에 포함되어 있는 키워드인데, War로 빌드한 결과물에는 해당 패키지를 포함시키지 않도록 해주는 키워드이다.

이 설정을 해주지 않아도 기능적으로는 문제가 없으니, 이 설정을 해주면 War 빌드에 내장 WAS와 관련 파일들이 아예 포함되지 않아서 빌드 사이즈가 4~5MB 정도 줄어든다는 장점이 있다.


🧙‍♂️ SpringApplication 클래스 수정


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;

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

SpringBoot 애플리케이션 클래스에 SpringBootServletInitializer를 상속받고, configure 메서드를 상속받아서, 위와 같이 코드를 작성해주자.

이러한 처리를 해주는 이유는 기본적으로 제공되는 내장 톰캣 Servelt 환경이 아닌, 다른 Servlet 환경을 사용하기 위함이다. 우리는 외장 WAS를 사용해야하므로, 이러한 설정을 해준 것이다.


🍀 테스트


애플리케이션 환경

  • Jdk 8
  • IDE: 인텔리제이
  • Spring boot: 2.7.18
  • Gradle: 8.10 (Wrapper)

이제 모든 준비가 완료됐으니, 원하는대로 잘 동작하는지 확인해보자.

1) 로컬에서 실행

인텔리제이를 통해서 실행했고, 당연하게도 정상적으로 애플리케이션이 실행되는 것을 확인할 수 있다.

2) 외장 톰캣을 사용한 War 실행

1. 외장 톰캣 실행

services:
 tomcat:
   container_name: tomcat
   image: tomcat:8.5
   ports:
     - "8080:8080"

먼저 위와 같이 docker-compose.yml을 작성하고, 톰캣 컨테이너를 실행해주자.

docker compose up -d

2. War 빌드

그리고, Gradle Task 또는 ./gradlew war 명령어를 통해서 War로 빌드해주자.

3. 컨테이너에 War 배포

docker cp ./build/libs/{War 파일 이름}.war tomcat:/usr/local/tomcat/webapps/

그리고, 위 명령어를 통해서 컨테이너의 정해진 경로에 War를 전달하자.

4. 동작 확인

컨테이너의 로그를 확인해보면, 서버 애플리케이션이 정상적으로 동작한 것을 확인할 수 있다.

🙏 참고


0개의 댓글