본문 바로가기
Spring/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

WAS와 서블릿

by hk27 2022. 1. 16.
WAS와 서블릿이 무엇인가요?

 

안녕하세요.

오늘은 WAS와 서블릿에 대해서 알아보겠습니다.

 

 

웹 서버, 웹 애플리케이션 서버(WAS)

웹 서버(Web Server)는 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)를 전송해주는 서비스 프로그램입니다[1].

 

위의 사진에서 웹 서버가 index.html 파일을 제공하는 것을 볼 수 있습니다.

이처럼 웹 서버는 정적 HTML, CSS, JS, 이미지, 영상 등 정적 리소스를 제공한다는 특징이 있습니다. 

정적 리소스는 컴퓨터에 저장된 파일을 의미합니다[2].

저장된 파일을 보내는 것이므로, 누가 요청해도 같은 페이지가 전송됩니다.

 

웹 서버는 복잡한 애플리케이션 로직을 실행하지 않습니다. 

애플리케이션 로직을 수행해서 동적인 리소스를 제공하고자 하면, WAS를 사용합니다.

웹 애플리케이션 서버(WAS - Web Application Server)는 웹 서버 기능과 + 프로그램 코드를 실행해서 애플리케이션 로직을 수행하는 기능을 담당합니다.

서로 다른 이용자가 같은 URL에 들어오면, 다른 페이지를 내보낼 수 있습니다.

예를 들어서 "abc님 안녕하세요!" "def님 안녕하세요!" 처럼요.

이렇게 들어온 요청에 맞게 동적으로 만들어진 리소스를 동적 리소스라고 합니다.

 

WAS를 웹 서버(Web Server)와 웹 컨테이너(Web Container)로 구분할 수 있습니다. 

 

 

웹 서버는 위에서 살펴보았듯 웹 브라우저에 파일을 전송하는 것이며,

웹 컨테이너(=서블릿 컨테이너)는 서블릿의 생명주기를 관리하고, URL과 특정 서블릿을 맵핑하며 URL 요청이 올바른 접근 권한을 갖도록 보장하는 것입니다[3]. 즉 WAS 내부에서 개발자 대신 서블릿을 관리하는 녀석이라고 할 수 있습니다[4]. 

웹 컨테이너는 Client의 요청이 들어오면 적합한 서블릿을 찾고, 서블릿을 호출하여 작업을 수행하고, client에게 응답을 보냅니다. 서블릿이 호출되어 작업이 수행되면 그 내부에서 적합한 애플리케이션 로직이 수행되는 것이죠. 

 

웹 서버와 WAS(웹 애플리케이션 서버)의 차이를 정리해봅시다.

웹 서버는 정적 리소스(파일)를 제공하고, WAS는 애플리케이션 로직을 실행하여 동적 리소스를 제공하며 웹 서버의 기능도 제공합니다. 

그렇다면 웹 서버는 쓰지 않고 WAS만 쓰면 되구나! 라고 생각하실 수 있는데, 웹 서버와 WAS를 둘 다 사용하는 것이 바람직합니다.

정적 리소스는 웹 서버가 처리하고, WAS는 중요한 애플리케이션 로직 처리를 전담합니다. WAS만 사용하면 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있고, WAS에 오류가 나면 오류 화면도 띄울 수 없기 때문입니다.

따라서 아래 사진처럼 클라이언트의 요청이 들어오면 Web Server가 받아서 정적 리소스만 보내면 되면 처리하고, 아니면 WAS로 요청을 넘겨서 WAS에서 애플리케이션 로직을 처리합니다.

 

서블릿(Servlet)

위에서 WAS의 웹 컨테이너는 서블릿을 관리하며 요청이 들어오면 서블릿을 호출해 작업을 수행한다고 말씀드렸습니다.

그렇다면 서블릿은 무엇일까요?

위키백과에서는 서블릿을 아래와 같이 정의합니다[5].

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다.

간단히 말하면, 서블릿은 웹페이지를 동적으로 생성할 때 사용하는 클래스입니다.

 

서블릿이 왜 필요한지를 생각해봅시다.

클라이언트의 요청이 들어오면 서버에서 처리해야 하는 업무가 너무 많습니다.

서버의 TCP/IP, 소켓 연결/종료, 요청, 응답 메시지 관리 등등 할 작업이 너무 많습니다.

가장 중요한 의미 있는 비즈니스 로직에 비해 다른 작업이 너무 많이 필요하죠.

클라이언트의 요청이 들어올 때마다 HTTP 메시지를 파싱해서 처리하기는 너무 힘들겠죠.

이런 것을 처리해주는 것이 서블릿입니다. 

참고로 서버의 TCP/IP, 소켓 연결은 웹 컨테이너(=서블릿 컨테이너)가 담당합니다. 요청마다 들어오는 HTTP 요청 메시지 파싱부터 HTTP 응답 메시지 생성은 서블릿이 담당합니다. 

 

서블릿 동작 방식

다음으로 서블릿의 동작 방식을 살펴봅시다[5].

이 단락의 내용은 아래 티스토리에 정리가 잘 되어있어서 복사해왔습니다. 아랫글에서 서블릿에 대해 상세히 설명해주고 계셔서 참고하시면 좋을 것 같습니다.

https://mangkyu.tistory.com/14

 

[JSP] 서블릿(Servlet)이란?

1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다.  클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해

mangkyu.tistory.com

 

 

 

1. 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송됩니다.

2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.

3. web.xml(설정 파일)을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다. (해당 서블릿 인스턴스 존재의 유무를 확인하여 없으면 init() 메소드를 호출하여 생성합니다[6]) 

4. Servlet Container에 스레드를 생성하고 해당 서블릿에서 service() 메소드를 호출합니다. 클라이언트의 GET, POST 여부에 따라 doGet() 또는 doPost()를 호출합니다. 

5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보냅니다.

6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.

 

(4번에서 스레드가 서블릿의 메소드를 호출하는 것이 궁금하다면 아래의 글을 확인해주세요.

https://passionate.tistory.com/31)

 

서블릿 생명주기

서블릿 객체는 싱글톤(객체가 1개만 생성됨)으로 관리됩니다. 고객의 요청이 올 때마다 계속 객체를 생성하는 것은 비효율적이기 때문입니다. 싱글톤이니 공유 변수 사용에 주의해야 합니다. 

처음 요청이 들어와서 서블릿 객체 인스턴스가 없으면 init() 메소드로 만들고, 이후에는 같은 서블릿 객체 인스턴스로 고객의 요청을 수행합니다. 

종료는 destroy() 메소드로 수행되고, 종료 메소드도 1번만 수행됩니다. 

 

 

인프런  '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 강의를 듣고 공부하며 정리한 자료입니다. 

잘못된 부분은 피드백 주시면 감사하겠습니다. 

글 읽어주셔서 감사합니다 :-)

 

참고자료

[0] 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술, 섹션 1. 웹 애플리케이션 이해 https://www.inflearn.com/course/스프링-mvc-1

[1] https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84

[2] https://binux.tistory.com/32

[3] https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88

[4] http://melonicedlatte.com/web/2019/06/23/210300.html

[5] https://mangkyu.tistory.com/14

[6] https://coding-factory.tistory.com/742

 

 

 

 

댓글