웹 서버, WAS

꾸Jun·2024년 9월 29일
0

🍎 iOS

목록 보기
9/12

웹서버? WAS?

웹 서버(Web Server)와 WAS(Web Application Server)는 모두 웹 애플리케이션을 제공하는 데 사용되지만, 그 역할과 기능에는 중요한 차이점이 있다!

차이를 이해하기 위해서 정적인 페이지와 동적인 페이지를 열 때를 가정해보자.

정적인 페이지와 동적인 페이지에 대한 그림이 있다.

  • 정적인 페이지

    • 웹 서버는 파일 경로 이름을 받아 경로와 일치하는 파일 컨텐츠를 반환
    • 항상 동일한 페이지 반환
      • image, html, css, javascript ,,,
  • 동적인 페이지

    • 인자의 내용에 맞게 동적인 컨텐츠를 반환
    • 가령, 웹 서버에 의해서 실행되는 프로그램을 통해서 만들어진 결과물 Servlet: WAS위에서 돌아가는 doGet()을 사용
    • 개발자는 Servlet에 doGet()을 구현
      • Servlet: 동적 웹 페이지를 만들 때 사용되는 Java 기반의 웹 애플리케이션 프로그래밍 기술
  • 정적인 페이지 → 웹 서버(Web Server)

  • 정의

    • 웹 서버는 주로 정적 컨텐츠(HTML, CSS, Javascript, 이미지 등등)를 클라이언트(웹 브라우저)에게 제공하는 소프트웨어이다
    • 웹 서버는 클라이언트의 HTTP 요청을 받아 정적 파일을 반환하는 역할을 한다.
  • 주요 기능

    • 정적인 컨텐츠 제공
    • WAS를 거치지 않고 바로 자원을 제공
    • 동적인 컨텐츠 제공을 위한 요청 전달
    • 클라이언트의 요청을 WAS로 보내고, WAS가 처리한 결과를 클라이언트에게 전달(응답)
  • 예시

    • Apache, Nginx, IIS(Window 전용 웹 서버)
  • 동적인 페이지 → 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 접속 기능 제공
    • 업무를 처리하는 비즈니스 로직 수행
  • 예시
    • Tomcat, JBoss, Jeus

Web Server가 필요한 이유

  • 클라이언트(웹 브라우저)에 이미지 파일(정적 컨텐츠)을 보내는 과정을 생각해보자.
  • 이미지 파일과 같은 정적인 파일들은 웹 문서(HTML 문서)가 클라이언트로 보내질 때 함께 가는 것이 아니다.
    클라이언트는 HTML 문서를 먼저 받고 그에 맞게 필요한 이미지 파일들을 다시 서버로 요청하면 그때서야 이미지 파일을 받아온다.
  • Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보내줄 수 있다.
  • 따라서 Web Server에서는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있다.

WAS가 필요한 이유

  • 웹 페이지는 정적 컨텐츠와 동적 컨텐츠가 모두 존재한다.
    • 사용자의 요청에 맞게 적절한 동적 컨텐츠를 만들어서 제공해야 한다.
    • 이때, Web Server만을 이용한다면 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어 놓고 서비스를 해야 한다.
    • 하지만 이렇게 수행하기에는 자원이 절대적으로 부족하다.
  • 따라서 WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때 그때 결과를 만들어서 제공함으로써 자원을 효율적으로 사용할 수 있다.

❗️ 그렇다면 WAS가 Web Server의 기능도 모두 수행하면 되지 않을까?

  • 기능을 분리하여 서버 부하 방지

    • WAS는 DB 조회나 다양한 로직을 처리하느라 바쁘기 때문에 단순한 정적 컨텐츠는 Web Server에서 빠르게 클라이언트에 제공하는 것이 좋다.
    • 만약 정적 컨텐츠 요청까지 WAS가 처리한다면 정적 데이터 처리로 인해 부하가 커지게 되고, 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려진다.
  • 물리적으로 분리하여 보안 강화

    • SSL에 대한 암복호화 처리에 Web Server를 사용
  • 여러 대의 WAS를 연결 가능

    • Load Balancing을 위해서 Web Server를 사용
  • 즉, 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성 을 위해 Web Server와 WAS를 분리한다.
    Web Server를 WAS 앞에 두고 필요한 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

아키텍처 흐름은 다음과 같다!

  1. 클라이언트는 Nginx로 HTTP 요청을 보낸다.
  2. Nginx에서는 그 요청을 받아 정적인 파일을 제공하거나 동적인 파일이 필요한 요청인 경우 요청을 WAS로 전달한다.
  3. WAS는 클라이언트의 요청에 대한 비즈니스 로직을 처리하고, 필요한 경우 DB와 상호작용하여 데이터를 생성한다.
  4. WAS는 생성된 데이터를 바탕으로 응답을 Nginx로 반환한다.
  5. Nginx는 WAS로부터 받은 응답을 클라이언트에게 반환한다.
  6. 클라이언트는 Nginx로부터 받은 응답을 받는다.


마지막으로 우리가 프로젝트를 진행할 때는 웹서버와 WAS가 어떻게 동작하는 걸까?

가령, React를 사용해서 프로젝트를 배포할 때를 생각해보자.

Web Server

위 사진과 같이 npm run build를 하면 html, css, javascript, 이미지 등의 정적 파일들이 build폴더에 생긴다. 이 build 폴더를 vercel을 통해 배포를 하면 vercel의 웹 서버는 이 정적 파일들을 xxx.vercel.app에 접속한 클라이언트에게 제공하는 역할을 한다.

클라이언트가 이 정적인 파일들을 받고 웹 브라우저에서 정적인 화면을 볼 수 있는 것이다.

WAS

백엔드 서버가 WAS 역할을 하며, 클라이언트가 요청을 처리하고 데이터베이스와 상호작용하여 필요한 데이터를 제공한다. 가령, 동적으로 생성된 게시판을 불러와야 한다고 하면 클라이언트가 요청을 보내면 해당 데이터를 데이터베이스와 상호작용하여 반환해준다.



사진 및 참고 출처

profile
꾸준🐢

0개의 댓글