2020. 5. 7. 19:13ㆍTIL/웹
나는 전에 서버 개발이 의미하는 것이 웹 서버를 개발하는 것과
웹 애플리케이션 서버(WAS)를 개발하는 것으로 나누어지는 것을 확인했다.
웹 서버는 클라이언트로부터 HTTP 요청을받고 응답해주는 역할을 하는 반면에
웹 애플리케이션 서버는 데이터를 조작하여 내어주는 역할을 한다는 나름대로의 요약도 해보았다.
이번 글에서는 두 서버의 차이를 조금더 구체적으로 정리할까 한다.
먼저 웹 서버에 대한 정리이다.
웹서버는 웹 + 서버 정도로 나누어 볼 수 있다.
웹은 인터넷을 기반으로 하여 데이터를 공유, 검색할 수 있게 해주는 서비스이다.
이러한 웹은 URL(주소), HTTP(통신 규칙), HTML(내용)으로 이루어져 있다.
서버는 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템이라고 할 수 있다.
두개를 합쳐서 생각해 보자면 웹 서버는 인터넷을 기반으로하여 클라이언트에게 서비스를 제공하는 컴퓨터 정도가 되겠다.
클라이언트는 해당 웹 서버의 주소(URL)에게 통신규칙(HTTP)에 맞는 요청을 보내면 원하는 내용(HTML)을 응답받는 것이다.
이때 웹 서버는 요청에 대한 데이터를 만들어서 응답하게 되는데, 이 데이터는 웹에서 처리할 수 있는 html,css, 이미지 등의 정적인 데이터로 한정되게 된다.
간단한 예를 들어보자. 클라이언트가 구구단 2단에 대한 내용을 요구했다고 가정하자.
간단한 for문을 통해 원하는 데이터를 만들 수 있겠지만, 불행하게도 HTML은 프로그래밍 언어가 아니다.
즉, 2*1=2, 2*2=4, 2*3=6 ... 등의 데이터를 직접 만들어 주어야 한다는 것이다...
이와 같은 문제를 해결하지 않고서 웹 서버 개발을 한다는 것은 그야말로 지옥일 것이다.
이를 위해 나온것이 웹 애플리케이션 서버(WAS)이다.
WAS를 Web Application + Server로 나누어 생각해보자.
서버는 위에 정리한 바와 같고,
Web Application은 웹에서 실행되는 응용 프로그램이라고 볼 수 있다.
따라서 WAS란 웹 애플리케이션을 실행시켜 필요한 기능을 수행하고 그 결과를 웹 서버에게 전달하는 역할을 하는 서버라고 이해할 수 있다.
WAS는 웹서버와 달리 html을 사용하는 것이 아니라, php, jsp등과 같은 언어들을 사용하여 동적인 페이지를 생성할 수 있는 서버이다.
(애플리케이션이기 때문에 비즈니스 로직을 수행할 수 있고, 데이터베이스에 접속도 가능하다.)
이러한 WAS는 웹 서버와 웹 컨테이너의 결합이라고도 볼 수 있는데 컨테이너가 바로 jsp와 servlet을 실행시킬 수 있는 소프트웨어이다.
(자바에서는 실제로 WAS를 웹 애플리케이션 컨테이너로 부르기도 한다고 한다.)
위와 같은 그림으로 WAS의 동작을 이해해보자.
1. 먼저, 클라이언트의 요청은 웹 서버에게 전달된다.
2. 웹 서버는 요청하는 내용이 정적 페이지를 요구하는 것인지 동적 페이지를 요구하는 것인지를 판단한다.
만약, 정적 페이지일 경우 웹 서버내에서 html파일로 바로 응답을 해준다.
하지만, 동적 페이지일 경우 이 요청을 웹 컨테이너에게 전달한다.
3. 웹 컨테이너는 요청에 따라 데이터를 가공하는 작업을 수행한다.
이 과정에서 필요에 따라 데이터베이스에 접속이 가능하다.
4. 웹 컨테이너는 가공된 동적 데이터를 다시 웹 서버에게 전달해주고, 웹 서버는 이 내용을 클라이언트에게 다시 보내준다.
여기서 의문점이 생긴다.
WAS가 웹서버의 기능까지 할 수 있다고 하니 둘을 구분할 것이 아니라 포함관계로 정리를 해야하는가에 대한 문제이다.
답은, 웹 서비스 구조를 어떻게 설계하느냐에 따라 둘을 구분할 수도, 분리할 수도 있다는 것이다.
웹 서비스는 아래와 같은 세가지 구조를 가질 수 있다.
- Client -> Web Server -> DB
- Client -> WAS -> DB
- Client -> Web Server -> WAS -> DB
이때 가장 바람직한 구조는 세번째이다.
Client -> Web Server -> WAS -> DB 구조는 위와 같은 그림으로 동작한다.
1. 클라이언트는 Web Server에게 HTTP요청을 보낸다.
2. Web Server는 클라이언트의 요청을 WAS에게 보낸다.
3. WAS는 관련된 Servlet을 메모리에 올린다.
4. WAS는 web.xml을 참조하여 해당 Servlet에 대한 스레드를 생성하고 service( )메소드를 호출한다.
이때, 요청에 맞게 doGet( ) 또는 doPost( )메서드가 호출된다.
이 과정에서 DB에 접속이 이루어 질 수 있다.
5. 해당 메서드는 요청에 맞는 동적 페이지를 Response 객체에 담아 WAS에게 전달한다.
6. WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에게 전달한다.
7. Web Server는 클라이언트에게 결과물을 제공한다.
이와 같이 웹서버와 WAS가 구분되어 사용할때 가장 바람직하다.
그 이유는 여러가지가 있다.
첫째, WAS에 웹서버가 포함된다면 WAS가 과부하가 걸릴 수 있다.
WAS는 동적 페이지를 만들어 내기 위해 DB조회 뿐 아니라 다양한 로직을 처리하느라 바쁘다.
이러한 WAS가 정적 컨텐츠 요청까지 받아내야 한다면 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려질 것이다.
따라서 WAS에게 요청이 도달하기 전 단계에 웹 서버를 분리하여 둠으로써,
정적 컨텐츠에 대한 요청은 WAS까지 도달하지 않고 웹 서버에서 바로 응답하도록 하는 것이 바람직하다.
둘째, 하나의 웹서버에 여러대의 WAS를 연결하는 것이 가능해진다.
특히 대용량 웹 애플리케이션의 경우 여러개의 서버를 사용하는 것이 효율적인데,
웹 서버와 WAS를 분리함으로서 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다고 한다.
그 밖에도 하나의 서버에서 여러 웹 애플리케이션을 서비스 하는것이 가능해지고, 세션관리 등도 더 편해진다고 한다.
실제로 이 차이를 몸소 느낄정도의 내공이 없지만, 이정도의 정리만으로도 웹서버와 WAS가 구분되는 것은 꼭 필요해 보인다.
글 재주가 없어서 정리가 참 복잡하지만, 이번 정리를 통해 서버 개발의 의미를 더욱더 명확히 새길 수 있었다.
특히, 따라하기 급해서 이해하지 않고 만들었던 스프링 프로젝트가 떠올랐다.
다음에 만들어 볼때는 이번에 정리한 내용을 바탕으로 내가 무엇을 개발하고 있는지를 더 명확히 할 수 있을 것같다.
더 세부적인 내용은 다음에 따로 또 정리를 해야겠다.
'TIL > 웹' 카테고리의 다른 글
[웹] 빌드와 배포 (1) | 2020.06.19 |
---|---|
[웹] REST (0) | 2020.05.18 |
[웹] MVC 패턴 (0) | 2020.05.18 |
[빌드툴] Maven (0) | 2020.05.13 |
[서버] 서버개발의 의미 (3) | 2020.04.27 |