일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Linux
- Spring Framework
- 스프링프레임워크
- 웹프로젝트
- java
- Jenkins
- SpringFramework
- Spring Boot
- spring-framework
- soap
- tomcat
- 스프링부트
- 이클립스
- mybatis
- git
- Gradle
- Web
- Spring
- War
- gitlab
- Pipeline
- maven
- hashcode
- 개발
- jsp
- springboot
- oracle
- annotaion
- REST
- JAR
- Today
- Total
Verity's Daily Logs_
[Spring Boot]JSP 제약사항 본문
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)
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
'Spring Framework' 카테고리의 다른 글
[Spring Boot]개발-운영환경 설정 나누기(Gradle) (0) | 2021.01.06 |
---|---|
[Spring Boot]war로 배포하기 (Gradle + 내/외장 톰캣) (3) | 2020.12.23 |
[Spring Boot]배포 방법 비교 (JAR vs WAR) (0) | 2020.12.17 |
[Spring Boot]JDBC+MyBatis 연결하기(2) (0) | 2020.10.14 |
[Spring Boot]JDBC+MyBatis 연결하기(1) (0) | 2020.10.14 |