본문 바로가기

학원/복기

[Spring] Resource 파일 읽기

리소스 파일(Resource File)은 클라이언트가 웹문서(HTML 문서)를 해석하여 실행하기 위해 필요한 정보를 제공하기 위한 웹서버에 저장된 파일을 의미한다.

  • ex) CSS 파일, JavaScript Source 파일, 멀티미디어 파일 등
  • 웹문서(HTML 문서)를 해석할 때 리소스 파일이 없는 경우 404 에러코드가 발생한다. (비정상적인 응답 결과 출력)

 

문제점 1) 리소스 파일을 WEB-INF 폴더에 저장할 경우 클라이언트는 리소스 파일 요청이 불가능하다.

  • WEB-INF 폴더는 웹서버에서 실행되는 프로그램(서블릿)에서만 접근 가능한 폴더로, 클라이언트에게는 은닉화 처리된 폴더이기 때문이다.

 

예제)

 

Koala.jpg 파일이 views 폴더 내에 있는 경우 

 

 

ResourceController

@Controller
public class ResourceController {
	@RequestMapping("/resource")
	public String resource() {
		return "resource_display";
	}
}

 

resource_display.jsp

<img scr="/spring/WEB-INF/views/Koala.jpg" width="200">

 

리소스 파일을 WEB-INF 폴더에 저장할 경우 클라이언트는 리소스 파일 요청이 불가능하기 때문에 404 에러가 발생한다.

 

 

문제점 2)

Spring MVC 프로그램에서는 클라이언트의 모든 요청을 Front Controller(서블릿)를 이용하여 처리되도록 url-pattern을 설정하여 리소스 파일을 요청하면 404 에러코드가 발생한다.

 

클라이언트가 서버의 저장된 리소스 파일을 요청할 경우 Front Controller가 요청 URL 주소를 분석하여  요청 처리 메소드를 호출하지만 리소스 파일에 대한 요청 처리 메소드가 없으므로 404 에러코드 발생하는 것이다.

 

 

해결법)

Spring Bean Configuration File(servlet-context.xml)을 변경하여 클라이언트가 리소스 파일을 요청할 경우 Front Controller가 요청 처리 메소드를 호출하지 않고 직접 응답되도록 설정할 수 있다. 

 

 

 

servlet-context.xml에서 resources 엘리먼트를 이용해 FrontController를 거치지 않고 직접 처리할 수 있도록 설정할 수 있다.

  •  resources : 클라이언트의 요청을 Front Controller가 직접 응답 처리되도록 설정하는 엘리먼트
    • 클라이언트가 리소스 파일을 요청에 대한 응답처리를 위해 사용되는 엘리먼트 
    • mapping 속성에는 클라이언트에 의해 요청되는 리소스 파일의 요청 URL 주소의 패턴을 속성값으로 설정한다.
      • [**] 패턴문자를 속성값으로 사용한 경우 현재 폴더 및 하위 폴더의 리소스 파일을 요청할 수 있다. 
    • location 속성에는 클라이언트 요청에 의해 리소스 파일을 검색하기 위한 폴더를 속성값으로 설정한다.

 

servlet-context.xml

<resources mapping="/resources/**" location="/resources/" />

 

 

servlet-context.xml 파일의 resources 엘리먼트에 location 속성값으로 설정된 폴더 및 하위폴더에 리소스 파일을 저장하여 mapping 속성값으로 설정된 URL 주소 형식으로 리소스 파일을 요청해보자

 

 

<img src="/spring/resources/images/Koala.jpg" width="200">

 

 

 

servlet-context.xml 에 resources는 여러개 등록 가능하다

 

servlet-context.xml

<resources mapping="/images/**" location="/resources/images/" />
<resources mapping="/css/**" location="/resources/css/" />
<resources mapping="/js/**" location="/resources/js/" />

 

resource_display.jsp 에서 resources 경로를 제외해도 된다.

 

resource_display.jsp

<img src="/spring/images/Koala.jpg" width="200">

 

 

프로젝트에 대한 컨텍스트 이름이 변경될 경우 컨텍스트 경로가 변경되어 404 에러코드가 발생할 수 있으므로 리소스파일에 대한 컨텍스트 경로는 직접 설정하지 않고 Front Controller에게 제공받아 사용하면 된다.

 

resource_display.jsp

EL의 pageContext 내장객체를 사용하여 컨텍스트 경로를 제공받아 사용
<img src="${pageContext.request.contextPath }/images/Koala.jpg" width="200">
	
core 태그 라이브러리의 url 태그를 사용하여 컨텍스트 경로를 제공받아 사용
<img src="<c:url value="/images/Koala.jpg"/>" width="200">

spring 태그 라이브러리의 url 태그를 사용하여 컨텍스트 경로를 제공받아 사용
<img src="<spring:url value="/images/Koala.jpg"/>" width="200">

 

 

css 파일을 가져다 사용하고 싶으면  servlet-context.xml 에 설정된 폴더에 css 파일을 넣고

 

 

link 엘리먼트를 이용해 사용하면 된다

 

resource_display.jsp

<link href="<c:url value="/css/style.css"/>" type="text/css" rel="stylesheet">