[JSP] JSP 처리과정

bien·2025년 2월 7일
0

Java_Spring_Backend

목록 보기
6/10

JSP란?

  • JSP (Jakarta Server Pages, 자카르타 서버 페이지)
    • 이전 명칭: 자바 서버 페이지(Java Server Pages)
    • HTML내에 자바 코드를 삽입해 웹 서버에서 동적으로 웹 페이지를 생성해 웹 브라우저에 돌려주는 서버 사이드 스크립트 언어.
    • Java 기반의 웹 애플리케이션에서 주로 사용되며, 서블릿(Servlet)보다 더 간편하게 웹 페이지를 개발할 수 있다.
  • 서버 사이드 스크립트 언어란?
    • 클라이언트가 요청하면 서버에서 실행되어 HTML을 생성한 후 응답을 보내는 방식
    • JSP는 서버에서 실행된 후, 완성된 HTML을 클라이언트(브라우저)로 보내기 때문에 서버사이드 스크립트 언어라고 부른다.

주요 특징

  1. HTML과 Java 코드의 결합
    • JSP는 HTML에 Java 코드를 포함할 수 있어, 동적으로 컨텐츠를 생성할 수 있다.
  2. 서블릿(Servlet) 기반 동작
    • JSP 파일은 실행될 때 서블릿으로 변환되고 컴파일되어 동작한다.
    • 서블릿보다 코드가 간결하고 가독성이 좋다.
  3. 내장 객체 제공
    • request, response, session, application 등의 내장 객체를 기본적으로 제공하며, 개발 편의성을 높인다.
  4. MVC(Model-View-Controller) 패턴에서 View 역할 수행
    • JSP는 보통 뷰(View) 역할을 담당하며, 비즈니스 로직은 서블릿이나 Java 클래스(Bean)에서 처리하는 방식으로 사용된다.

JSP의 동작 과정

  1. 클라이언트가 JSP 페이지 요청
    • 브라우저가 .jsp 파일을 요청하면, 웹 컨테이너(예: Tomcat)가 이를 처리한다.
  2. JSP -> Servlet 변환
    • JSP 파일은 서블릿(java 파일)로 변환된다.
  3. Servlet 컴파일 및 실행
    • 변환된 서블릿이 .class 파일(bytecode)로 컴파일되고 실행된다.
  4. 요청(Request) 처리 및 응답(Response) 생성
    • 서블릿이 request 데이터를 처리하고 HTML 등의 결과를 생성하여 response로 반환한다.
  5. 클라이언트에게 응답 전송
    • 웹 브라우저가 최종적으로 HTML을 받아 사용자에게 출력한다.

1. 클라이언트가 JSP 페이지 요청

  • 사용자가 브라우저에서 http://example.com/index.jsp 같은 URL을 입력하면, 해당 요청이 웹 서버(Apache 등)로 전달된다.
  • 웹 서버는 .jsp 파일 요청을 감지하면, JSP 처리를 담당하는 웹 컨테이너(Tomcat 등)에게 요청을 넘긴다.

🧐 웹서버, 웹 컨테이너란?

웹 서버(Web Server) vs 웹 애플리케이션 서버(WAS) vs 웹 컨테이너(Web Container)

  • 웹 서버(Web Server)
    • 요청을 받아 Client에게 전달
    • 웹 서버는 클라이언트의 요청을 기다리다가, 요청이 오면 요청에 대한 데이터를 전송해주는 역할을 수행한다.
    • 이때 웹 서버는 이미 가지고 있는 html 파일이나 리소스 등 정적인 파일만 전송할 수 있다.
    • 예) 아파치(Apache), IIS, Nginx
  • 웹 컨테이너(Web Container)
    • 동적인 처리를 하는 곳
    • 웹 컨테이너는 JSP나 Servlet가 실행될 수 있는 프로그램으로 서블릿 컨테이너(Servlet Container)라고도 한다.
      • JSP와 Servlet은 웹 서버가 입력받은 정보를 통해 동적인 데이터를 처리하여 정적인 페이지를 생성해준다.
  • 웹 애플리케이션 서버(Web Application Server)
    • 웹 서버(Web Server) + 웹 컨테이너(Web Container)
    • HTML같은 정적인 페이지에서는 처리할 수 없는 비즈니스 로직, DB 조회 같은 동적인 컨텐츠를 제공한다.
    • 예) 톰캣

🧐 웹서버와 웹 컨테이너는 정확히 어떻게 요청을 전달할까?

아파치 톰캣의 구조를 기반으로 알아보자!

  1. 클라이언트가 URL을 통해 데이터를 요청하면, 웹 서버(Apache)가 이를 수신하고 요청을 분석한다.
  2. 요청이 정적인 파일(HTML, CSS, JS, 이미지)이면, 웹 서버가 직접 해당 파일을 반환한다.
  3. 요청이 JSP 또는 서블릿이면, 웹 서버가 웹 컨테이너(Tomcat 등)로 요청을 넘긴다.
  4. 웹 컨테이너는 요청을 처리하고 동적인 데이터를 생성한 후, 웹 서버를 통해 클라이언트에게 반환한다.

+) 🧐 WAS안에 WebServer가 있는데 왜 WebServer를 사용하는 걸까?

WAS내부의 서버는 웹 서버의 경량버전을 내포한다. 즉, WAS는 동적인 요청을 처리하기 위한 Server Container + 경량 웹 서버 모듈이다.
자바같이 서버 구현 가능한 언어에서는 동적인 웹 요청 처리를 위한 프로세스를 컨테이너에서 관리하도록 하고, 여기에 웹 서버처럼 작동할 수 있도록 웹 서버의 필수 핵심 기능을 더 붙여서 WAS를 개발한게 된다. 그래서 간단한 설정 외 웹 서버에 대한 깊은 설정은 힘듣라.
Apache같은 웹 서버를 사용하는 이유라고 하면, 웹으로 유입되는 네트워크 트래픽을 관리하거나 동적인 영여과 정적인 영역을 분리하는게 좋다여서, SI/SM 같은 회사 전산에서는 굳이 필요하지 않을 수 있다.
대신, 웹/모바일 서비스가 회사의 멩니인 경우 트래픽이 많으면 많을수록 매출로 연결되는데, 안정적인 웹 속도와 사용감을 제공하기 위해서는 웹 서버의 설정이 꼭 필요하다.

2. JSP → 서블릿(Servlet)으로 변환

  • JSP 파일이 처음 요청되면, JSP 엔진.jsp 파일을 서블릿(Java 코드)으로 변환한다.
  • 예를들어, index.jsp라는 JSP 파일이 있다면, 내부적으로 다음과 같은 서블릿 코드로 변환된다.

JSP(index.jsp)

<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <title>JSP 예제</title>
</head>
<body>
    <h2>안녕하세요, JSP!</h2>
    <p>현재 시간: <%= new java.util.Date() %></p>
</body>
</html>

JSP 엔진이 변환한 서블릿 코드(index_jsp.java)

  • JSP 코드가 자바코드(Servlet)으로 변환된다.
  • out.write()를 사용해 HTML을 출력하는 방식
public final class index_jsp extends HttpServlet {
    public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        response.setContentType("text/html;charset=UTF-8");
        JspWriter out = response.getWriter();
        out.write("<html><head><title>JSP 예제</title></head><body>");
        out.write("<h2>안녕하세요, JSP!</h2>");
        out.write("<p>현재 시간: " + new java.util.Date() + "</p>");
        out.write("</body></html>");
    }
}

3. 서블릿 컴파일 및 실행

  • 변환된 .JAVA 서블릿 파일이 Java 컴파일러에 의해 .class 바이트코드 파일로 컴파일된다.
  • 즉, index_jsp.java -> index_jsp.class 파일이 생성된다.
  • 이후, 서블릿 컨테이너(Tomcat)가 이 .class 파일을 실행할 준비를 한다.

4. 요청(Request) 처리 및 응답(Response) 생성

  • HttpServlet을 기반으로 동작하는 서블릿은 클라이언트의 요청(request) 데이터를 읽고, 처리한 후, 응답(response)을 생성한다.
  • 예를 들어, 클라이언트가 로그인 정보를 입력해서 서버로 보낸다면, JSP 내부에서 이를 처리하고 응답 페이지를 생성할 수 있다.

서블릿의 요청 처리 예시

protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    
    String user = request.getParameter("user");
    
    out.println("<html><body>");
    out.println("<h2>안녕하세요, " + user + "님!</h2>");
    out.println("</body></html>");
}

5. 클라이언트에게 응답 전송

  • 최종적으로 서블릿이 생성한 HTML 응답을 웹 서버(Apache)를 통해 클라이언트(브라우저)로 전송한다.
  • 브라우저는 이 HTML을 받아 사용자에게 웹 페이지로 렌더링 한다.

최종적으로 브라우저가 받는 응답 (HTML)

<html>
<head>
    <title>JSP 예제</title>
</head>
<body>
    <h2>안녕하세요, JSP!</h2>
    <p>현재 시간: 2025-02-02 15:00:00</p>
</body>
</html>

📌 JSP 동작 과정 요약

1.사용자가 브라우저에서 .jsp 파일 요청 (예: https://example.com/index.jsp)
2. Apache 웹 서버가 JSP 요청을 Tomcat에 전달
3. Tomcat이 JSP를 서블릿(.java 파일)로 변환
4. JSP 서블릿을 컴파일하여 .class(바이트코드)로 변환
5. Tomcat이 서블릿을 실행하고 요청(request) 데이터를 처리
6. 서블릿이 동적으로 HTML을 생성하여 응답(response)을 반환
7. 클라이언트(브라우저)가 최종 HTML을 받아서 화면에 렌더링


JSP 구성요소

  1. 지시어(Directive)
    • JSP 페이지에 대한 설정을 정의하는 요소
    • 예: <%@ page language="java" contentType="text/html; charset=UTF-8" %>
  2. 스크립트 요소(Scriptlet)
    • Java 코드를 삽입할 수 있는 영역
    • 예: <% int num = 10; %>
  3. 표현식(Expression)
    • 변수나 연산 결과를 출력하는 용도로 사용
    • 예: <%= num * 2 %>
  4. 선언문(Declaration)
    • JSP 페이지에서 변수를 선언하는 부분
    • 예: <%! int count = 0; %>
  5. JSP 액션 태그
    • <jsp:include>, <jsp:forward>, <jsp:useBean> 등을 사용하여 재사용성과 코드 모듈화를 지원

서블릿(Servlet)

서블릿이란?

  • 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양
  • 주로 클라이언트의 요청을 받아 처리하고, 그 결과를 웹 브라우저에 반환하는 역할을 수행한다.
  • 서블릿 vs JSP
    • 서블릿: Java코드 안에 HTML을 포함 Java(HTML)
    • 자바: HTML안에 Java 코드를 포함 HTML(Java)

서블릿의 동작 과정

클라이언트가 웹 서버에 요청하면 웹 서버는 그 요청을 톰캣과 같은 WAS에 위임한다. 그러면 WAS는 각 요청에 해당하는 서블릿을 실행한다. 그리고 서블릿은 요청에 대한 기능을 수행한 후 결과를 반환하여 클라이언트에 전송한다.

1. 클라이언트 요청
2. HttpServletRequest, HttpServletResponse 객체 생성
3. Web.xml이 어느 서블릿에 대한 요청인 것인지 탐색
4. 해당하는 서블릿에서 service() 메소드 호출
5. doGet() 또는 doPost() 호출
6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
7. HttpServletRequest, HttpServletResponse 객체 소멸

web.xml

서블릿을 작성했다면 해당 서블릿을 사용자가 요청한 경로와 매핑시켜야 WAS에서 맵핑된 정보를 읽어 브라우저에 해당 URL로 HTTP 요청 시 해당 서블릿으로 요청을 전달해줄 수 있다. 소스를 분석할 때도 가장 먼저 확인해봐야 할 부분이다. 톰캣을 예로 들면 웹 어플리케이션의 서비스 처리에 대해 정의된 환경 설정 파일이 server 디렉터리의 web.xml에 있다.

서블릿의 생명주기

서블릿도 자바 클래스이므로 실행하면 초기화부터 서비스 수행 후 소멸하기까지의 과정을 거친다. 이 과정을 서블릿의 생명주기라하며 각 단계마다 호출되어 기능을 수행하는 콜백 메서드를 서블릿 생명주기 메서드라고 한다.

서블릿 생명주기 메서드

  • 초기화: init()
    • 서블릿 요청 시 맨 처음 한 번만 호출된다.
    • 서블릿 생성 시 초기화 작업을 주로 수행한다.
  • 작업수행: doGet(), doPost()
    • 서블릿 요청 시 매번 호출된다.
    • 실제로 클라이언트가 요청하는 작업을 수행한다.
  • 종료: destroy()
    • 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출된다.
    • 서블릿의 마무리 작업을 주로 수행한다.

서블릿 작성 예시

public class myServlet extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init method 호출!");
    }
    
    @Override
    public void destroy() {
        System.out.println("destroy method 호출!");
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        System.out.println("doGet service method 호출!");		
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        System.out.println("doPost service method 호출!");		
    }
	
}

Request/Response

HttpServletRequest

  • http 프로토콜의 request 정보를 서블릿에게 전달하기 위해 사용
  • 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드 포함
  • Body의 Stream을 읽어 들이는 메소드 포함

HttpServletResponse

  • 요청을 보낸 클라이언트에게 응답을 보내기 위해 WAS에서 생성되어 서블릿에게 전달됨
  • 서블릿은 이 객체를 이용하여 Content Type, 응답코드, 응답 메시지 등을 전송

profile
Good Luck!

0개의 댓글