Frudy
7k
2019-06-21 11:28:16 작성 2019-06-21 18:53:55 수정됨
2
814

include디렉티브 vs include액션태그


질문이 올라와서, 저도 제가 알고있는 내용에 대해 열심히 적어보겠습니다.

몇달전에 저도 같은고민을 했고,

이 고민을 하고있는 다른분들께 도움이 되었으면 좋겠습니다.


관련된 지식을 함께 서술할 예정이라 글이 길어질거같습니다.


[person.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%!

class Person

{

String name;

}

%>


[school.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ include file = "person.jsp" %>

<%

Person taehwi = new Person();

%>


1. <%@ include는, 소스코드 차원에서 포함됩니다. 이게 무슨뜻이냐면요,


<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ include file = "person.jsp" %>

<%

Person taehwi = new Person();

%>

이 코드의 뜻은,


<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%!

class Person

{

String name;

}

%>

<%

Person taehwi = new Person();

%>

이거랑 동일한거같아요. (정확하진않아요 저렇게 생각해요..)


실제로,

<%@ include를 하지않을경우, 컴파일에러가 나요. Person클래스 정의하지않았다고.


하지만, <%@ include를 하게될경우 위의 Person클래스의 정의부분의 코드가 

school.jsp와 합쳐지면서 


<%!

class Person

{

String name;

}

%>

<%

Person taehwi = new Person();

%>

이런 코드가 되어 컴파일 에러가 사라지는것을 볼 수 있어요.

이렇게 소스코드가 Ctrl+C Ctrl+V되는 느낌을 받아요.


그래서! 이런 차이가있어요.

이렇게 <%@ include를 여러개해도,


변환은 school.jsp 단 하나만 변환되는것을 볼 수 있어요.

소스코드가 모두 school.jsp에 포함되어 함께 컴파일되기 때문이에요.


하지만? <jsp:include는 달라요.


[home.jsp] 에서 이렇게 출력한다면...?



이렇게 각각 컴파일되는것을 볼 수 있어요.


그래서,


위 코드와 이 코드 두개를 비교해보겠어요.

둘 다 결과는,


이렇게 동일해요. 하지만 차이가있어요.


<%@ include는,

사용자가 요청하기 전부터 이미 


이렇게 [합쳐진 jsp파일]이 존재하는거구요,


<jsp:include는, 사용자가 요청했을 때

[home.jsp]를 읽다가 (현재 처리중인 파일 = home.jsp)


<jsp:include page="header.jsp"></jsp:include>를 만나면

[header.jsp]를 읽다가 (현재 처리중인 파일 = header.jsp)


다읽으면 다시 home.jsp로 복귀하고 (현재 처리중인 파일 = home.jsp)


<jsp:include page="footer.jsp"></jsp:include>를 만나면

[footer.jsp]를 읽다가 (현재 처리중인 파일 = footer.jsp)


다읽으면 다시 home.jsp로 복귀하고 (현재 처리중인 파일 = home.jsp)


이렇게 페이지 실행흐름 자체가 바뀌는거에요.

그래서 컴파일이 각각 되어야 해요.


그러므로,

정적 = 사용자가 요청하기 전부터 이미 합쳐진 jsp파일이 존재함, 이걸로 html파일로 만들어서 줌

동적 = 사용자가 요청했을 때 jsp파일을 합쳐서 html파일로 만들어서 줌.

이렇게 이해를 하고있어요.


어쨌든! 클라이언트의 웹브라우저가 받는 html파일의 내용은 둘다 동일하다고 생각하니까요.

(증거 = 둘 다 실행하면 결과가 똑같음)


정리)

jsp:include는 그 jsp파일의 실행결과를 포함한다.

<%@ include는 그 jsp파일의 소스코드를 포함한다.


<%@ include는 사용자가 요청하기 전부터 이미 파일이 합쳐져 있다.

jsp:include는 사용자가 요청을 했을 때 페이지 실행흐름이 바뀌면서

여러 파일들이 모두 합쳐진걸로 html파일 만들어서 받는다.


(우리가 네이버홈페이지를 요청하면, 네이버상단, 네이버내용, 네이버하단이

모두 합쳐진 파일을 받으니까 이렇게 생각합니다)


하지만 저 둘의 쓰임새는 저도 여전히 의문이에요.

<%@ include의 저 쓰임새로 어떻게 활용해먹을지는 잘 모르겠어요.

딱 하나 있긴한대, .java파일 하나도 못쓰는 환경에서 

class랑 method를 jspf파일에서 선언하고

<%@ include해온적은 있었거든요....

1
  • 댓글 2

  • 돈까스
    5k
    2019-06-21 13:18:24

    그냥 특성만 알고 계시면 될 것 같은데요.

    include 대상이 되는 페이지의 크기가 굉장히 커진다거나 로직이 복잡해지면

    두가지 방식에 유의미한 차이가 있을 수 있습니다만,

    그건 그런 케이스를 접해서 해봐야 알게 되는 것이고,

    애초에 그렇게 큰 로직이나 복잡한 뷰를 include하는 상황을 만들지 않는게 좋겠죠.



  • 행복해지고싶은사람
    932
    2019-06-21 13:46:14

    컴파일해서 나오는 class에서도 차이가 있군요

    자세한 설명 감사합니다!

    그리고 jspf도 무슨 파일인지 일부러 찾아보지 않았는데

    web.xml에 설정해주면 전역적으로 코드를 변경해준다는 것을 알게 되었네요 ㅎㅎ

    많이 배워갑니다~!!

  • 로그인을 하시면 댓글을 등록할 수 있습니다.