Spring

[SpringBoot] 웹 서버와 WAS의 차이, 그리고 스프링 부트 내장 톰캣

leejunkim 2025. 6. 24. 00:38

WeeklyPaper 주제: 웹 서버(Web Server)와 WAS(Web Application Server)의 차이를 설명하고, Spring Boot의 내장 톰캣이 이 둘 중 어디에 해당하는지 설명해주세요.

Web server VS WAS

 

웹 서버 (Web Server)


웹서버는 HTTP 프로토콜을 통해 client (웹 브라우저 등)으로부터 요청을 받아 정적 콘텐츠를 제공하는서버

 

  • 정적 데이터 = 데이터 수정 없이 반환되는 자료 형식
    • 종류 - HTML, CSS, 이미지, 동영상 등
    • 누가 어디서든 언제 요청해도 항상 동일한 내용의 파일이 반환됨
  • 사전에 정해진 데이터를 가져와서 반환하면 된다는 점 때문에 처리 속도가 빠르고 과부하를 잘 처리할 수 있다
  • 또한 정적 콘텐츠에 대해 효율적인 캐싱 구현이 가능하다. 프록시 서버 측에서 캐싱을 사용해 똑같은 콘텐츠를 재요청하면 서버로의 요청이 없이 콘텐츠를 바로 제공할 수 있다.
  • 요청을 필터링하고 SSL/TLS와 같은 프로토콜을 통해 데이터를 암호화할 수 있다.
  • 대표적인 웹 서버는 Nginx, Microsoft IIS, HTTP Server등 있다.

주요 기능

  • 요청에 따라 두가지 기능을 수행할 수 있다
    • 1) 정적인 컨텐츠 요청
      • WAS를 거치지 않고 바로 정적 콘텐츠 제공
    • 2)  동적인 컨텐츠 요청
      • 클라이언트의 요청(request)을 WAS로 보내고, WAS가 처리한 결과를 클라이언트에게 전달 (response)한다

핵심 구성 요소

  • HTTP Listener
    • 이름 그래도 클라이언트의 요청을 "듣고" 받아들이는 관문 -> 클라이언트의 HTTP요청을 수신하고 웹서버로 전달하는 컴포넌트
    • 보통 80번 포트를 사용함
    • 클라이언트의 요청을 받을 수 있게 하는 핵심 요소
  • Request Handler
    • HTTP Listener로부터 받은 요청을 분석하고 요청된 URL에 해당하는 정적 콘텐츠를 콘텐츠 저장소에서 찾아 응답으로 제공함
  • 콘텐츠 저장
    • HTML, CSS, 이미지와 같은 정적 파일들이 실제로 저장되어 있는 파일 시스템 공간

 

WAS (Web Application Server)


사용자의 요청에 따라 서버 측에서 스크립트/프로그램을 실행해서 동적인 결과를 사용자에게 전달함
Web Container, 혹은 Servelet Container라고도 불린다

 

  • WAS 핵심 개념: WAS = Web Server + Web Container 
    • 웹 서버 기능: 정적 콘텐츠(HTML, CSS, 이미지)를 처리
    • 웹 컨테이너: 동적 콘텐츠(프로그램 로직 실행 결과)를 생성
    • Web Server을 포함하고 있지만, 실제 서비스를 운영하는 운영 환경(Production)에서는 WAS와 웹 서버를 반드시 분리하여 구성한다. WAS가 웹 서버 기능을 할 수 있음에도 불구하고, 그 앞단에 Nginx나 Apache 같은 전문 웹 서버를 따로 두는 것이다.
    • WAS는 동적(dynamic)인 데이터를 다룬다. 
      • 동적인 데이터 = 다양한 조건에 따라 실시간으로 만들어지는 콘텐츠
        • 사용자의 요청, 시간, 데이터베이스의 정보 등 
        • 예) 로그인: 사용자가 ID와 PW를 입력하면, WAS는 이 정보가 데이터베이스에 있는지 확인하고(비즈니스 로직 수행), '홍길동님, 환영합니다!'와 같이 사용자마다 다른 HTML 페이지를 만들어 보여줌
      • 단순한 파일 전달을 넘어, 데이터베이스 조회나 다양한 비즈니스 로직 처리를 통해 개인화된 결과물을 만들어내는 역할을 한다.
  • WAS의 대표적인 예로는 Apache Tomcat, Microsoft's ASP.NET, JBoss, WebSphere 등이 있다
    • 이들은 다양한 웹 애플리케이션 프레임워크와 언어(Java, .NET, PHP 등)를 지원한다

주요 기능

  • 사용자의 상태 정보를 관리하는 세션 관리 기능을 제공하므로 일관된 사용자 경험을 유지할 수 있게 한다.
  • 복잡한 비즈니스 로직 처리를 위해, 여러 db 연산을 하나의 작업 단위로 묶는 트랜잭션 관리 기능을 제공한다. (예: 계좌이체)
  • 다양한 프로그래밍 언어와 프레임워크를 지원한다 (Java EE, .NET, PHP, Python 등 다양한 스택 포함).

핵심 구성 요소

  • 웹 컨테이너(Web Container) 
    • 웹 컨테이너는 런타임 환경(Runtime Environment)을 제공함
      • 개발자가 작성한 비즈니스 로직 코드가 바로 이 컨테이너 안에서 실행됨
      • 서블릿(Servlet), JSP, PHP 스크립트 등 웹 애플리케이션 코드가 실행될 수 있는 환경
    • 자바에서는 서블릿 컨테이너(Servlet Container)라고 불림
  • JSP 엔진(JSP Engine)
    • JSP 파일을 처리하고 실행하여, 동적 웹 페이지를 생성함
    • JSP 파일은 HTML 코드 내에 Java 코드가 포함된 형식으로, 서블릿으로 변환되어 실행됨
    • Web Container에 포함
  • HTTP 커넥터(HTTP Connector)
    • HTTP 리스너(Web Server) 역할을 하며, 클라이언트/Web server으로부터 HTTP 요청을 받아 처리하고, 응답을 보냄
    • Web Container에 포함

 

스프링부트의 내장 톰캣


톰캣은 WAS인데, 기본적인 WAS의 기능 (서버 실행, HTTP 요청처리 등)을 모두 갖추고 있다.

 

이때 스프링부트는 이 톰캣을 내장(embedded)하여 사용한다. 이 말은 개발자가 별도로 톰캣을 설치하거나 설정할 필요가 없고, 그냥 main메서드 실행을 해주면 스프링 부트가 알아서 내부적으로 톰캣 서버를 구동시켜 어플리케이션을 실행한다.

 

이때 스프링부트 코드 자체에 포함되어 있는 것이 아니라, 스프링부트 웹 프로젝트를 생성할 때 사용되는 spring-boot-starter-web 의존성 안에 tomcat이 포함되어 있다.

  • 빌드 스크립트(build.gradle 또는 pom.xml)에 spring-boot-starter-web 의존성이 있으면, 스프링 부트는 이것이 웹 애플리케이션이라고 판단하고 내장 톰캣 서버를 설정하며, 요청을 처리할 DispatcherServlet을 등록하는 등 복잡한 초기 설정을 자동으로 처리한다.

결론적으로, 스프링 부트는 톰캣의 기반 위에서 동작하지만, 개발자가 WAS의 low-level 설정에 신경 쓰지 않고 오직 비즈니스 로직 개발에만 집중할 수 있는 환경을 만들어 준다.

 

 

자료