Web/Spring 2018. 6. 16. 17:33

스프링에서 정적리소스 자원 사용하기(매핑),<mvc:resource>


어느때에 갑자기 jsp에서 작동하던 css, js 등의 정적 자원들이 적용이 안되는 경우가 있다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Processes application requests -->
    <servlet>
        <servlet-name>appServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
        
    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
cs

이런 경우에 먹질 않는 경우가 많다는 것이다. 요즘은 RESTFUL한 웹페이지 개발이 많기때문에 보통 servlet url 매핑을 이와 같이 하는 경우가 많다. 보통 *.do와같은 url을 매핑하게되면 *.do 형식이 아닌 url로 들어오는 요청은 전부다 defaultHandler에게 넘겨버린다. (이 안에 jsp,js,css 등 정적 리소스들의 url매핑을 처리하게 된다.) *.do 면 문제가 안된다. 단순히 servlet은 이 형태로 들어오는 url만 처리하면 되기에, 하지만 위의 코드와 같이 servlet의 url 매핑을 걸 경우는 조금 다르다. /css/.. ,/js/.., resources/css/... 등등 jsp에서 정적 자원을 활용하기 위해 link를 걸거나 스크립트 태그안의 src 속성에 url을 넣게 되면 이 마저도 servlet 매핑에 걸리게 되는 것이다. 그럼 당연히 위와 같은 매핑에 대해 controller는 작성해 놓지 않기에  404 not found가 뜨게 되는 것이다. 이문제를 해결하는 방법이 있다.(방식 자체는 2~3개 있겠지만 여기서는 그 중 한가지 방법을 소개)



1
2
3
4
5
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"></script>
<script type="text/javascript" src="resources/js/app.js"></script>    
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="resources/css/app.css">
cs

jsp 안에서 이런 자바 스크립트가 있다는 가정하에, 아무런 조치가 없다면 app.js , app.css 등은 404not found라는 응답이 발생할 것이다. 



<webapp 디렉토리 구조>


1
2
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <mvc:resources mapping="/resources/**" location="/resources/" />
cs


servlet-context.xml 에 위와 같은 설정을 해줌으로써 /resources/** 로 들어오는 모든 요청은 ${webapproot}/resources/ 로 모두 매핑시켜버리겠다는 설정이다. 이로써 정적리소스는 문제 없이 사용이 가능하게 된다. 이 방법 말고도 아예 defaultServlet 자체를 선언하여 /resources/* 라는 url을 defaultServlet 이 처리하도록 명시할 수도 있다.

posted by 여성게
: