Include 지시어와 Include 액션의 차이

Posted by 열정보이
2019. 1. 27. 16:35 Web



오늘은 Include 지시어와 Include 액션의 차이에 대해 알아보려고 합니다.


Include 지시어와 액션 모두 하나의 jsp 파일안에 외부 파일을 넣을 때 사용합니다.


그렇다면 왜 Include를 사용해야할까요?


위와 같이 하나의 페이지가 있을 때, 하나의 JSP에 다 코딩하게 된다면, 파일 길이가 길어지겠죠.

그렇다면 유지보수하기도 힘들고 작은 부분이 바뀌게 되면 페이지 하나를 다시 컴파일 하게 되는 비용이 드는것이죠.


그래서 include 를 사용해서 페이지를 나눌 수 있습니다.



main.jsp 파일에 top.jsp, writer.jsp, category.jsp 등등 파일을 나눠 작성하는것이죠.

그렇게 되면 파일의 수는 늘어나나, 관리는 편하겠죠.


이제 Include 지시어와 액션의 차이에 대해 알아보려고 합니다.

하지만 그 전에 Servlet Container와 동작과정에 대해 알아두시면 좋을 것 같아서 미리 설명드릴게요!



Servlet Container는 말 그대로 servlet을 처리하기 위한 컨테이너라고 생각하시면 됩니다.

jsp 또한 servlet 기반이기 때문에 Servlet Container 에서 처리가 되죠.


그리고 위 사진 처럼 jsp 는 컨테이너에서 servlet(.java) 로 그리고 class 파일로 컴파일됩니다.


그리고 컨테이너로 home.jsp 에 대한 요청이 들어올 경우, 컨테이너에 home.class 파일이 적재되지 않았을 경우, 적재 시키고 요청을 처리합니다.

이렇게 적재된 class 파일은 생명주기만큼 존재하다 destory되죠.

그리고 만약 home.jsp 파일이 변경이 발생하였고, home.jsp에 대한 요청이 발생한다면, 컨테이너는 변경을 감지하고, 다시  home.jps 를 컴파일하는 작업을 실시하게 됩니다.


여기까지 어렵지 않죠?





그렇다면 실제 파일을 보면서 오늘의 진짜 내용인 Include 지시어와 액션에 대해 알아보도록 하겠습니다.


1. 사용방법이 다르다


1
2
3
4
5
<!-- Include 지시어 -->
<%@ include file="include_directive.jsp" %>
 
<!-- Include 액션 -->
<jsp:include page="include_action.jsp" />
cs


Include 지시어는 지시어기 때문에 @ 를 사용해주고, 액션은 jsp에서 제공하는 액션 중 하나로, jsp:include 로 사용합니다.




2. 컴파일 방법이 다르다.


위에 설명드린 것 처럼 jsp는 servlet으로 컴파일됩니다.

이때 Include 액션과 지시어의 가장 큰 차이가 존재합니다.


다음 사진을 보도록 하죠.


정말 Include 액션과 지시어의 가장 큰 차이라고 할 수 있죠.

보시게 되면 Include 지시어는 Home.jsp 와 함께 합쳐져 Home.java 파일로 컴파일되는것을 보실 수 있습니다.

하지만 Include 액션의 경우 자신만의 java파일과 class파일까지 가지게 되네요.


즉, Include 지시어를 사용하게 되면, 단지 소스 코드만 분리되는 것이고 컴파일은 부모되는 파일에서 함께 컴파일 됩니다.

유지보수는 코드가 분리되니까 편리하겠죠. 

하지만 include_directive.jsp 파일의 일부를 변경했다고 가정했을 때, home.jsp 까지 재 컴파일되겠죠.

즉, 낭비가 발생하게 되는겁니다.


그래서 Include 지시어는 시도때도없이 바뀌는 내용이 아닌, 시간이 지나도 잘 바뀌지 않는 정적인 데이터로 구성합니다.

왜냐하면 자꾸 바뀌면 파일 전체를 컴파일해야하니까요.


하지만 Include 액션같은 경우, 자신만의 class 파일을 만들어 냅니다.

그리고 home.jsp 요청이 올 경우, home.class에서 include_action.class을 호출하는것이죠!

그렇기때문에 include_action이 변경되더라도, include_action 파일만 컴파일되어 include 지시어와 같은 낭비가 발생하지는 않습니다.


그래서 include_action 같은 경우, 자주 변경되어도 상관없는 동적인 데이터로 구성을합니다.

왜냐면 변경돼도 해당 파일만 컴파일하면 되니까요!!


그럼 실제로 그런지 볼까요?



위와 같이 home.jsp에서 include_directive.jsp 와 include_action.jsp 를 호출하도록 하였습니다.

그리고 서버를 구동해보도록 하죠.


그 후 자신의 workspace\proejct\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ROOT\org\apache\jsp

이동해 보세요.



분명 만든 파일은 3개인데, 생성된 java파일과 class는 2종류밖에 없네요?


네, 위에 설명한 것 처럼 home_jsp(home.jsp + include_directive.jsp) 인거죠.

확인해보도록 하겠습니다.



위 파일은 home_jsp.java 파일을 열었을 때의 모습입니다.

out.write로 include_directive.jsp 에 명시했던 코드가 같이 출력되는것을 볼 수 있습니다.


하지만 include action 부분은 include 메서드로 호출하네요!

신기한것은 파라미터로 request와 reponse도 호출한다는 점!

이 또한 둘의 차이죠! 아래에서 설명드릴게요!


그럼 이번에는 Include_Action.jsp 파일만 변경 후 호출해보도록 하겠습니다.


정말 Include_Action만 컴파일된걸 볼 수 있습니다.

시간이 변경되었죠?

하지만 home_jsp 파일은 변경되지 않았습니다.



3. 변수 사용


위에 사진에서 본 것 처럼 home_jsp.java 파일을 보면 request와 response를 매개변수로 전달하고 있죠.

그렇습니다. Include 액션은 자신을 호출한 JSP  파일에서 보낸 값을 사용할 수 있습니다.


1
2
3
4
<!-- Include 액션 -->
<jsp:include page="include_action.jsp" >
    <jsp:param name="name" value="열정보이" />
</jsp:include>
cs


이렇게 명시해주고, Include Action.jsp 에서


1
<%= request.getParameter("name"%> 가  Include 액션을 이용하였습니다.

cs


위와 같이 값을 받을 수 있습니다.



네 이렇게 Include 액션과 지시어의 차이에 대해 알아보았습니다.


생각보다 글이 길어졌네요....

그럼 다음에 또 흥미로운 주제를 정리해보도록 하겠습니다.