웹 어플리케이션의 동작 과정

June Lee·2021년 3월 23일
1

Servlet/JSP

목록 보기
1/7

웹 어플리케이션(HTML 문서를 생성하는 프로그램)은 기본적으로
1. 클라이언트가 서버에 요청을 보낸다.
2. 서버가 클라이언트에 요청에 응답한다.
이 두 가지 과정을 통해 동작한다.

웹의 초창기 HTML, CSS(+JavaScript)를 사용하여 정적인 데이터를 다루던 웹사이트의 경우에는 위와 같은 과정이면 충분했다.

정적 웹페이지와 동적 웹페이지?
정적 웹페이지는 서버에 저장되어 있는 HTML, CSS, JavaScript, 이미지 등 파일을 그대로 읽어오는 형식의 웹페이지를 말한다. 한편, 동적 웹페이지는 서버에 저장된 위와 같은 파일들이 클라이언트의 요청 혹은 다른 요소들(시간, 상황)에 따라 실행 중에 변하는 웹페이지를 말한다. 정적 웹페이지의 경우 서버에 저장된 파일을 변경하지 않는 한 페이지의 내용이 변경될 일이 없다.

그러나 보다 복잡한 비즈니스 로직이 요구되고, 이에 따라 데이터를 동적으로 다뤄야할 필요성이 대두되며, 웹 서버만으로는 커버가 힘들어졌다.
그래서 등장한 것이 웹 어플리케이션 서버(Web Application Server)다. 웹 어플리케이션 서버의 대표적인 예시로는 톰캣(Tomcat)이 있다. 톰캣은 JSP, ASP, PHP를 읽어 기존의 웹 서버(ex. Apache)만으로는 처리할 수 없는 비즈니스 로직을 처리할 수 있게 해준다.

웹 서버와 웹 어플리케이션 서버
웹 서버는 웹 브라우저의 요청(여기서 요청이란 URL이다. 웹 서버는 해당 위치에서 필요로 하는 자원을 찾아서 웹 브라우저로 보내주는 일을 한다)을 받아서 이에 알맞은 결과를 웹 브라우저에 응답해주는 역할을 한다. 웹 어플리케이션 서버는 웹 서버의 요청을 받아 요청에 필요한 로직이나 데이터 베이스와의 연동을 처리한다.
엄밀히 말하면 WAS와 웹 서버는 다른 것이지만, WAS가 웹 서버까지 포함하는 경우가 많기 때문에 이를 통틀어서 웹 어플리케이션 서버라고 부른다.

cf. Flask의 경우에도 파이썬을 이용해 동적 데이터를 처리할 수 있게 만든 마이크로 웹 어플리케이션 서버이다. 그런데, 톰캣과 달리, 플라스크는 오로지 개발용 웹서버만을 포함하고 있기 때문에 웹을 호스팅할 때에는 Flask(웹 어플리케이션 서버)와 함께 외부의 웹서버를 이용해야한다.

사진에서 보듯, WAS는 웹 서버와 웹 컨테이너를 포함한다. 그리고 JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 컨테이너라고 한다.

cf) EJB는 Spring 프레임워크가 상용화되기 이전에 사용했던 컴포넌트 모델이다.


<서블릿 동작 과정>
1. 브라우저에서 웹 서버에 요청을 보낸다.
2. 해당 요청이 서블릿 수행을 필요로 하면, 웹 서버가 이를 인식하여 서블릿 컨테이너에서 요청을 넘겨준다.
3. 서블릿 컨테이너는 쓰레드를 기동하여 해당 서블릿의 객체를 생성하여 이를 수행한다.
4. 서블릿 객체의 작업이 종료되면 쓰레드도 작업을 종료하고 리턴한다.
5. 서블릿 수행 결과가 다시 웹 서버에 전송된다.
6. 웹 서버가 이를 클라이언트에 전송한다.

<서블릿의 Life Cycle>
단 이때 서블릿 클래스(WEB-INF/classes 안에 있다)를 메모리에 로딩하여 인스턴스를 생성하는 과정은 첫 번째 요청에서만 이루어진다. 이후에는 메모리에 남아있는 인스턴스를 이용하여 해당 서블릿 인스턴스로부터 서비스를 받기 때문에 빠른 작업이 가능하다.

여러 클라이언트가 동시에 요청을 한다면 쓰레드 여러 개가 각각 서블릿 객체를 하나씩 생성해서 동시에 service 메소드가 실행되기 때문에 속도가 빠르다.


Servlet과 JSP는 서로 다른 형태이지만, 사실 어느 쪽이든 결국 실행되는 것은 Servlet이다. 즉, WAS가(정확히는 JSP 컨테이너가) JSP를 Servlet 코드로 바꿔주고, 그 서블릿을 실행한 결과를 화면에 보여주는 것이다.

  1. 브라우저가 웹 서버에 요청
  2. 웹 서버가 JSP 컨테이너에 요청
  3. JSP 컨테이너는 해당 JSP 클래스 파일이 있는지 찾아봄
  4. 없을 경우 JSP 페이지를 서블릿 코드로 변환하여 실행
profile
📝 dev wiki

0개의 댓글

관련 채용 정보