이전글


include 디렉티브 <%@ include %> 의 쓰임새
이전글에서도 살펴보았지만 include 디렉티브는 <jsp:include> 액션태그와 마찬가지로 JSP로 웹 개발을 함에 있어서 중복되는 부분을 제거하고 하나의 JSP 파일로 만들어 관리하기 위해 특정 JSP 페이지를 포함시키는 역할을 합니다. 

다만 include액션태그와 include 디렉티브의 동작 방식에 차이가 있는 만큼 그 활용 방법에도 차이가 존재하는데, include 액션태그의 경우 여러 페이지에 걸쳐 중복되는 화면 구조를 하나의 파일로 만드는것에 목적이 있다면 include 디렉티브는 최종적으로 포함되는 JSP 페이지와 하나의 JSP 파일로서 동작하기 때문에 여러 JSP 페이지에서 사용하는 공통 변수들을 포함하는데 사용됩니다.

<jsp:include> 액션태그 - 여러 페이지에 걸쳐 중복되는 화면을 하나의 JSP 페이지로 만들어 중복을 제거하는데 사용.
<%@ include %> 디렉티브 - 여러 JSP 파일에 걸쳐 선언되어 사용되는 중복 변수나 중복 로직을 제거하는데 사용.




jspf(JSP Fragment) 파일
JSP 프로젝트를 보면 .jspf 확장자를 가진 파일을 볼 수 있는데, 이는 JSP Fragment 라는 의미를 지닌 파일로 해석하자면 JSP (코드)조각 파일정도로 볼 수 있습니다. include 디렉티브로 포함되는 대상 파일은 꼭 jsp 확장자를 가지지 않아도 되는데, 포함되는 코드조각 이라는 것을 쉽게 알아볼 수 있도록 임의로 .jspf 파일로 작성한 것입니다.

따라서 .jspf 로 JSP파일을 저장해두면 프로젝트를 진행할 때 단독으로 사용되는 JSP 페이지가 아니라 다른 JSP 페이지에 의해 포함되어 지는 JSP 페이지 조각이라는 점을 쉽게 알 수 있어 JSP 파일이 늘어나고 프로젝트 구조가 복잡해졌을 때 더욱 관리하기 쉬워지는 장점이 있습니다.



JSP 페이지에서 코드 중복
예를 들어 다음과 같이 a.jsp, b.jsp, c.jsp 세 개의 JSP 페이지가 있습니다. 자세히 보면 세 개의 JSP 페이지에서는 공통적으로 사용되는 로직이 존재하는데, 요청 파라미터로부터 userName이라는 사용자 이름 변수를 가져오는 코드가 중복되고 있습니다.

이때 만약 파라미터 속성이 userName에서 userNm으로 변경된다든지 공통적으로 사용되는 파라미터를 각각 추가해주어야 한다면 어떻게 될까요? 또한 지금은 세 개의 JSP 페이지에서만 코드가 중복되지만 수십개의 JSP 페이지에서 중복되는 일이 발생한다면 어떻게 할까요? 지금처럼 로직이 여러 JSP 페이지에 걸쳐 중복되면 변경에 있어서 매우 큰 시간과 노력이 투자되어야 할 것입니다.

a.jsp
<%@ page contentType="text/html; charset=UTF-8"%>                                             
<%
     String userName = request.getParameter("userName"); 
     //a.jsp만의 로직 
%>
cs

 


a.jsp
<%@ page contentType="text/html; charset=UTF-8"%>                                             
<%
     String userName = request.getParameter("userName"); 
     //b.jsp만의 로직 
%>
cs


c.jsp
<%@ page contentType="text/html; charset=UTF-8"%>                                             
<%
     String userName = request.getParameter("userName"); 
     //c.jsp만의 로직 
%>
cs




include 디렉티브로 중복 변수 처리하기
위와 같은 상황에서는 하나의 JSP 파일로 공통 로직만을 떼어 만들고 include 디렉티브를 통해 포함하는 방법을 사용하여 해결할 수 있습니다. include 디렉티브는 다음과 같이 file 속성에 포함시킬 JSP 페이지를 절대경로 또는 상대경로로 지정해주면 됩니다.
<%@ include file="포함시킬 jsp파일"%>                                                      
cs


절대경로의 경우 현재 웹 어플리케이션의 루트경로 부터 시작하며 '/' 슬래시부터 시작합니다. 상대경로의 경우 현재 실행되는 JSP 페이지 경로로부터 포함시킬 JSP 조각 파일이 어디있는지를 나타냅니다. 두개의 JSP 파일이 같은 디렉터리 안에 존재하는 경우 파일명만 지정해주면 됩니다. 아래 예제에서는 절대경로를 사용했습니다.



ready.jspf 라는 JSP 코드조각 파일을 만들었습니다. 공통적으로 사용될 변수를 준비하는 역할을 합니다. 브라우저에서 보낸 요청 파라미터 정보를 userName이라는 변수에 담는 역할을 하고 있습니다.
<%@ page contentType="text/html; charset=UTF-8"%>                                             
<%
     String userName = request.getParameter("userName"); 
%>
cs



a.jsp 페이지입니다. 처음 변수를 준비하는 부분은 ready.jspf 파일에 작성해두고 a.jsp 페이지에서는 include 디렉티브를 통해 코드를 포함시킵니다. body에서는 ready.jspf 파일에서 제공해주는 변수를 출력하고 있습니다.
<%@ page contentType="text/html; charset=UTF-8"%>                                             
 
 
<%@ include file="/ready.jspf" %> 
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
</head> 
<body> 
     <h1>a.jsp 페이지</h1> 
     
     userName : <%= userName %> 
</body> 
</html> 
cs



테스트는 다음과 같이 요청 파라미터를 통해 userName값을 넘겨주면 됩니다. a.jsp 에서는 요청 파라미터를 처리하는 로직이 없지만 ready.jspf 에서 처리하기 때문에 userName 변수를 사용할 수 있습니다.





web.xml 설정으로 자동 include 설정 및 include 지정 한꺼번에 하기
지금까지 배운 내용을 응용한다면 두 개의 jspf 파일을 만들어두고 최초에 처리할 내용과 마지막에 처리할 후처리 로직을 작성해 두고  각각 사용할 수도 있을것입니다.
<%@ include file="/ready.jspf" %>                                                         
 
 
...각 페이지별 처리 내용...
 
 
<%@ include file="/end.jspf" %> 
cs


그러나 이 방법에도 분명 단점이 존재하는데, 공통적인 로직을 사용하는 페이지가 많아질수록 include 디렉티브를 적용해주어야 하는 페이지도 늘어난다는 사실입니다. 따라서 JSP에서는 web.xml을 통해 공통로직을 한꺼번에 include 하기 위한 방법을 제공하고 있습니다. 다음과 같이 환영 인사와 감사 인사를 표시할 JSP 코드조각을 두 개 만듭니다.

ready.jspf
<%@ page contentType="text/html; charset=UTF-8"%>                                             
 
환영합니다. 도로락의 블로그입니다.
cs


end.jspf
<%@ page contentType="text/html; charset=UTF-8"%>                                             
 
블로그에 접속해주신 여러분 감사합니다.
cs


web.xml에서는 다음과 같이 설정합니다. 모든 jsp 페이지에 대해 맨 앞과 맨 뒤부분에 각각 ready.jspf와 end.jspf를 include합니다.
<jsp-config>                                                                            
     <jsp-property-group> 
           <url-pattern>*.jsp</url-pattern> 
           <include-prelude>/ready.jspf</include-prelude> 
           <include-coda>/end.jspf</include-coda> 
     </jsp-property-group> 
</jsp-config> 
cs


<jsp-config> - jsp에 관련된 여러가지 설정을 하기위한 태그입니다.
<jsp-property-group> - 하나의 설정을 지정하기 위한 그룹 태그입니다. (특정 패턴에 대해 특정 설정을 하기 위한 단위)
<url-pattern> - 설정을 적용할 대상을 패턴으로 지정합니다. *.jsp로 지정시 모든 jsp 파일에 설정이 적용됩니다.
<include-prelude> - 패턴에 해당하는 JSP페이지의 맨 앞 부분에 include 될 JSP를 지정합니다.
<include-coda> - 패턴에 해당하는 JSP페이지의 맨 뒷 부분에 include 될 JSP를 지정합니다.

*참고로 prelude는 전주곡을 뜻하며 coda는 곡의 마무리를 뜻합니다. 의미를 알고 속성을 보면 설정을 이해하기 쉽습니다.




테스트에 사용할 a.jsp입니다. include 디렉티브는 어디에도 존재하지 않습니다.
<%@ page contentType="text/html; charset=UTF-8"%>                                             
<!DOCTYPE html> 
<html> 
<head> 
<meta charset="UTF-8"> 
</head> 
<body> 
     <h1>a.jsp 페이지</h1> 
</body> 
</html> 
cs



테스트 결과입니다 a.jsp에 요청하면 web.xml 설정에 따라 앞뒤에 jspf 코드가 포함되었습니다.






여러 파일을 include 하도록 설정하기
만약 여러 jsp 파일을 include 하고 싶은 경우 <jsp-property-group> 태그를 여러개 사용하면 됩니다.
<jsp-config>                                                                                 
    <jsp-property-group> 
           <url-pattern>*.jsp</url-pattern> 
           <include-prelude>/ready.jspf</include-prelude> 
           <include-coda>/end.jspf</include-coda> 
     </jsp-property-group> 
     
     <jsp-property-group> 
           <url-pattern>*.jsp</url-pattern> 
           <include-prelude>/ready2.jspf</include-prelude> 
           <include-coda>/end2.jspf</include-coda> 
     </jsp-property-group> 
</jsp-config> 
cs


위와 같이 설정이 되어 있는 경우 /a.jsp 페이지는 두 개의 url 패턴 모두에 해당되기 때문에 아래 그림처럼 순서대로 include가 적용됩니다.




만약 이클립스 환경에서 web.xml 설정이 적용되지 않는 경우가 있을 수 있는데 Servers 뷰에서 등록한 서버를 마우스 우클릭 후 clean 또는 clean Tomcat Work Directory를 실행해주시기 바랍니다.


블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!