허원철의 개발 블로그

Spring Boot - Resource 개선하기 본문

web

Spring Boot - Resource 개선하기

허원철 2016. 12. 25. 23:08
이번 글은 Resource를 개선하기 위한 방법에 대한 글 입니다.

Why..?

흔히 웹단를 같이 구성하게되는 WAS를 구성하게 되면 Spring 에서는 Static Resources(html, js, css, img)를 /resources에 경로로 잡아 관리 해줍니다. (Resource Server를 통해 따로 관리할 수 도 있습니다.)

User가 Browser를 통해 Server에 접근하게 되면 해당 url에 mapping된 html을 보여주고, 그에 맞는 Resource를 HTTP 통신을 통해 가져오게 됩니다. 물론, 브라우저에  Resource가 Cache에 쌓여 두번째 호출 부터는 통신이 줄겠지만 결국에는 HTTP 통신을 통해 가져오는 것이기 때문에 서버의 과부하의 원인이 될 수 있습니다. 그래서 gzip이라는 압축 방식을 통해 Resource를 압축하여 Server에서 보낼 수 있습니다. (참고 : HTTP1.1 Header)



How..!

Spring 이라면 Servlet Container(Tomcat)의 server.xml 에서 간단하게 설정할 수 있습니다.

[Tomcat 7.+ - server.xml]


1
2
3
4
5
6
7
8
9
10
<Connector
  URIEncoding="UTF-8"
  compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/javascript"
  compression="on"
  compressionMinSize="2048"
  noCompressionUserAgents="gozilla, traviata"
  connectionTimeout="20000"
  port="80"
  protocol="HTTP/1.1"
  redirectPort="8443"/>
cs


[Spring]

Spring에서 설정을 하고자 한다면, WebMvcConfigurerAdapter를 상속받아서 버전에 맞게 아래와 같이 구성할 수 있습니다.


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
34
35
36
37
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
        "classpath:/META-INF/resources/"
        "classpath:/resources/",
        "classpath:/static/"
        "classpath:/public/" };
 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
////        Spring 3.1+
        if (!registry.hasMappingForPattern("/resources/**")) {
            registry.addResourceHandler("/resources/**")
                    .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
        }
        
//        Spring 4.1+
        if (!registry.hasMappingForPattern("/resources/**")) {
            registry.addResourceHandler("/resources/**")
                    .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS)
                    .setCachePeriod(3600)
                    .resourceChain(true)
                    .addResolver(new PathResourceResolver());
        }
        
//        Spring 4.3.1+ 
        if (!registry.hasMappingForPattern("/resources/**")) {
            registry.addResourceHandler("/resources/**")
                    .addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS)
                    .setCachePeriod(3600)
                    .resourceChain(true)
                    .addResolver(new GzipResourceResolver())
                    .addResolver(new PathResourceResolver());
        }
    }
}
cs

- PathResourceResolver() : 요청 경로와 일치하는 주어진 위치에서 리소스를 찾으려고 시도하는 간단한 ResourceResolver 입니다.

- GzipResourceResolver() : 요청 경로와 일치하는 주어진 위치에서 리소스를 gzip으로 압축하여 보내주는 ResourceResolver 입니다.

[Spring Boot]

- 서버를 내장할 수 있는 스프링부트에서는 프로퍼티에서 간단하게 설정을 해줄 수 있습니다.

1
2
3
4
5
server.compression.enabled=true
spring.resources.chain.cache=true
server.compression.min-response-size=2048
spring.resources.chain.enabled=true
spring.resources.cache-period=3600
cs

spring.resources.static-locations 를 보면  

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"

이 경로들이 Default 라고 되어 있는데 경로를 못잡아줍니다..ㅠ 예제를 만들 때 jsp페이지를 구성하기 위해 tomcat-embed-jasper를 가져와서 그런 것 같기도.. 하고 아시는 분은 알려주시면 감사하겠습니다.


Result

크롬 개발자도구(F12)를 확인해보면, 각 스크린샷의 좌측하단에서 리소스 크기를 볼 수 있는데 확연한 차이를 볼 수 있습니다.


gzip 적용 이전


gzip 적용 이후



'web' 카테고리의 다른 글

Spring Boot - Exception Handler  (405) 2017.01.03
책 '서블릿 컨테이너의 이해' 후기  (419) 2016.12.29
HTTP1.1 Header  (404) 2016.12.17
Spring Boot - Redis를 활용한 Session Clustering  (423) 2016.12.13
JNDI 살펴보기  (426) 2016.12.09
Comments