본문 바로가기
백엔드(Back-End)/Spring MVC

웹 서버(Web Server), 웹 애플리케이션 서버(Web Application Server), 자바 서블릿(Java Servlet) 정리

by TwoJun 2023. 11. 2.

Spring MVC

웹 서버와 웹 애플리케이션 서버(WAS)의 차이점, 특징 자바 서블릿(Java Servlet)에 대해 정리해 보고자 한다.

 

 

1. 웹 서버와 웹 애플리케이션 서버

1-1. 개요

웹 서비스는 HTTP(HyperText Transfer Protocol) 기반 위에서 동작한다.

 

(1) 웹 브라우저에서 특정 URL로 접속하면 인터넷을 통해 해당 서버에 요청을 보내어 관련된 서버가 요청에 맞는 응답을 다시 웹 브라우저로 전송한다.

 

(2) 이때 클라이언트 서버 간 통신에는 HTTP이 사용된다.

 

 

 

 

1-2. 웹 생태계에서의 모든 동작이 HTTP 기반 위에서 동작한다.

HTML, 텍스트 문서, 이미지, 음성, 영상, 파일, JSON, XML(API), 서버 간 데이터를 주고받을 때도 대부분 HTTP를 사용한다.

 

 

 

 

 

2. 웹 서버(Web Server)

2-1. 웹 서버(Web Server)의 정의

클라이언트 요청에 의한 웹 서버의 응답

 

(1) 웹 서버란 HTTP를 기반으로 클라이언트가 웹 브라우저에서 요청 시 해당 요청을 받아 정적 콘텐츠를 제공하는 서버를 의미한다. 여기서 정적 콘텐츠란 요청을 받은 이후 별도의 처리 없이 미리 만들어진 단순한 HTML 문서, CSS, 이미지, 파일 등 즉시 응답 가능한 콘텐츠를 말한다.

 

 

 

2-2. 웹 서버의 특징

(1) 정적 리소스(이미 만들어졌거나 미리 정제된 파일) 제공

(2) 대표적인 웹 서버 : NGINX, APACHE

 

 

 

 

 

3. 웹 애플리케이션 서버(WAS, Web Application Server)

3-1. 웹 애플리케이션 서버의 정의

클라이언트 요청에 의한 WAS의 응답

 

(1) 간단히 WAS라고도 부르는 웹 애플리케이션 서버(Web Application Server)는 웹 서버와 동일하게 HTTP를 기반으로 동작하며 단순히 웹 서버가 제공하는 기능을 넘어서 동적 콘텐츠를 제공하기 위한 서버라고 보면 된다.

 

(2) 사용자의 요청에 대해 데이터베이스 조회나 복잡한 서비스 로직 수행이 가능하고 해당 로직이 수행된 결과물인 동적인 콘텐츠를 응답으로 제공해 줄 수 있다.

 

(3) 위에서 언급된 것처럼, 웹 서버의 기능을 대부분 포함하면서 프로그램 코드를 실행해서 애플리케이션의  정밀한 로직을 수행할 수 있다.

 

(4) WAS는 JSP, Servlet의 구동 환경을 제공해 주기 때문에 Servlet Container(서블릿 컨테이너) 또는 Web Container(웹 컨테이너)라고도 부른다.

 

(5) 이러한 WAS는 웹 애플리케이션이 제공하는 서버 사이드 기능을 구조적으로 분리해서 처리하고자 하는 목적으로 설계되었다. 트랜잭션, 보안, 메시징 처리, 스레드 처리 등의 다양한 기능을 처리하는 분산 환경에서 사용될 수 있다. 또한 웹 애플리케이션 실행 환경과 데이터베이스 접속 기능을 제공하고 여러 개의 트랜잭션 관리, 비즈니스 로직 수행 등 다양한 작업을 처리할 수 있다.

 

(6) 잘 알려진 WAS로는 Tomcat(톰캣), Jetty, WebSphere 등이 있다.

 

 

 

 

 

 

4. 웹 서버와 웹 애플리케이션 서버(WAS)의 차이점

(1) 웹 서버는 정적 리소스를 제공하고 WAS는 웹 서버의 기능과 더불어 애플리케이션의 정교한 로직까지 함께 수행할 수 있다.

 

(2) 사실상 웹 서버와 WAS 간의 용어의 경계가 모호한 편이다

- 웹 서버도 플러그인 등의 프로그램을 실행하는 기능을 포함하기도 한다.

- WAS도 웹 서버의 기능을 제공하고 있다.

 

(3) 자바의 경우 서블릿 컨테이너의 기능을 제공하고 있으면 WAS로 일반적으로 취급한다.

 

(4) 정리해 보자면 WAS는 애플리케이션의 로직이나 코드를 수행하는 데 더 특화되어 있다고 보면 된다.

 

 

 

 

 

 

5. 웹 시스템을 구성하기 위한 최소한의 구성 - WAS + 데이터베이스(DB)

5-1. WAS, DB만으로 최소한의 시스템을 구성할 수 있다.

웹 시스템을 구성하기 위한 최소한의 구성 - WAS + 데이터베이스(DB)

 

(1) WAS는 정적 리소스와 애플리케이션의 서비스 기능(로직 수행)을 모두 수행할 수 있다.

 

 

 

 

5-2. 문제점

(1) WAS가 너무 많은 역할을 담당하게 되면 서버 과부하 위험이 높아지게 된다

 

(2) 정적 리소스를 제공하는 경우 시스템적인 측면에서는 비용이 적게 드는 작업이다. 하지만 애플리케이션의 로직을 수행하는 경우는 큰 비용이 발생하는 작업이기 때문에 정적 리소스 때문에 애플리케이션의 중대한 로직이 수행되는 부분을 방해하면 안 된다.

 

(3) WAS가 만약에 여러 가지 이유 때문에 다운될 경우 오류가 발생했을 때를 대비한 오류 페이지도 노출할 수 없다.

 

 

 

 

 

6. 해결 방법 - 웹 시스템 구성 : 웹 서버 + WAS + 데이터베이스(DB)

해결 방법 - 웹 시스템 구성 : 웹 서버 + WAS + 데이터베이스(DB)

 

(1) 위와 같은 문제를 해결하기 위해, 웹 서버와 WAS를 분리하는 아키텍처를 가져가야 한다. 이유는 다음과 같다.

 

 

 

6-1. 서버 부하 방지

(1) 정적 콘텐츠는 웹 서버에서 처리하고 애플리케이션 로직 수행, 데이터베이스 조회 등과 같은 동적인 처리가 필요할 경우 WAS에게 해당 요청을 위임한다. 만약 정적 콘텐츠까지 WAS에서 처리한다면 서버의 부하가 커지게 되고 애플리케이션 성능에 큰 영향을 주게 된다. 

 

 

 

6-2. 보안 강화

(1) SSL에 대한 암호화(Encryption), 복호화(Decryption) 처리에 웹 서버를 사용할 수 있다.

 

 

 

6-3. 여러 대의 WAS 연결 가능 - 효율적인 리소스 관리

(1) 로드 밸런싱 기술을 위해 웹 서버를 사용하고 여러 개의 서버를 사용하는 대용량의 웹 애플리케이션의 경우 웹 서버와 WAS를 분리하여 무중단 운영, 장애 발생 시 대응에 효과적이다. 

 

(2) 정적 리소스 사용률이 증가하면 웹 서버를 증설하고 애플리케이션 로직 수행과 같은 동적 처리 비율이 증가하면 WAS를 증설한다.

 

(3) WAS, DB 장애 발생 시 웹 서버가 오류 화면을 제공하게 된다.

 

 

 

 

 

 

7.  자바 서블릿(Java Servlet)

7-1. 서블릿이란?

(1) 클라이언트의 요청에 맞게 웹 페이지를 동적으로 생성하는 서버 사이드 프로그램을 의미한다.

 

 

 

7-2. 서블릿이 필요한 이유

의미있는 비즈니스 로직은 사실상 몇 줄 되지 않는다.

 

(1) 위의 과정을 살펴보면 사실상 의미 있는 비즈니스 로직은 초록색 영역으로 강조된 부분이다. 이 로직을 수행하기 위해 개발자가 처리해 줘야 할 전/후 단계가 상당히 많은 것을 확인할 수 있다.

 

(2) 전/후 단계를 모두 구현하기엔 상당히 비효율적이라는 것을 알 수 있다. 이 문제를 어떻게 해결할까?

 

 

 

 

7-3. 문제 해결 : 서블릿의 탄생

(1) 위와 같은 문제 해결을 위해 서블릿(Servlet)이 나오게 된다.

 

(2) 서블릿은 위의 초록색 영역인 비즈니스 로직을 제외한 모든 과정을 지원하고, 서블릿 기능을 제공하는 WAS가 해당 기능을 수행하게 된다.

 

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 애플리케이션 로직
    }
}

 

(3) @WebServlet 어노테이션 내부의 urlPattern의 속성값인 /hello URL로 클라이언트에서 서버로 요청이 왔을 때 service() 메서드가 호출되어 실행된다.

 

(4) HttpServletRequest는 HTTP 요청 정보를, HttpServletResponse를 편리하게 사용할 수 있는 객체이다.

 

(5) 위와 같은 서블릿을 통해 개발자는 HTTP 스펙을 편리하게 사용할 수 있다.

 

 

 

 

7-4. 서블릿의 동작 방식

서블릿의 동작 방식

 

(1) 웹 브라우저의 요청이 오게 되면 WAS는 요청 정보를 기반으로 Request, Response 객체를 새로 생성한다.

 

(2) 서블릿 객체에게 이전에 생성한 Request, Response를 파라미터로 넘겨주어 서블릿을 실행한다.

 

(3) Request 객체에서 HTTP 요청 정보를 꺼내서 사용하고 Response 객체에 담긴 HTTP 응답 정보를 꺼내서 편리하게 쓸 수 있다.

 

(3) 모든 처리 이후 Response 객체 정보를 기반으로 HTTP 응답 메시지를 생성하고 해당 결과를 클라이언트 측으로 반환한다.

 

 

 

 

7-5. 서블릿 컨테이너(Servlet Container)

Servlet Container

 

- 우선 서블릿 컨테이너란 서블릿과 웹 서버가 쉽게 통신할 수 있도록 해 주고 소켓 생성, listen, accept 등 통신 연결에 필요한 과정을 API 형식으로 제공하여 서블릿 동작의 핵심이 되는 컨테이너를 의미한다.

 

(1) 서블릿을 제공하는 WAS 내부에는 서블릿 컨테이너가 존재한다. 해당 컨테이너는 특정 서블릿 객체를 자동으로 생성해 주고 호출하는 역할을 수행해 준다. 또한 별도의 라이프 사이클을 갖고 있는데 WAS가 종료될 때 서블릿을 같이 종료시킨다.

 

(2) 서블릿을 지원하는 WAS를 서블릿 컨테이너라고도 한다.

 

(3) 이러한 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 전체적인 라이프 사이클을 관리한다.

 

(4) 서블릿 객체는 Singleton 형태로 관리되기 때문에 주의사항이 있다.

- 고객의 요청이 올 때마다 서블릿 객체를 계속 생성하는 것은 매우 비효율적이다. (단 요청, 응답 정보에 대한 객체는 계속 생성된다.)

- 최초 로딩 시점에 객체를 만들어 두고 계속 재사용한다.

- 모든 고객의 요청은 동일한 서블릿 객체 인스턴스에 접근한다.

- 그러므로 공유 변수 사용에 주의한다.

- 서블릿 컨테이너가 종료될 때 해당 서블릿 객체도 함께 소멸된다.

 

(5) 이러한 서블릿을 제공하는 WAS의 가장 큰 장점은 동시 요청을 위한 멀티 스레드 처리를 지원한다.

 

(6) 서블릿 컨테이너에서 핵심 기능은 요청을 올바른 서블릿에 전달해서 처리되도록 하고, JVM이 해당 요청을 처리한 이후에는 생성된 결과를 올바른 장소에 동적으로 반환해 주는 것이다.

 

 

 

 

 

8. Reference

※ 해당 포스팅은 InFlearn에서 (전) 우아한형제들, 배달의 민족 서비스 개발팀장(기술이사)으로 재직하셨던 김영한님의 "스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술" 강의를 듣고 공부한 내용을 정리하였습니다.

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

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

※ 해당 포스팅에 대해 내용 추가가 필요하다고 생각되면 기존 포스팅 내용에 다른 내용이 추가될 수 있습니다.

개인적으로 공부하며 정리한 내용이기에 오타나 틀린 부분이 있을 수 있으며, 이에 대해 댓글로 알려주시면 감사하겠습니다!

'백엔드(Back-End) > Spring MVC' 카테고리의 다른 글

프론트 컨트롤러(Front Controller) 패턴  (0) 2023.11.13

댓글