들어가기 전에...
Web이란?
- 클라이언트와 서버가 인터넷을 통해 정보를 상호작용(정보 공유, 검색 등)을 할 수 있게 하는 서비스
- 웹의 3요소:
- HTML(응답)
- HTTP(통신 방법)
- URL(요청하는 주소)
Web의 구조, 동작 원리
💡 잠깐!
먼저 생각해보면 좋은 것(면접 단골 질문):
웹 브라우저에 www.google.com 을 입력하면 무슨 일이 일어날까?
- 클라이언트가 브라우저 입력창에 http://www.google.com 을 입력한다.
DNS 서버
에서 IP 주소를 확인한다.
- 클라이언트의 컴퓨터에 있는 로컬 DNS 캐시라는 임시 저장소의 캐시를 확인하여 해당 도메인 이름에 대한 IP 주소가 이미 저장되어 있는지 확인
- 로컬 DNS 캐시에 도메인 이름에 대한 IP 주소가 없는 경우, 클라이언트는 DNS 서버에 질의 전송. (이때, 미리 설정된 기본 DNS 서버의 IP 주소를 사용)
- 해당 DNS 서버에도 없을 경우, 다른 DNS 서버로 전송
- 클라이언트(브라우저)가 서버에
Request Message
를 전송한다.
- 서버는 적절한 내용을 담아
Response Message
를 전송한다.
- 브라우저는 응답을 렌더링해서 사용자에게 보여준다.
여기서 Web Server와 WAS는 3번~4번 사이의 과정에 있다.
1. Web Server와 WAS
1) Web Server
- HTTP 기반으로 동작, 정적 리소스 제공
- 클라이언트로부터 HTTP 요청을 받아 HTML 문서나 각종 리소스를 전달하는 서버
- 동적인 요청이 들어왔을 때, 컨테이너로 보내주는 역할
- 예: NGINX, APACHE
💡 정적 리소스:
- HTML, CSS, JS, 이미지, 영상 등
- 요청 인자 값에 상관없이 달라지지 않는 컨텐츠
- 어느 사용자 요청이든 항상 동일한 컨텐츠
Web Server의 기능을 정리해보면 다음과 같다.
- 클라이언트로부터 HTTP 요청을 받을 수 있다.
- 정적 컨텐츠 요청 시 정적 컨텐츠를 제공할 수 있다.
- 동적 컨텐츠 요청시 WAS로 전달하여 WAS가 처리한 결과를 클라이언트에 전달할 수 있다.
2) Web Container
- 컨테이너는 동적인 데이터들을 처리하여 정적인 페이지로 생성해주는 소프트웨어 모듈
- 웹 컨테이너 중 Servlet을 관리할 수 있는 컨테이너를 Servlet Container라고 한다.
3) Web Application Server
- HTTP 기반으로 동작
- 웹 서버 기능 포함 - 정적 리소스 제공 가능
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API
- 서블릿, JSP, 스프링 MVC
- 예: 톰캣
WAS의 기능을 정리해보면 다음과 같다.
- 클라이언트로부터 HTTP 요청을 받을 수 있다. (대부분의 WAS는 Web Server 내장)
- 요청에 맞는 정적 컨텐츠를 제공할 수 있다.
- DB 조회나 다양한 로직 처리를 통해 동적 컨텐츠를 제공할 수 있다.
Web Server?? WAS?? 비슷한데?
- 둘의 용어가 모호하긴 한다.
- 웹 서버도 프로그램을 실행하는 기능이 있는 경우도 있고 WAS도 웹 서버의 기능을 제공하기도 한다.
그래서 자바에서는 뭐가 WAS일까??
→ 서블릿 컨테이너 기능을 제공하면 WAS라고 한다.
(하지만... 서블릿 없이 자바코드를 실행하는 서버 프레임워크도 있음)
💬 개인적인 생각:
자료를 찾아보면서 헷갈렸던 부분은 WAS의 scope였다.
WAS는 Web Server와 Web Container로 구성되어 있다고 하는데
일반적으로 Web Server는 Web Server로, Web Container는 WAS라고 부르는 것 같다.
아니면 Web Server를 따로 두기 때문에 그런 것일까?
참고: 왜 톰캣을 아파치 톰캣이라고 부를까?
- 톰캣(WAS)은 편의를 위해 아파치의 기능(웹서비스 데몬, Httpd)을 포함하고 있다.
- 즉, 톰캣이 아파치의 일부 기능을 제공해주기 때문에 합쳐서 부른다.
2. 웹 시스템 구성
부제: WAS가 Web Server 기능도 제공하는데 왜 Web Server를 따로 둘까?
1) WAS, DB로만 구성
- WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능
- 따라서 WAS, DB만으로 시스템 구성이 가능하지만 다음과 같은 우려가 있음
- WAS가 너무 많은 역할을 담당, 서버 과부하 우려
- 정적 리소스 서빙 때문에 비싼 어플리케이션 로직 수행이 어려울 수 있음
- WAS 장애 시, 오류 화면 노출이 불가능
2) WEB, WAS, DB로 구성
- 웹 서버:
- 정적 리소스 처리
- 동적인 처리 필요 시, WAS에 요청 위임
- WAS:
WAS가 Web Server 기능도 제공하는데 왜 Web Server를 따로 둘까?
Web Server를 따로 둘 때 다음과 같은 장점이 있다.
장점
그래서 일반적으로 Web Server, WAS, DB로 웹 시스템을 구성한다.
💡 참고: By 토비
단지 정적 리소스 처리의 성능만을 위해서라면 굳이 톰캣 앞에 Apache Httpd를 두는 것은 불필요하다.
오히려 메모리만 많이 먹어 관리부담은 커지고, 불필요한 부하만 걸릴 뿐이다.
물론 Httpd의 다른 기능이나 모듈을 사용해야 할 필요가 있다면 그때는 Httpd를 앞에 두고 사용해야겠지만.
예를 들어 하나의 서버에서 PHP애플리케이션과 자바 애플리케이션을 함께 사용하거나, Httpd 서버를 간단한 로드밸런싱을 위해서 사용해야 하는 경우라면 Httpd를 앞에 두고 톰캣을 연결해서 사용하도록 하면 될 것이다.
Reference