<!DOCTYPE html>
<html lang="ko">
<head></head>
<body>
<jsp:include page="dynamic_include.jsp"/>
<%@ include file="static_include.jsp" %>
</body>
</html>
😊 주요 활용 케이스
보통 jsp 파일 내 라인수가 길어져서 쪼개는 용도나 공통인 부분을 모듈처럼 활용하기 위해서 파일을 나누고 Include를 활용하여 기존 파일에 포함하는 방식으로 많이 활용한다. (나누는 이유는 결국 유지보수!)
😅 문제
비슷하겠거니 하고 둘 중 하나를 입맛대로 골라쓰는 경우가 있는데 그럴 경우 몇가지 문제가 발생한다.
간단하게 '파일 호출 -> 파일 로드 -> 파일 포함' 세가지 스텝이 있다고 할때
<jsp:include page=""/> 는 동적으로 세가지 스텝을 거치고
<%@ include file="" %> 은 정적으로 세가지 스텝을 거친다.
조금 풀어 쓰면, 정적 include는 파일이 호출되고 로드되어 포함되기까지 다음 스텝을 진행하지 않으며 동적 include는 호출과 동시에 다음 스텝을 진행한다. 이렇게 되면 동적 include 다음에 오는 정적 include가 있을때 앞서 호출된 정적 include가 앞서 포함되지는 않는다.
이로 인해, 동적 include를 수행하는 파일 내 css, js 호출하는 부분이 포함되어있는 경우 로드 선후행 문제로 인하여 스크립트 동작이 제대로 일어나지 않을 수 있다.
또, 정적 include가 아닌 동적 include로 선언시 각 jsp 내에서 실행되는 java 로직들이 제대로 실행되지 않을 수 있다.
실제 마주했던 에러로 동적 include 하려는 파일 내에서 java response 객체를 활용하려는 경우에 아래와 같은 에러메시지를 만날 수 있었다.
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
직역하면, response.sendRedirect는 response가 커밋(수용)한 뒤 에는 부를수 없다.
동적 jsp 가 포함되는 시점에는 본 jsp의 java 로직은 커밋(수용)되기에 발생하는 문제라 이 경우 include를 정적으로 바꿔주면 처리된다.
🤔 로직과 순서가 보장되지 않는다면 무조건 정적 include를 활용하면 좋지 않을까?
jsp 파일에 html로 많아지고 java 로직도 많아지면 라인 수가 어마어마하게 늘어나는데 이 때 모든 부분을 정적으로 할당하면 아래와 같은 에러로그를 만날 수도 있다.
Generated servlet error:
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit
직역하면, 서블릿메소드의 크기가 655kb를 초과했다.
보통 정적 include 방법을 활용하여 10,000라인 정도 넘어가면 해당 에러를 만날 수 있는데
정적 include를 몇개 동적 include로 바꿔주면 잘 처리된다.