Backend/Spring+Boot

SpringBoot 정적자원

findmypiece 2021. 4. 20. 14:39
728x90

SpringBoot 사용 전에는 jsp, html 같은 정적자원들은 src/main/webapp 디렉토리 하위에 배치했었다. 이는 클래스패스에 해당하는 경로로 패키징시 정적자원을 참조하는 특수경로이다. 하지만 SpringBoot 공식 메뉴얼에 보면 아래와 같이 이 경로를 사용하지 말라고 안내하고 있다.

 

src/main/webapp애플리케이션이 jar로 패키징 된 경우 디렉토리를 사용하지 마십시오 . 이 디렉토리는 공통 표준이지만 전쟁 패키징 에서만 작동 하며 jar를 생성하면 대부분의 빌드 도구에서 자동으로 무시됩니다.
출처: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-spring-mvc-static-content

 

하지만 이는 권고사항으로 gradle 6.8.3 버전 기준 src/main/webapp 의 정적자원이 패키징시 정상적용 되는 것으로 보인다. 하지만 굳이 지키지 않을 이유도 없기 때문에 공식 메뉴얼에 나온데로 클래스패스 하위 static or public or resources or META-INF/resources 디렉토리에 정적자원을 두는 것이 좋을 것 같다.(Thymeleaf 를 사용할 경우 templates 디렉토리가 자동으로 추가된다)

 

대부분의 빌드툴에서 기본적으로 설정되어 있는 클래스 패스는 src/main/java, src/main/resources 인데 이 중 정적자원은 후자에 두는 것이 맞을 것 같다. src/main/resources/static, src/main/resources/public 에 정적자원을 두면 정상 접근 되는 것을 확인했다. (resources, META-INF/resources 에 뒀을 때에는 접근이 안됐다.) 

 

서칭을 해보니 대략 정적자원은 아래와 같은 구조로 배치해서 많이들 사용하는 것 같다.

src
└─ main
   └─ resource
      └─ templates (템플릿파일: thymeleaf, groovy, handlebars, velocity 등)
      └─ static    (css, js 등)
      └─ public    (순수 html: 에러페이지 등)

 

그런데 SpringBoot 에서는 jsp 사용을 지양하는만큼 공식적으로 지원하지 않아 jsp 파일을 위 정적자원 디렉토리에 배치할 경우 정상 동작하지 않는다. jsp의 경우 반드시 src/main/webapp 하위에 둬야 정상 동작한다. 또한 내장톰캣은 기본적으로 jsp 엔진을 포함하고 있지 않기 때문에 Gradle 기준 아래와 같은 의존성이 추가로 필요하다.

dependencies {
	implementation "javax.servlet:jstl"
	implementation "org.apache.tomcat.embed:tomcat-embed-jasper"
}    

SpringBoot 에서는 jsp를 의도적으로 배제하고 있는 것으로 보이며 SpringBoot의 발전으로 jsp는 반강제적으로 빠르게 버려지는 기술이 되어가는 것 같다.

728x90