자바시리즈 2 - Servlet의 등장(이라 쓰고 Web Server, WAS의 내용을 담은,,)

Taeseon Kim·2023년 4월 4일
0

지난 시리즈에서 기술한 바와 같이, 동적 페이지를 만들기 위해 자바 애플릿이 사용되었고, 시간이 지남에 따라 동적 페이지에서 요구하는 데이터의 양이 방대해지기 시작하면서 자바 애플릿 태그로 프로그램을 다운받아 사용하는 방식에서 CGI라는 방식이 등장했다.

여기서 잠깐, 정적 페이지와 동적 페이지의 차이에 대해 다시 짚고 간다.
정적 페이지 - 파일 경로를 받아 경로에 맞는 페이지를 반환한다. 이미 만들어져 있는 html, css, image와 같은 컴퓨터에 저장된 파일을 반환하는 것
동적 페이지 - 동적 페이지는 인자를 받아 인자에 맞는 페이지를 반환한다. 인자를 처리하는 로직이 필요하며, 웹 서버에 의해 실행되는 프로그램의 로직을 통해 만들어진 결과물을 반환하는 것

결국 정적 페이지와 동적 페이지는, 이미 만들어져 있는 페이지를 반환하느냐, 사용자에 따라 변화된 페이지를 반환하느냐의 차이라고 볼 수 있다.

CGI


CGI는 Common Gateway Interface의 약자로, 오늘 내용의 맥락에서 간단히 설명하자면, 로직을 처리하는 플랫폼 독립적인 프로그램이라고 할 수 있다.
여기에서 중요한 점은, 동적 페이지를 구현할 수는 있으나, 매 요청마다 새로운 프로세스를 생성한다. 심지어 같은 요청일 때까지도.
결국 이용자가 많아지거나 요청이 많아지면 서버의 부하가 커지고, 심지어는 서버가 죽어버리는 현상이 발생한다.

Servlet

이러한 상황에 자바 진영에서는 Servlet이라는 기술이 등장한다.
Servlet은 동적 페이지를 만들기 위한 자바 클래스의 일종이다. WAS 내부의 웹 컨테이너 혹은 서블릿 컨테이너 안에서 동작한다.

간단히 Servlet의 구동 방식을 기술하자면,

  1. WAS의 Servlet 컨테이너를 통해 요청에 관한 쓰레드가 생성된다.
  2. 이때 HttpServletRequest 객체와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.
  3. 쓰레드는 Servlet의 메서드를 호출하여 로직을 수행한다.
  4. 로직을 통해 생성된 Response를 HttpServletResponse 객체 형태로 바꾸어 Web Server로 전달한다.
  5. Servlet 컨테이너는 해당 요청에 관한 쓰레드를 종료하고, 생성된 HttpServletRequest 객체와 HttpServletResponse 객체를 제거한다.

위와 같은 구동 방식으로 알 수 있는 Servlet의 특징을 간단히 정리해보자면,

  • 동적 페이지를 위한 로직 처리를 수행한다.(CGI의 역할 대체)
  • 요청 시작과 끝에서 Web Server와 연결하는 소켓 통신을 지원한다.
  • 클라이언트의 요청마다 새로운 쓰레드를 생성하기 때문에 멀티 쓰레딩 환경을 지원한다.
  • 요청에 대한 응답과 함께 쓰레드를 종료하기 때문에 요청마다 프로세스를 생성하는 CGI보다 메모리 관리에 효율적이다.

Servlet의 response는 html로 응답한다. 즉 자바 프로그램에 html을 담은 것이다.(다음 포스팅은 html에 자바를 담은 jsp를 다룰 것이다.)

여기서 잠깐, Web Server와 WAS는 어떻게 다를까?

Web Server

흔히 '웹 서버'를 칭할 때는 하드웨어와 소프트웨어 두 가지를 모두 웹 서버라고 한다.

하드웨어 - 우리가 흔히 말하는 서버컴퓨터와 같은 하드웨어이다. 서버 컴퓨터에는 소프트웨어 의미의 웹 서버가 설치되어 있다.

소프트웨어 - 웹 브라우저(client)로부터 http 요청을 받고, 컨텐츠를 반환하는 프로그램이다.

이번 포스팅이 다룰 웹 서버는 소프트웨어 웹 서버이다.

위에 기술했듯, 웹 서버는 컨텐츠를 반환하는 프로그램이다. 즉 image, html문서와 같은 정적 컨텐츠를 반환할 수도 있지만, WAS를 통해 구현된 동적 컨텐츠를 반환할 수도 있다.
(사실 Web Server 입장에서 보면, WAS를 통해 구현된 동적 페이지는 결국 html 코드*이며, 이미 '동적'이라는 서술을 붙이기 위한 처리를 WAS에서 완료한 상태이기 때문에 정적 페이지와 다를 바가 없다.)

결론적으로 Web Server의 역할은 둘 중 하나를 수행하게 된다.

  • image, html과 같은 정적 컨텐츠 반환
  • 동적 페이지 요청이 들어올 경우 해당 요청을 WAS에 전달

WAS

WAS는 Web Application Server의 약자로, http 프로토콜을 통해 어플리케이션을 수행해주는 미들웨어이다.
db 조회나, 다양한 로직 처리를 담당하여 동적 컨텐츠를 제공하기 위해 만들어진 서버이다.
사실 Web Server의 정적 컨텐츠 응답 기능을 WAS도 수행할 수는 있지만, WAS에서 처리할 경우 해당 정적 컨텐츠 요청에 대한 소켓 통신, 쓰레드 생성 및 처리가 동반되어야 하기에 Web Server에서 처리하는 것보다 거쳐야 할 절차가 많아진다.(물론 Web Server 없이 단독으로 사용할 경우 이렇게 해야 한다..)
따라서 주 기능은 Web Container 혹은 Servlet Container를 사용하는 것이며, WAS를 해당 이름으로 부르기도 한다.

Web Server와 WAS를 114 상담으로 예를 들자면,

우리가 휴대폰 관련하여 114에 전화를 하면 상담원이 전화를 받아 상담을 진행한다. 이 때 4만원 대 요금제가 어떤 것이 있는지를 묻는다면(요청),
상담원은 본인이 머릿속에 기억하고 있는(정적 컨텐츠) 요금제를 알려 줄것이다(응답).
하지만 현재 내가 사용하고 있는 요금제들을 총합해 결합 할인을 받고 싶다고 할 때(요청),
상담원은 본인 앞에 놓인 컴퓨터(WAS)를 통해 나의 가입 정보를 조회하고, 결합 할인에 대입(Servlet 로직)하여 가장 큰 할인을 받을 수 있는 정보(Servlet을 통해 나온 컨텐츠)를 알려 줄 것이다(응답).
물론 내가 4만원 대 요금제가 어떤 것이 있는지를 물었을 때, 기억을 사용하지 않고 컴퓨터를 통해 조회해보고 알려줄 수 있겠지만, 손을 움직이기도 귀찮고, 컴퓨터를 통해 다른 업무를 볼 수 있기에 확실히 기억나는 것은 바로 말해주는 것이 효율적일 것이다.

이정도면 Web Server와 WAS의 정리가 끝났을 것이라 생각하고,

작동원리 정리

결론적으로 오늘 다룬 Web Server, WAS, Servlet이 동작하는 원리를 서술하자면,
(client - web server - was - db 의 형태로 어플리케이션을 구성했을 경우를 가정한다.)

  1. 클라이언트의 요청이 만약 정적 컨텐츠라면, 웹 서버 단에서 바로 응답을 보낸다.
  2. 요청이 만약 동적 컨텐츠라면, 요청을 먼저 웹서버에서 받아 was에 보내 관련된 servlet을 메모리에 올린다.
  3. was는 web.xml을 참조해 메모리에 올라간 servlet에 대한 쓰레드를 생성한다.
  4. 이때 HttpServletRequest 객체와 HttpServletResponse 객체를 생성하여 servlet에 전달한다.
  5. 쓰레드는 servlet의 메서드를 호출하고, 해당 메서드는 로직을 통해 db에 접근하여 response를 작성하고, 이를 was에 전달한다.
  6. was는 response를 HttpServletResponse 객체의 형태로 바꿔 웹 서버로 전달한다.
  7. was는 생성된 쓰레드를 종료하고, HttpServletRequest 객체와 HttpServletResponse 객체를 제거한다.
profile
공부하여 이해가 된 것만 정리합니다.

0개의 댓글