spring boot 2.x + jsp +gradle 내장톰켓 셋팅하기

프로젝트 구성 개요

  • jsp를 쓸수밖에 없는 프로젝트에서 gradle을 이용하여 war로 build 후 java -jar app.war 를 사용하여 프로젝트를 띄울수 있게 하는것이 주 목적이다.

  • spring boot 프로젝트러 jar패키징후 내장 톰켓을 사용하는 방식으로는 jsp 를 view template으로 사용할수 없다.

  • 이 셋팅이 필요없는 케이스.

    • 굳이 jsp를 쓰지않아도 되는 경우. war셋팅도 필요없으니 기존 jar 배포구조로 구성하면된다.
    • 내장tomcat을 쓰지않는경우. war로 패키징하여 외부 톰켓을 이용하면 되므로 bootRun, bootWar셋팅까지 할 필요는 없다.

실제로는 프로젝트를 마이그레이션 하는 과정에서 발생한 트러블 슈팅 과정을 정리한 산출물입니다.
본 내용에서는 마이그레이션 과정이 아닌 셋팅만 기술하겠습니다.(결과물위주)

디렉토리 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
src.main
├ com.project..../
| ├ controller/
| └ service/
├ resources/
| ├ config/
| | └ applicatoin.yml
| └ properties/
|
└ webapp/
├ test.jsp
├ error.jsp

jsp를 뷰 template으로 사용하기 위해서는 src/main/webapp 페키지 아래 둔다.

빌드 환경과 의존성 셋팅

  1. war로 build 하기위해서 apply plugin: 'war' 를 포함시켜준다.
    • 이제 gradle - build 시 jar가 아닌 war로 빌드된다.
  2. 내장톰켓이 jsp를 실행시킬수 있도록 의존성을 추가한다
    • tomcat-embed-jasper
    • jstl
  3. war plugin을 설치하면 gradle build에서 war, bootWar를 선택할 수 있다. 이를 셋팅해준다
    • boot war
  4. (선택사항) 위과정을 bootRun에서 수행하고싶다면 개발환경을 위해 bootRun 까지 셋팅해준다.
    • main = bootWar.getMainClassName() 를 추가해주면 war를 생성해 실행해준다.
  5. 로컬환경 설정 변경하기 (intellij 만 해당)
    • AppApplication - run으로 실행되지 않는 경우가있다
    • multi module project 인경우 발생한다
    • run/debug configuration > environment > Workingdirectory 를 $MODULE_WORKING_DIR$ 로설정하면 해결된다.
    • intellij setting

예시

아래는 1~4에 해당하는 부분을 적용한 build.gradle 예시이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apply plugin: 'war'     //setting 1

ext {
jstlVersion = '1.2' //알맞게 바꿔 사용하세요
jasperVersion = '9.0.14'
}

dependencies {

/* Web */
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-configuration-processor")

/* jsp */ //setting 2
compile("org.apache.tomcat.embed:tomcat-embed-jasper:${jasperVersion}")
compile("javax.servlet:jstl:${jstlVersion}")

/* db */
/* add dependencies what you need!! */
}

//setting 3
bootWar {
mainClassName = 'com.project.MainApplication'
archiveName = rootProject.name + '-' + baseName + '.' + extension
}

//setting 4
bootRun {
main = bootWar.getMainClassName()
systemProperties = System.properties
}

배포하기

  1. bootWar 명령어를 통해 빌드
  2. build/libs 안에 war 파일을 서버에 배포
  3. java -jar app.war 명령어로 실행

Comments