웹 애플리케이션 서버의 역할과 서블릿의 탄생

woody
7 min readMar 14, 2021

--

#웹 서버와 웹 애플리케이션 서버(WAS)의 차이

‘웹 서버’ 란 HTTP 기반으로 동작하는 서버를 말합니다. 보통 내용의 변동이 없는 HTML, css, javascript, 이미지, 영상 등 정적인 리소스를 HTTP(프로토콜)를 통해 제공하는 역할을 합니다.

그렇다면 ‘웹 애플리케이션 서버(WAS)’ 란 무엇일까요?

웹 애플리케이션 서버 또한 HTTP 기반으로 동작하고, 웹 서버 처럼 정적 리소스 제공이 가능합니다. 여기에 플러스로 “프로그램 코드를 실행해서, 애플리케이션 로직 수행” 이 가능한 것이 바로 웹 애플리케이션 서버입니다.

그러면 웹 서버는 정적인 리소스만 제공가능하고, 애플리케이션 로직 수행은 불가능한가요? 묻는다면 그건 ‘NO’ 입니다. 플러그인들을 설치하면 웹 서버도 충분히 애플리케이션 로직 수행이 가능합니다.

그렇기 때문에 둘의 구분이 모호하지만, 웹 서버와 웹 애플리케이션 서버의 차이를 설명하자면 “웹 어플리케이션 서버가 애플리케이션 코드를 실행하는데 더 특화되어있는 서버다” 라고 답할수 있겠습니다.

#웹 애플리케이션 서버는 왜 필요한가?

웹 애플리케이션 서버 하나만으로도 정적 리소스 응답 및 애플리케이션 로직 수행이 가능한데, 왜 굳이 웹 서버와 웹 애플리케이션 서버로 구분하는 걸까요?

이유는 애플리케이션의 동작을 생각해보면 쉽습니다.

애플리케이션은 프로그래머가 직접 작성한 프로그램으로 잘못된 로직 작성으로 쉽게 죽을수 있고, db와 연결해서 데이터를 가져오는 와중에 db 응답의 지연으로 요청 처리속도가 늦어질수 있습니다. 즉, 애플리케이션 동작은 비싸다 라고 표현할수 있겠습니다.

이런 비싼 애플리케이션 수행뿐만 아니라 정적 리소스를 제공하는 역할까지 서버가 수행한다면 서버는 너무 바빠 정작 중요한 애플리케이션 로직을 수행하지 못할수 있습니다.

그렇기 때문에 아래 그림처럼 정적 리소스를 제공하는 전용 서버로 웹 서버를 두고, 웹 애플리케이션 서버는 중요한 애플리케이션 로직만 전담 처리하도록 웹 시스템을 구성하게 되었습니다.

웹 시스템 구성

각 역할에 따라 전담 서버를 두는 위와같은 시스템 구성이 주는 이점은 또 있습니다. 바로 리소스에 따라 서버 관리가 쉬워집니다. 예를들어 우리 회사의 웹 사이트는 이미지같은 정적 리소스가 많이 사용된다면 웹 서버를 증설하면 되고, 만약 애플리케이션 리소스가 많아진다면 앱 애플리케이션을 증설하면 되겠지요!

#Servlet이 탄생하기 전으로 돌아가보자

애플리케이션 수행을 담당하는 웹 애플리케이션 서버가 처리해야하는 업무들을 차근차근 나열해 보면 아래와 같습니다 .

  1. 서버 TCP/IP 연결 대기, 소켓 연결
  2. HTTP 요청 메시지를 파싱해서 읽기
  3. HTTP 메소드 파악 및 url 파악
  4. content-type 확인
  5. HTTP 메시지 바디 내용 파싱하여 의미있는 데이터 추출
  6. 저장 프로세스 실행
  7. 비즈니스 로직 실행 ( + 데이터베이스에 저장 요청)
  8. HTTP 응답 메시지 생성
  9. TCP/IP 에 응답 전달, 소켓 종료

서블릿이 나오기 전에는 위의 일련의 모든 과정들을 모두 개발자들이 손수 프로그래밍 해야했습니다. 하지만 위의 과정에서 비즈니스에 따라 새로 변경되거나 추가되어 수정과 변경이 잦은 부분은 ‘7. 비즈니스 로직 실행’ 뿐이고, 나머지 과정들은 매번 동일합니다.

그래서 수정과 변경이 잦은 의미있는 비즈니스 로직 개발에만 개발자들이 집중할수있도록 하고, 나머지 모든 과정들은 템플릿처럼 미리 제공하는건 어떨까 라는 생각에서 나오게 된것이 바로 ‘서블릿’ 입니다. 서블릿의 지원으로 개발자들은 비즈니스 로직 개발에만 집중 할수 있게되었습니다.

#Servlet을 총괄하는 Servlet Container

위에 HelloServlet 예제 코드를 통해 Servlet을 작성하는 방법을 간단하게 살펴 보았습니다. 하지만 코드를 살펴보면 어디에서 HelloServlet 인스턴스를 생성하는 곳이 존재하지 않습니다. 그 역할을 하는것이 바로 서블릿 컨테이너입니다.

HelloServlet 예제 처럼 개발자는 애플리케이션 로직만 작성하고 서블릿 컨테이너라는 것이 서블릿 인스턴스를 싱글톤으로 생성하고, 해당 인스턴스의 초기화, 호출, 종료 라는 전체 생명 주기를 관리하게 됩니다.

서블릿 컨테이너의 주요 역할은 아래와 같습니다.

  • 서블릿 객체의 생성, 초기화, 호출, 종료하는 생명주기를 관리
  • 서블릿 객체를 싱글톤으로 관리하여, 객체를 미리 만들어 두고 재활용하는 방식 (즉, 모든 고객의 요청은 동일한 서블릿 객체 인스턴스에 접근하게 됨)
  • 동시 요청을 위한 멀티 쓰레드 처리 지원

#Servlet 을 다시 정의해보자

결국 서블릿은 JVM(java virtual machine) 기반에서, ‘웹 개발을 하기 위한 명세이자 API’ 라고 정의할수 있습니다. 즉, 자바에서 HTTP 요청과 응답을 처리하기 위한 내용을 담고있다고 볼수 있습니다.

#Servlet의 생명 주기(life cycle)

서블릿 컨테이너에서 context가 초기화되면 서블릿이 가지고 있는 life cycle이 시작됩니다.

서블릿의 생명주기는 ‘초기화’, ‘서비스’, ‘소멸’ 로 크게 3단계로 구성됩니다.

  • 초기화 단계 : 이 단계에서는 클래스 로더에 의해 로드된 서블릿의 인스턴스를 생성 하고, 생성에 필요한 리소스 로드 등 클래스 생성자의 초기화 작업과 동일한 역할을 수행합니다. init() 메소드는 초기화에 대응되는 메서드 이므로, 여러번 호출해도 딱 한 번만 호출됩니다.
  • 서비스 단계 : 서비스 단계에서는 요청에 적합한 비즈니스 로직 수행을 위해, 클라이언트의 HTTP 요청 메소드에 따라 호출할 메서드를 결정합니다.
  • 소멸 단계 : 서블릿을 언로드 합니다.

#서블릿과 URL 맵핑 (어노테이션 방식과 xml 을 통한 설정 방식)

스프링 MVC를 사용하면 URL 맵핑을 편하게 도와주는 @WebServlet(“/endpoint”) 어노테이션을 사용해 쉽게 서블릿과 URL을 맵핑할수 있지만, 어노테이션이 존재하기전에는 xml 파일 설정으로 맵핑을 하였습니다.

아래와 같이 xml 설정은 ‘servlet 태그’와 ‘servlet-mapping 태그’로 구성 되어 있으며, servlet-mapping 태그에 servlet의 name(별칭)과 해당 별칭에 매칭될 URL을 작성합니다.

xml 을 통한 서블릿와 URL 맵핑

이 xml 설정은 그대로 어노테이션 설정과 호환되어 아래와 같이 작성 가능합니다.

어노테이션을 통한 서블릿과 URL 맵핑

이렇게 설정한 xml 설정 또는 어노테이션의 정보는 서블릿 초기화 시 전달 됩니다.

#참고 강의 및 도서

(강의) 스프링 MVC 1편 — 백엔드 웹 개발 핵심 기술 :

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

(도서) 스프링 부트로 배우는 자바 웹 개발

--

--

woody
woody

Written by woody

딱 1%가 모든것을 바꾼다

No responses yet