본문 바로가기

Spring Framework/JSP

JSP 동작 원리와 Servlet

반응형

오늘은 JSP의 동작 원리에 대해 정리 하려고 합니다. 

 

JSP의 동작 원리를 알기 위해서는 Servlet에 대한 개념을 알아야 합니다 .

 

  • Servlet이란?

서블릿이란 클라이언트의 요청을 처리하고 그 결과를 반환하는 서블릿 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 입니다. 

 

간단하게 한줄로 설명하려고 했지만 한번에 이해가 되질 않습니다. 제가 그랬어요. 그래서 그림을 통해 이해해 보려고 합니다. (그림에 요청과 응답의 화살표가 반대로 되어있네요... 브라우저에서 서블릿 컨테이너로 요청, 서블릿 컨테이너에서 브라우저로 응답으로 보셔야 합니다!)

 

 

1. 먼저 개발자가 서블릿을 담당하는 자바 파일을 생성합니다. 

 

2. 해당 서블릿 파일이 컴파일 되면 서블릿 클래스 파일이 생성되고 해당 파일이 서블릿 컨테이너에 등록 됩니다.      

 

여기 까지가 서블릿을 사용하기 위한 준비 과정입니다. 

 

여기서 궁굼한 점은 서블릿 컨테이너라는 개념 입니다. 

 


 

  • 서블릿 컨테이너란?

서블릿 컨테이너란 말 그대로 서블릿을 담고 관리해주는 컨테이너 입니다.

 

서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿을 관리해주며 클라이언트에서 요청을 하면 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성하여 post, get 여부에 따라 동적인 페이지를 생성하여 응답을 내보냅니다. 

 

HttpServletRequest htttp 프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용하며 헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와 Body의 스트림을 읽어 들이는 메서드를 가지고 있다. 
HttpServletResponse  WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServletResponse 객체를 생성하여 서블릿에게 전달하고 이 객체를 활용하여
content type, 응답 코드, 응답 메시지 등을 전송한다.

 

서브릿 컨테이너는 4가지의 주요 기능을 수행합니다. 

 

1. 생명 주기 관리

 

서블릿의 생명 주기를 관리 합니다. 서블릿 컨테이너가 가동 되는 순간 서블릿 클래스를 로딩해서 인스턴스화하고, 초기화 메서드를 호출하며, 요청이 들어오면 적절한 서블릿 메서드를 찾아서 동작합니다. 그리고 서블릿의 생명이 다하는 순간 가비지 컬렉션을 통해 메모리에서 제거합니다. 

 

하나의 서블릿 코드를 예로 들어 보겠습니다. 

 

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 호출!");		
    }
	
}

 

init() 서블릿이 처음으로 요청될때 초기화를 하는 메서드
클래스를 new 해서 사용하듯 서블릿 클래스도 초기화 해주어야 사용가능하다.
이렇게 초기화된 서블릿은 한번더 해당 서블릿 클래스를 호출하면 초기화가 다시 일어나는 것이 아니라 기존에 있던 서블릿 클래스를 호출한다.
service() 서블릿 컨테이너가 요청을 받고 응답을 내려줄때 필요한 서블릿의 service 메서드
Servlet interface를 구현한 HttpServlet 클래스의 doGet, doPost 같은 메서드들이 호출된다.
destroy() 더이상 사용되지 않는 서블릿 클래스는 주기적으로 서블릿 컨테이너가 destory() 메서드를 호출하여 제거 합니다. 
이렇게 제거된 서블릿은 service메서드들에 해당하는 모든 스레드들이 종료되거나 사용시간이 오래되어 타임아웃된 경우에는 이클래스를 다시 사용하기 위해 init()을 다시 해주어야 한다.

 

 

2. 통신 지원

 

클라이언트의 Request 를 받아주고 response를 보낼수 있게 웹 서버와 소켓을 만들어서 통신을 해줍니다. 

통신을 하기위해 작성하는 소스 코드들을 API로 지원해주고 개발자가 비즈니스 로직에 집중할 수 있도록 만들어 주는 역할을 합니다 .

 

3. 멀티 스레딩 관리

 

서블릿 컨테이너는 해당 서블릿의 요청이 들어오면 스레드를 생성해서 작업을 수행합니다. 

때문에 동시에 여러 요청이 들어와도 멀티스레딩 환경으로 동시다발적인 작업을 관리할 수 잇다. 또한 이렇게 한번 메모리에 올라간 스레드는 다시 생성할 필요가 없기에 메모리 관리에 효율적 입니다.

 

4. 선언적인 보안관리

 

서블릿 컨테이너는 보안 기능을 제공합니다. 

 


 

서블릿 컨테이너에 대한 개념을 정리하기 위해 글이 길어졌습니다. 다시 본론으로 돌아와 서블릿 동작 과정을 이어서 정리하겠습니다. 

 

3. 클라이언트로 부터 서블릿 요청이 들어오면 서블릿 컨테이너는 Servlet request, Servlet Response객체를 생성합니다. 

 

4. 설정 파일을 참고해 매핑할 servlet을 확인합니다. 

 

5. 해당 서블릿 인스턴스 존재의 유뮤를 확인하고 없으면 init() 메서드를 호출하여 생성합니다.

 

6. Servlet 컨테이너에 스레드를 생성하고 service(doGet | doPost)를 실행합니다. 이 과정에서 클라이언트의 요청에서 동적 컨텐츠를 생성해야 한다면 연동된 데이터 베이스에서 데이터를 조회하고 동적 컨텐츠를 생성합니다. 

 

7. 클라이언트에게 response를 보내고 응답을 처리했으면 distroy() 메서드를 실행하여 Servlet request, Servlet Response 객체를 소멸 시킵니다.

 

 

여기 까지가 서블릿의 개념 및 서블릿 동작 방식에 대한 총 정리 입니다. 오늘의 주제를 잠깐 잊으셨던 분들을 위해 본론을 다시 이야기 하자면 JSP의 동작 원리에 대해 정리 하려고 했고 그 동작 원리를 알기 위한 선수 개념으로 서블릿을 정리했습니다. 이제는 JSP의 동작 원리를 정리해 보겠습니다 .

 

 

1. JSP란?

 

JSP는 Java Server Page의 약자로 자바 코드가 들어있는 HTML 코드라고 생각하시면 될것 같습니다.

 

JSP에서 자바 소스 코드는 <% %> 내에 작성되며 이 부분은 웹 브라우저로 보내는 것이 아니라 웹 서버에서 실행되는 부분입니다. 웹 프로그래머가 소스 코드를 수정할 경우에도 디자인 부분을 제외하고 자바 소스코드만 수정하면 되기에 효율을 높여 줍니다. 

 

또한 컴파일과 같은 과정을 할 필요 없이 JSP페이지를 작성하여 웹 서버의 디렉토리에 추가만 하면 사용이 가능합니다. 

 

서블릿 규칙은 꽤 복잡하기 때문에 JSP가 나오게 되었는데 JSP는 WAS에 의하여 서블릿 클래스로 변환하여 사용되어 집니다. 

 

2. JSP 동작 과정

 

웹 서버가 사용자로 부터 서블릿에 대한 요청을 받으면 서블릿 컨테이너에 그 요청을 넘긴다.

 

요청을 받는 컨테이너는 HTTP request.와 HTTP response 객체를 만들어 이들을 통해 서블릿 doPost()나 doGet() 메서드 중 하나를 호출합니다. 

 

서블릿은 데이터의 입력, 수정 등에 대한 제어를 JSP에 넘겨 로직을 수행한 후 컨테이너에게 Response를 전달합니다. 

 

서블릿 컨테이너는 클라이언트에게 응답을 주고 동작이 마무리 됩니다. 

 

 

 

 

반응형

'Spring Framework > JSP' 카테고리의 다른 글

<jsp:include>와 include 디렉티브의 차이점  (0) 2022.01.14
JSP 기본 객체와 영역  (0) 2022.01.14