[면접 회고] part. JSP

falsovsveritas·2025년 3월 29일

기술면접

목록 보기
7/10
  • import와 include 차이
  • include를 사용해서 다른 jsp를 가져왔을 때 include한 페이지가 servlet으로 변환될 때 참조(동적) 형식이지, 정적으로 삽입이 되는 것인지?

1. include

같은 JSP 파일을 참조하더라도 <%@ include file="..." %>를 사용하느냐, <jsp:include page="..." />를 사용하느냐에 따라 정적 포함(Static Include)인지 동적 포함(Dynamic Include)인지가 달라진다.

정적 포함 vs 동적 포함

포함 방식변환 시점실행 방식JSP 변수 공유변경 반영
<%@ include file="header.jsp" %>컴파일 시점 (JSP → 서블릿 변환 시)JSP 코드 그대로 삽입✅ 가능 (하나의 JSP 파일로 합쳐짐)❌ JSP가 수정되면 포함한 모든 JSP 다시 컴파일 필요
<jsp:include page="header.jsp" />실행 시점 (사용자 요청 시)독립된 JSP 실행 후 결과 포함❌ 불가능 (변수 공유 안 됨)✅ JSP가 수정되면 즉시 반영

"정적"이라고 하는 이유: 컴파일 타임(빌드 시점)에 포함되기 때문.

"동적"이라고 하는 이유: 서버에서 실행 결과가 바뀔 수 있기 때문.

✔ 정적 포함: 포함된 파일이 컴파일 시 결합됨.
✔ 동적 포함: 실행할 때마다 포함된 파일이 별도로 실행됨.

"서버에서 실행 결과가 바뀔 수 있다"는 말은, 서버 측에서 요청을 처리하는 과정에서 데이터를 동적으로 생성하거나 변경할 수 있다는 의미이다.

구체적으로 말하자면, 서버가 동적인 콘텐츠를 생성하거나 수정해서 클라이언트에게 보내주는 방식으로 예를 들어, 데이터베이스에서 값을 조회하거나 사용자의 요청에 따라 다르게 결과를 생성할 수 있다.

📍 동적 콘텐츠 생성 예시 (서버 측에서 실행 결과 바뀌는 경우)

1️⃣ JSP 파일

JSP는 서버에서 실행될 때마다 서버 측에서 HTML을 동적으로 생성하고, 그 결과를 클라이언트에게 전달.
예를 들어, 사용자가 페이지를 요청할 때마다 다른 데이터를 화면에 표시하려면, JSP 파일에서 요청 시마다 그에 맞는 데이터를 조회하고 출력해야 함.

예시:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<html>
<body>
    <h1>오늘의 날짜는: <%= new java.util.Date() %></h1>
</body>
</html>
  • 결과: 페이지를 새로고침할 때마다 new java.util.Date()실행 시점에 현재 날짜와 시간이 다르게 반환되므로, 결과가 동적으로 달라짐.
  • 서버가 페이지를 요청할 때마다 현재 날짜와 시간을 동적으로 생성해 클라이언트에게 전달해.

2️⃣ 데이터베이스에서 조회한 결과

서버는 사용자 요청에 따라 데이터베이스에서 실시간으로 데이터를 조회하고, 그에 따라 페이지를 렌더링할 수 있다.
즉, 사용자가 요청할 때마다 데이터가 달라질 수 있기 때문에 실행 결과가 바뀌는 것.

예시:

<%@ page import="java.sql.*" %>
<%
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb", "user", "password");
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT name FROM users WHERE id=1");
    if (rs.next()) {
        String name = rs.getString("name");
%>
        <h1>사용자 이름: <%= name %></h1>
<%
    }
%>
  • 결과: 데이터베이스에서 조회한 사용자의 이름이 페이지를 요청할 때마다 다를 수 있으므로, 실행 결과가 동적으로 바뀜.

<%@ include file="header.jsp" %> (정적 포함)

  • 컴파일 시점(JSP가 서블릿으로 변환될 때)에 다른 JSP 파일(header.jsp)의 내용이 그대로 현재 JSP(main.jsp)에 삽입됨.
  • 포함된 파일의 코드가 현재 JSP 파일과 하나의 단일 서블릿 파일로 컴파일.
  • 따라서 JSP의 변수나 선언문이 포함된 JSP에서도 그대로 사용 가능.
  • 하지만 header.jsp를 수정하면, main.jsp도 다시 컴파일해야 반영됨.

📌 예제

<!-- main.jsp -->
<%@ include file="header.jsp" %>
<body>
    <h1>메인 페이지</h1>
    <p>현재 시간: <%= currentTime %></p>  <%-- header.jsp에서 선언한 변수 사용 가능 --%>
</body>
<!-- header.jsp -->
<%
    String currentTime = new java.util.Date().toString();
%>
<h2>공통 헤더</h2>
  • header.jsp에서 선언한 currentTime 변수를 main.jsp에서 바로 사용할 수 있음.
  • main.jsp가 서블릿으로 변환될 때 header.jsp 코드가 그대로 삽입되기 때문.



<jsp:include page="header.jsp" /> (동적 포함)

  • JSP 실행 시점header.jsp가 별도로 실행되고, 그 출력 결과만 main.jsp에 포함됨.
  • 서블릿 코드가 별도로 분리되어 실행
  • 따라서 포함된 JSP 파일(header.jsp)의 변수, 선언문 등을 현재 JSP(main.jsp)에서 직접 접근할 수 없음(독립적인 실행).
  • 하지만 포함된 JSP 파일(header.jsp)이 수정되더라도, 기존 JSP 파일을 별도 컴파일할 필요 없이 즉시 변경 사항이 반영됨.

📌 예제

<!-- main.jsp -->
<jsp:include page="header.jsp" />
<body>
    <h1>메인 페이지</h1>
    <p>현재 시간: <%= currentTime %></p>  <%-- 오류 발생! 변수 공유 안 됨 --%>
</body>
<!-- header.jsp -->
<%
    String currentTime = new java.util.Date().toString();
%>
<h2>공통 헤더</h2>
  • currentTime 변수를 main.jsp에서 직접 사용할 수 없음.
  • 해결하려면 request 속성을 사용해서 전달해야 함.
<!-- header.jsp -->
<%
    String currentTime = new java.util.Date().toString();
    request.setAttribute("currentTime", currentTime);
%>
<h2>공통 헤더</h2>
<!-- main.jsp -->
<jsp:include page="header.jsp" />
<body>
    <h1>메인 페이지</h1>
    <p>현재 시간: <%= request.getAttribute("currentTime") %></p>
</body>
  • request.setAttribute()를 사용하면 변수를 main.jsp에서도 사용할 수 있음.



🔥 정리

  • JSP는 웹 서버에서 자동으로 서블릿으로 변환됨
  • 서블릿이 클라이언트의 요청을 처리하고 응답을 반환
  • JSP를 이해하려면 서블릿 개념을 알고 있으면 좋음!
  • 같은 header.jsp를 포함하더라도 방식에 따라 동작 방식이 다름!
  • <%@ include %>서블릿 파일 자체가 변경됨, <jsp:include>독립적으로 실행됨
  • <%@ include file="..." %>정적 포함 (컴파일 시점에 JSP 코드 삽입, 변수 공유 가능)
  • <jsp:include page="..." />동적 포함 (실행 시점에 JSP 실행 결과 포함, 변수 공유 불가)

✔️ 언제 어떤 걸 써야 할까?

  • 공통 코드(헤더, 푸터)를 포함하지만, JSP 변수도 공유해야 한다include file="..." 사용
  • 공통 JSP가 자주 변경되고, 즉시 반영되어야 한다jsp:include page="..." 사용
  • 서버 부담을 줄이고 유지보수를 쉽게 하고 싶다면?jsp:include 추천 (별도로 관리 가능)

즉, 변수 공유가 필요하면 정적 포함, 변경 사항을 즉시 반영하고 싶다면 동적 포함! 🚀


2. import

<%@ page import="..." %> (Java import 문)

  • Java의 import문과 동일하며, Java 클래스, 패키지를 현재 JSP에서 사용할 수 있도록 불러오는 역할을 합니다.
  • 예제:
    <%@ page import="java.util.Date" %>
  • 사용 목적:
    • JSP에서 Java 클래스를 사용하고자 할 때 필요
    • import는 HTML 출력과 무관하며, JSP 코드 내에서만 영향을 줌

차이점 정리

기능<%@ include file="..." %><jsp:include page="..." /><%@ page import="..." %>
포함 방식정적 포함 (Compile-time)동적 포함 (Runtime)Java 패키지/클래스 가져오기
실행 방식현재 JSP에 코드 삽입별도의 JSP를 실행하여 출력 포함Java 코드에서 패키지 사용 가능
포함된 파일의 영향하나의 서블릿으로 컴파일됨별도의 서블릿으로 실행됨JSP 코드에서만 영향
변수 공유포함된 파일의 변수, 메서드를 그대로 사용 가능직접 변수 사용 불가 (request 전달 필요)Java 클래스 사용 가능

용도:

  • includeHTML/코드를 삽입하는 용도
  • jsp:include실행 결과를 삽입하는 용도
  • importJava 클래스를 가져오는 용도

JSP 파일이 서블릿(Servlet) 파일로 컴파일된다는 것은, JSP 코드가 실제로는 자바 코드로 변환되어 실행된다는 의미야.

3. JSP의 실행 과정

  1. JSP 파일을 서블릿 코드(Java)로 변환
  2. 서블릿 코드(Java)를 컴파일해서 .class(바이트코드) 생성
  3. 서블릿이 실행되면서 클라이언트에게 HTML 응답 반환

즉, 내부적으로 서블릿으로 변환된 후 자바 코드로 실행


📌 예제

① JSP 파일 (hello.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<head><title>Hello JSP</title></head>
<body>
    <h1>현재 시간: <%= new java.util.Date() %></h1>
</body>
</html>

이 코드를 웹 브라우저에서 실행하면, JSP 컨테이너(예: Tomcat)가 내부적으로 다음과 같은 서블릿 코드로 변환.

② 변환된 서블릿 코드 (hello_jsp.java)

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase {
    public void _jspService(HttpServletRequest request, HttpServletResponse response) 
            throws java.io.IOException, ServletException {
        response.setContentType("text/html; charset=UTF-8");
        JspWriter out = response.getWriter();
        out.write("<html><head><title>Hello JSP</title></head><body>");
        out.write("<h1>현재 시간: " + new java.util.Date() + "</h1>");
        out.write("</body></html>");
    }
}

위 코드처럼 JSP가 실제로는 HttpServlet 클래스를 상속받는 서블릿 클래스로 변환.

0개의 댓글