[Java]JSP의 처리 과정 | 구성요소, servlet, request/response

dyomi·2024년 7월 26일

JSP를 처리하기 위해선 JSP파일서블릿 컨테이너, 그리고 웹 서버가 필요하다.

JSP 파일은 HTML에 java 코드가 들어간 파일이며, 서블릿 컨테이너는 JSP파일을 서블릿으로 변환하고 실행하는 역할을 한다.

서블릿이란?

서블릿이란 클라이언트의 요청을 처리하고, 그 결과를 반환하는 서블릿 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다. 즉, 클라이언트가 어떤 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램을 말한다.

서블릿은 자바 서블릿 API를 사용하여 작성되며, 일반적으로 HttpServlet 클래스를 상속받아 구현된다. 서블릿을 작성하려면 doGet, doPost 등의 메서드를 오버라이딩하여 HTTP 요청에 대한 처리를 구현하게 된다.

서블릿의 동작 과정은 다음과 같다.

  1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송한다.
  2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾는다.
  4. 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출한다.
  5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보낸다.
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.

서블릿 컨테이너란?

서블릿 컨테이너란 서블릿을 관리해주는 컨테이너이다. 서블릿이 정의서라면 컨테이너는 그 정의서를 보고 수행한다고 볼 수 있다.

클라이언트 요청을 받아주고 응답을 할 수 있게 웹 서버와 소켓으로 통신하며 JSP(자바 서버 페이지)와 서블릿이 작동하는 환경을 제공해준다. 대표적으로 톰캣이 있다.

서블릿 컨테이너의 역할은 다음과 같다.

  1. 웹 서버와의 통신 지원
  2. 서블릿 생명주기(Life Cycle) 관리
  3. 멀티쓰레드 지원 및 관리
  4. 선언적인 보안 관리

서블릿의 생명 주기

  1. 클라이언트 요청이 들어오면 컨테이너는 서블릿이 메모리에 있는지 확인하고, 없으면 init() 메서드를 호출하여 서블릿을 초기화한다. init() 메서드는 한 번만 실행된다.
  2. init()이 호출된 후, 클라이언트 요청에 따라 service() 메서드가 호출되고, 이는 doGet() 또는 doPost()로 분기되어 요청을 처리한다. 이때 HttpServletRequest와 HttpServletResponse 객체가 제공된다.
  3. 컨테이너가 서블릿에 종료 요청을 하면, destroy() 메서드가 호출되어 서블릿이 소멸된다. destroy() 메서드도 한 번만 실행된다.

웹 서버란?

웹 서버는 보통 정적인 컨텐츠를 응답하는 역할을 하며, 동적 페이지를 요구하는 응답이 왔을 경우, 서블릿 컨테이너로 요청을 전달한다.

JSP 처리 과정

  1. 우선 요청이 들어오면 웹 서버는 요청을 받아서 서블릿 컨테이너로 전달한다.
  2. 서블릿 컨테이너는 요청된 JSP 파일을 찾아서 서블릿 자바 파일로 변환한다.
    이 과정은 처음 요청시 한번만 수행하고, 수정이 있을 경우에만 다시 수행한다.
  3. 이 자바 파일을 컴파일해서 클래스 파일로 저장한 뒤 실행한다. (서블릿의 service() 메서드 호출)
  4. 서블릿은 요청 객체(HttpServletRequest)와 응답 객체(HttpServletResponse)를 사용해서 요청을 처리하고 응답 데이터를 생성한 뒤, 클라이언트로 전송한다.

서블릿 vs JSP

서블릿은 자바 소스코드 속에 HTML코드가 들어가 있는 형태이다.
JSP는 반대로 HTML 코드 속에 자바 코드가 들어가 있는 구조이다.

웹 서버가 사용자로부터 서블릿에 대한 요청을 받으면 서블릿 컨데이너에 그 요청을 넘긴다.
요청 받은 컨테이너는 HTTP Request와 HTTP Response 객체를 만들어서 서블릿 doPost, doGet 메서드 중 하나를 호출한다.

서블릿 -> 로직 실행 후, 결과는 out객체의 println메서드를 사용해서 HTML문서 작성
JSP -> 비즈니스 로직과 프리젠테이션 로직 분리, jsp 파일을 서블릿으로 변환(.java)하고 컴파일을 통해 .class 생성

만약 JSP라는 개념이 없다면

동적인 페이지를 요청할 경우, 모든 응답을 println 메서드를 사용해서 HTML 코드를 문자열로 작성해야한다.
비즈니스 로직과 화면 로직이 한 곳에 섞여 있어 가독성이 떨어지고, 만약 HTML 변경이 필요하다면 코드 변경 후 서블릿을 재컴파일을 해야 하는 단점이 있다.

반면, JSP는 HTML 코드에 java 코드가 들어가 있는 구조로 동적 콘텐츠를 생성할 수 있고, 비즈니스 로직과 프레젠테이션 로직을 분리할 수 있다.



🌟 추가 질문

📍 서블릿 컨테이너 즉, 톰캣이 요청을 받았을 때 그 요청을 어떤 서블릿으로 전달해야 되는지 어떻게 알 수 있을까?

Web.xml 파일에서 사용할 서블릿을 등록하고, 요청 URL에 맞는 서블릿들을 매핑해준다.



참고 자료
[JSP] 서블릿(Servlet)이란?
jsp 필수 이해 요소(servlet,jsp처리과정, 버퍼)

profile
기록하는 습관

0개의 댓글