- 서버 사이드 스크립트 언어란?
- 클라이언트가 요청하면 서버에서 실행되어 HTML을 생성한 후 응답을 보내는 방식
- JSP는 서버에서 실행된 후, 완성된 HTML을 클라이언트(브라우저)로 보내기 때문에 서버사이드 스크립트 언어라고 부른다.
request
, response
, session
, application
등의 내장 객체를 기본적으로 제공하며, 개발 편의성을 높인다..jsp
파일을 요청하면, 웹 컨테이너(예: Tomcat)가 이를 처리한다..class
파일(bytecode)로 컴파일되고 실행된다.request
데이터를 처리하고 HTML 등의 결과를 생성하여 response
로 반환한다.http://example.com/index.jsp
같은 URL을 입력하면, 해당 요청이 웹 서버(Apache 등)로 전달된다..jsp
파일 요청을 감지하면, JSP 처리를 담당하는 웹 컨테이너(Tomcat 등)에게 요청을 넘긴다.웹 서버(Web Server) vs 웹 애플리케이션 서버(WAS) vs 웹 컨테이너(Web Container)
아파치 톰캣의 구조를 기반으로 알아보자!
+) 🧐 WAS안에 WebServer가 있는데 왜 WebServer를 사용하는 걸까?
WAS내부의 서버는 웹 서버의 경량버전을 내포한다. 즉, WAS는 동적인 요청을 처리하기 위한 Server Container + 경량 웹 서버 모듈이다.
자바같이 서버 구현 가능한 언어에서는 동적인 웹 요청 처리를 위한 프로세스를 컨테이너에서 관리하도록 하고, 여기에 웹 서버처럼 작동할 수 있도록 웹 서버의 필수 핵심 기능을 더 붙여서 WAS를 개발한게 된다. 그래서 간단한 설정 외 웹 서버에 대한 깊은 설정은 힘듣라.
Apache같은 웹 서버를 사용하는 이유라고 하면, 웹으로 유입되는 네트워크 트래픽을 관리하거나 동적인 영여과 정적인 영역을 분리하는게 좋다여서, SI/SM 같은 회사 전산에서는 굳이 필요하지 않을 수 있다.
대신, 웹/모바일 서비스가 회사의 멩니인 경우 트래픽이 많으면 많을수록 매출로 연결되는데, 안정적인 웹 속도와 사용감을 제공하기 위해서는 웹 서버의 설정이 꼭 필요하다.
.jsp
파일을 서블릿(Java 코드)으로 변환한다.index.jsp
라는 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>
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>");
}
}
.JAVA
서블릿 파일이 Java 컴파일러에 의해 .class
바이트코드 파일로 컴파일된다.index_jsp.java
-> index_jsp.class
파일이 생성된다..class
파일을 실행할 준비를 한다.HttpServlet
을 기반으로 동작하는 서블릿은 클라이언트의 요청(request) 데이터를 읽고, 처리한 후, 응답(response)을 생성한다.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>");
}
<html>
<head>
<title>JSP 예제</title>
</head>
<body>
<h2>안녕하세요, JSP!</h2>
<p>현재 시간: 2025-02-02 15:00:00</p>
</body>
</html>
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을 받아서 화면에 렌더링
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<% int num = 10; %>
<%= num * 2 %>
<%! int count = 0; %>
<jsp:include>
, <jsp:forward>
, <jsp:useBean>
등을 사용하여 재사용성과 코드 모듈화를 지원Java(HTML)
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에 있다.
서블릿도 자바 클래스이므로 실행하면 초기화부터 서비스 수행 후 소멸하기까지의 과정을 거친다. 이 과정을 서블릿의 생명주기라하며 각 단계마다 호출되어 기능을 수행하는 콜백 메서드를 서블릿 생명주기 메서드라고 한다.
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 호출!");
}
}