Verity's Daily Logs_

[Spring Boot]JSP 제약사항 본문

Spring Framework

[Spring Boot]JSP 제약사항

johye0 2020. 12. 18. 10:49
반응형

SpringBoot + JSP 조합으로 작성된 프로젝트를 JAR로 빌드하여 실행시켜 보면 브라우저에서 "Whitelabel Error Page" 오류가 뜨는 것을 볼 수 있다. 이는 내장 톰캣을 사용하는 스프링 부트 애플리케이션에서 JSP 템플릿이 제대로 지원되지 않아서 발생하는 오류다.

여기서 중요한 것은 SpringBoot + JSP 조합 자체가 문제가 있다는 것이 아니라, JAR를 이용하여 서비스할 때 JSP로딩에 문제가 있다는 것이다.

(간혹 SpringBoot + JSP 조합자체에 문제를 제기하는 사람이 있어 글을 정리하게 됨) 

 

서비스 실행 & 결과 화면

 

1. JSP Limitations

Spring Boot Docs에서 소개하는 제약사항은 아래와 같다.

Jetty/Tomcat 등 서블릿컨테이너에서 실행 가능한 JAR(executable JAR)를 사용하게 되면 JSP는 지원되지 않으므로, 실행 가능한 WAR를 이용하라는 말이다.

(출처: docs.spring.io/spring-boot/docs/2.1.5.RELEASE/reference/htmlsingle/#boot-features-jsp-limitations)

29.4.5 JSP Limitations
When running a Spring Boot application that uses an embedded servlet container (and is packaged as an executable archive), there are some limitations in the JSP support.
- With Jetty and Tomcat, it should work if you use war packaging. An executable war will work when launched with java -jar, and will also be deployable to any standard container. JSPs are not supported when using an executable jar.
- Undertow does not support JSPs.
- Creating a custom error.jsp page does not override the default view for error handling. Custom error pages should be used instead.
There is a JSP sample so that you can see how to set things up.

 

왜 JAR 에서 JSP는 지원되지 않을까 생각해보려면 이전 포스팅에서 비교했던 두 파일의 구조가 도움이 될 수 있다. 실행 가능한 JAR는 Tomcat(서블릿 컨테이너)의 사전 정의된 파일 패턴에 따르지 않기 때문에 작동하지 않기 때문이다.

(이전 포스팅: hye0-log.tistory.com/27)

 

[Spring Boot]배포 방법 비교 (JAR vs WAR)

스프링 부트의 장점 중 하나는 실행 가능한 JAR (Executable Jar)로 빌드하여 프로젝트를 바로 실행시킬 수 있다는 점이다. 실제로 스프링부트 관련 문서를 보다 보면 "Executable Jar"라는 단어를 많이 볼

hye0-log.tistory.com

 

1.1. SpringBoot Application의 JSP 디렉터리 구조

프로젝트에서 JSP를 생성하는 위치는 /src/main/webapp/WEB-INF/하위 디렉토리로 되어있다. WEB-INF 디렉터리가 Tomcat의 기본 정의된 디렉터리 구조이기 때문에, 배포할 때에도 이 구조가 유지되어야 하는 것이다.

 

위처럼 구성된 프로젝트를 각각 bootJar, boorWar를 이용하여 빌드하면 아래의 구조로 생성된 파일들이 생성된다.

JAR File 구조(좌측)는 WAR File 구조(우측)와 달리 WEB-INF대신 BOOT-INF가 있으며, 어느 폴더에도 jsp 파일들을 찾을 수가 없다. → Tomcat이 jsp를 찾지 못하는 것은 당연하다. 

 

2. JSP를 사용하기 위하여

Spring 문서에도 나와있지만, WAR를 이용하면 해결될 일이다. 

gradle을 사용할 경우 build.gradle 문서에 한 줄만 추가한 후 bootWar를 사용하면 이후 실행방법은 JAR와 동일하다.

 

- build.gradle (두 가지 방법 중 한 가지 선택)

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
    id 'java'
    id 'war'
}
   OR
group = 'com.example'
version = '0.0.1-SNAPSHOT'
apply plugin: 'war'

 

- 실행 확인

  $ java -jar demo-0.0.1-SNAPSHOT.war

 

 

3. JSP+JAR를 사용할 순 없을까?

JSP 관련 글을 검색하다 해외 포스팅을 하나 보게 되었다. JAR를 사용하더라도 JSP의 디렉터리 위치만 바꿔주면 사용이 가능하다는 것인데, 그대로 따라 해도 나는 Whitelabel Error Page 오류를 벗어날 수 없었다. 사실 이렇게 까지 해서 JAR를 사용하겠단 의지는 전혀 없었기 때문에 더 이상 파보진 않았지만 기록용으로 링크는 남겨둔다.

 

JSP 파일 위치를 src/main/resources/META-INF/resources/WEB-INF/jsp로 이동하면 된다고함

https://dzone.com/articles/spring-boot-with-jsps-in-executable-jars-1

 

 

 

반응형
Comments