웹서버? WAS?
웹 서버(Web Server)와 WAS(Web Application Server)는 모두 웹 애플리케이션을 제공하는 데 사용되지만, 그 역할과 기능에는 중요한 차이점이 있다!
차이를 이해하기 위해서 정적인 페이지와 동적인 페이지를 열 때를 가정해보자.
정적인 페이지와 동적인 페이지에 대한 그림이 있다.
- 정의
- DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server
- HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 소프트웨어 엔진
- Web Container 또는 Servlet Container라고도 불림
- Container는 JSP, Servlet을 실행시킬 수 있는 소프트웨어
- 즉, JSP, Servlet 구동 환경을 제공
- WAS = Web Server + Web Container
- Web Server 기능들을 구조적으로 분리하여 처리하고자 하는 목적으로 제시됨
- 현재 WAS가 가지고 있는 Web Server도 정적인 컨텐츠를 처리하는 데 있어서 성능상 큰 차이는 없음
- 주요 기능
- 프로그램 실행 환경과 DB 접속 기능 제공
- 업무를 처리하는 비즈니스 로직 수행
- 예시
Web Server가 필요한 이유
- 클라이언트(웹 브라우저)에 이미지 파일(정적 컨텐츠)을 보내는 과정을 생각해보자.
- 이미지 파일과 같은 정적인 파일들은 웹 문서(HTML 문서)가 클라이언트로 보내질 때 함께 가는 것이 아니다.
클라이언트는 HTML 문서를 먼저 받고 그에 맞게 필요한 이미지 파일들을 다시 서버로 요청하면 그때서야 이미지 파일을 받아온다.
- Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보내줄 수 있다.
- 따라서 Web Server에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있다.
WAS가 필요한 이유
- 웹 페이지는 정적 컨텐츠와 동적 컨텐츠가 모두 존재한다.
- 사용자의 요청에 맞게 적절한 동적 컨텐츠를 만들어서 제공해야 한다.
- 이때, Web Server만을 이용한다면 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어 놓고 서비스를 해야 한다.
- 하지만 이렇게 수행하기에는 자원이 절대적으로 부족하다.
- 따라서 WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때 그때 결과를 만들어서 제공함으로써 자원을 효율적으로 사용할 수 있다.
❗️ 그렇다면 WAS가 Web Server의 기능도 모두 수행하면 되지 않을까?
근데 백엔드에서 배포할 때 웹서버의 종류인 Nginx를 사용한다고 들었던 것 같은데,,? 서버는 WAS 아냐?
Nginx는 단순히 정적 파일을 제공하는 것 이상의 다양한 기능을 제공하며, 백엔드 서버의 성능과 보안을 향상시키는 데 중요한 역할을 한다.
- 리버스 프록시
- 리버스는 거꾸로, 프록시는 클라이언트와 서버 사이에서 중계 역할을 하는 컴퓨터나 애플리케이션!
- 즉, 클라이언트의 요청을 백엔드 애플리케이션 서버로 전달하고, 백엔드 서버의 응답을 클라이언트에게 반환하는 역할을 함
- 이를 통해 여러 백엔드 서버에 트래픽을 분산시키고, 로드 밸런싱을 수행
- 정적 파일 제공
- 백엔드 애플리케이션에서도 정적 파일(예: 이미지, CSS, JavaScript)을 제공
- SSL/TLS 종료
- Nginx는 SSL/TLS 종료를 처리하여 HTTPS 트래픽을 처리
- 로드 밸런싱
- 로드는 부하, 밸런싱은 균형 → 즉 부하가 균형있게 들어가게 해주는 기능
- Nginx는 여러 백엔드 서버에 트래픽을 분산시키는 로드 밸런싱 기능을 제공
- 캐싱
- Nginx는 정적 파일 및 동적 콘텐츠를 캐싱하여 성능을 향상
- 보안
- Nginx는 DDoS 방어, IP 차단, 보안 헤더 설정 등을 통해 보안을 강화
이러한 다양한 기능을 제공하는데 서버 개발자들이 사용하지 않을 이유가 없어 보인다!
그러면 백엔드 스프링 프로젝트를 진행할 때 Nginx와 WAS가 같이 쓰이는 거야,,?
스프링 프로젝트를 진행할 때, 성능, 보안, 확장성을 향상시키기 위해 Nginx와 WAS를 함께 사용한다.
간단한 아키텍처는
Clinet ↔ Nginx(Web Server + Reverse Proxy) ↔ WAS(Spring Boot) ↔ DB
아키텍처 흐름은 다음과 같다!
- 클라이언트는 Nginx로 HTTP 요청을 보낸다.
- Nginx에서는 그 요청을 받아 정적인 파일을 제공하거나 동적인 파일이 필요한 요청인 경우 요청을 WAS로 전달한다.
- WAS는 클라이언트의 요청에 대한 비즈니스 로직을 처리하고, 필요한 경우 DB와 상호작용하여 데이터를 생성한다.
- WAS는 생성된 데이터를 바탕으로 응답을 Nginx로 반환한다.
- Nginx는 WAS로부터 받은 응답을 클라이언트에게 반환한다.
- 클라이언트는 Nginx로부터 받은 응답을 받는다.
마지막으로 우리가 프로젝트를 진행할 때는 웹서버와 WAS가 어떻게 동작하는 걸까?
가령, React를 사용해서 프로젝트를 배포할 때를 생각해보자.
Web Server
위 사진과 같이 npm run build를 하면 html, css, javascript, 이미지 등의 정적 파일들이 build폴더에 생긴다. 이 build 폴더를 vercel을 통해 배포를 하면 vercel의 웹 서버는 이 정적 파일들을 xxx.vercel.app에 접속한 클라이언트에게 제공하는 역할을 한다.
클라이언트가 이 정적인 파일들을 받고 웹 브라우저에서 정적인 화면을 볼 수 있는 것이다.
WAS
백엔드 서버가 WAS 역할을 하며, 클라이언트가 요청을 처리하고 데이터베이스와 상호작용하여 필요한 데이터를 제공한다. 가령, 동적으로 생성된 게시판을 불러와야 한다고 하면 클라이언트가 요청을 보내면 해당 데이터를 데이터베이스와 상호작용하여 반환해준다.
사진 및 참고 출처