인텔리제이 스프링 부트 배포 WAR JAR 외부 톰캣 404 에러 처리

인텔리제이를 이용해 개발한 스프링 부트 프로젝트 배포와 외부 톰캣 구동시 404 에러 확인 결과 포스팅



솔루션

이 포스팅은 인텔리제이 스프링 부트 배포를 하는데, 자체 서버 WAS의 톰캣에 배포하는 과정에서 발생하는 404에러 처리를 하면서 느낀 부분을 정리하였습니다.

구글에서 이미 관련 검색으로 나온 솔루션을 했는데도 안됐거나 JAR와 WAR 구분 등 기본적인 것들에 대해 제가 느끼고 해결한 부분에 대해 정리하였습니다.



인텔리제이 스프링 부트 배포

이클립스에서 스프링으로 개발하다 스프링 시큐리티를 사용하지 못해 급하게 스프링 부트로 마이그레이션 작업을 진행하게 되었습니다.

그와 더불어 개발툴도 인텔리제이로 바꿨는데, 처음부터 다시 시작하는 느낌이 들었으나 금새 적응하고 이클립스보다 편한 부분들이 보여 잘 바꿨구나 싶었습니다.

어느정도 마이그레이션 작업이 끝나고, 이제 배포를 해볼 차례가 되었는데요.

배포 방법에는 몇가지가 있는 것 같은데 내가 한 방법에 내가 실패하고 성공한 방법을 정리하려고 한다.



배포 파일 확장자 JAR WAR

자바 어플리케이션을 배포할 때 나오는 JAR와 WAR 파일 확장자 이며, 압축파일의 형식으로 보입니다.

스프링 부트 기준 JAR의 경우에는 WAS인 톰캣이 내장되어 별도의 WAS에 얹거나 할 필요 없이 실행시 바로 접속할 수 있습니다.

WAR의 경우에는 별도의 톰캣 서비스의 webapps 폴더 등에 올려서 사용하는 방식으로 사용합니다.

인텔리제이 스프링 부트 배포

인텔리제이를 처음 사용해 배포 방법조차 낯설고 어렵게 느껴져 검색으로 취득한 정보들을 토대로 정리해보겠습니다.

의존성 주입 방법으로 build.gradle.kts로 코틀린 방식의 의존성 주입이라고 하는데, 같은 듯 달라 보입니다.

그리고 스프링 부트는 톰캣 같은 WAS가 포함되어 있으며, 필요시에는 이를 분리하고 배포를 해야 합니다.


build.gradle.kts 소스

'배포 작업을 위해 추가'라고 달린 부분만 이번 배포작업때 추가한 것이고 나머지는 기존에 인텔리제이 툴을 이용해 작업할 때 작성한 것들입니다.


plugins 부분에 아래의 항목을 추가했습니다. 
plugins {
id("java")
id("org.springframework.boot") version "3.0.2"
id("io.spring.dependency-management") version "1.1.0"
// 배포 작업을 위해 추가 - war방식의 배포를 사용할 수 있음
id("war")
}

dependencies에는 아래 항목을 추가했습니다.

dependencies {
// 배포 작업을 위해 추가 - 외장 톰캣 배포
providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")

// 스프링 부트 스탠다드
implementation("org.springframework.boot:spring-boot-starter-web")
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")
// 스프링 부트 스탠다드 테스트
testImplementation("org.springframework.boot:spring-boot-starter-test")

// 스프링 시큐리티
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.thymeleaf.extras:thymeleaf-extras-springsecurity6")
testImplementation("org.springframework.security:spring-security-test")

// 데이터베이스 연결
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-jdbc")
implementation("org.springframework.boot:spring-boot-starter-data-jdbc")
runtimeOnly("com.microsoft.sqlserver:mssql-jdbc")

// 수정사항 바로 적용
developmentOnly("org.springframework.boot:spring-boot-devtools")

// 템플릿 레이아웃
implementation ("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")

//GSON - 자바 REST API 호출 라이브러리
implementation("com.google.code.gson:gson:2.8.9")
implementation("org.springframework.boot:spring-boot-starter-webflux")
}



gradle 배포 작업 실행

위와 같이 소스 수정 후 리프레쉬 아이콘을 클릭하고 나서 Gradle의 Tasks 항목 하위에 build에 보면 여러 항목이 보입니다.

여기서 bootWar와 war라는 두가지 항목이 눈에 띄게 됩니다.


더블클릭해서 실행할 수 있으며, 실행결과는 하단의 실행창에 성공시 BUILD SUCCESSFUL 이라는 메시지와 함께 결과를 알려줍니다.

그리고 좌측의 프로젝트 탐색기에는 build의 하위 libs에 war파일들이 생성된게 보입니다.
스프링-부트-gradle-배포
gradle.kts를 통한 war 파일 생성


파일이름은 프로젝트명과 버전등으로 되는데, 한개는 끝에 plain이라는 단어가 붙은게 보입니다.

  • bootWar 실행시 - 내장톰캣이 포함된 배포
  • war 실행시 - 순수 프로젝트만 포함하여 배포


@SpringBootApplication 애노테이션 클래스 수정

@SpringBootApplication 애노테이션이 붙은 클래스는 main 메서드가 있어 프로그램의 시작점으로만 알고 자세한 로직은 아직 내공이 부족한탓에 잘 알지 못합니다.

이부분 을 아래와 같이 부모클래스를 지정하여 상속받고 implements WebApplicationInitializer 인터페이스를 추가했습니다.

package com.dongbuLEDMISApplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.WebApplicationInitializer;

@SpringBootApplication
public class MISApplication extends SpringBootServletInitializer implements WebApplicationInitializer {
    // 배포작업을 위해 추가한 메서드
    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MISApplication.class);
}

public static void main(String[] args) {

SpringApplication.run(MISApplication.class, args);
}
}



톰캣 404 에러

위에서 나열한 배포 작업 결과의 WAR파일을 톰캣 webapps 폴더안에 넣고 문제 없이 구동만 됐다면 저는 블로그에 정리하지는 않았을 겁니다.

이 문제로 반나절을 고생하다 결국에 톰캣 버전 문제임을 깨닫고 인텔리제이 실행시 내장톰캣과 동일한 버전으로 다운받아 구동했더니 이상없이 진행되었습니다.