본문 바로가기

개발새발 개발자/기타

Apache와 Tomcat 혹은 웹 서버와 WAS는 어떻게 다를까?

웹개발을 하며 꼭 사용하게 되는 Apache와 Tomcat. 사실 그냥 강의에서 개발에 필요하다니까 아무 생각없이 써왔는데(...) 점점 궁금한 것이 많아져 조사를 하게 됐어요!

 

1. Apache(웹 서버)

아파치는 오픈 소스 프로젝트를 운영하는 비영리 단체의 이름입니다. 또한, 이 재단이 운영하는 프로젝트의 이름이기도 합니다.

 

아파치 공식 홈페이지에 들어가면 아파치 재단이 운영하는 다양한 프로젝트를 볼 수 있습니다. 요즘 많이 쓰이는 Hadoop이나 Kafka 등 도 아파치 재단에서 하는 거였네요. 생각보다 더 어마어마한 곳이었어요.

 

그럼 아파치가 운영하는 아파치는 무엇이냐! 바로 웹 서버입니다. 홈페이지에서는 HTTP Server Project라고 부르고 있네요. '웹 서버' 하면 '아파치' 라고 할 만큼 http 서버의 대명사로 자리잡았죠.

 

웹 서버는 브라우저가 서버에 페이지를 요청할 때 가장 앞에서 html, png, css 같은 정적인 내용에 대해 응답합니다. 요즘은 nginx(엔진엑스)라는 다른 웹서버가 더 빠른 속도를 무기로 절대강자 아파치의 라이벌이 되었다고 하네요!

 

2. Tomcat(웹 애플리케이션 서버)

톰캣은 Web Application Server 즉, WAS입니다. 웹서버 아파치와 함께 아파치 재단에 속해있죠. (자꾸 아파치 아파치 하니까 점점 혼란이...)

 

웹 서버와 웹 어플리케이션 서버의 차이는 뭘까요? 웹서버가 정적인 내용을 처리한다면 WAS는 동적인 내용을 처리합니다. DB에 접근하거나 어떤 로직을 처리해야할 경우 사용하는 거죠. 그래서 JSP, Servlet 등을 공부하신 분들은 강의에서 항상 톰캣을 설치해보셨을 거예요.

 

자, 만약 우리가 티스토리에 접속한다고 해봅시다. '티스토리를 보여주세요' 라는 요청이 제일 먼저 웹 서버에게로 갈거예요.

 

똑똑, 웹서버님 계세요?

 

나 불렀어?

웹 서버는 맨 앞단에서 기다렸다는 듯이 요청을 반길거예요. 마치 택배를 기다리던 우리처럼요. 그리고 그 택배를 뜯어보죠. 만약 그게 정적인 컨텐츠라면 웹 서버가 처리를 할 거예요.

 

하지만 DB에 접근해야 하거나 뭔가 처리를 해야하는 동적인 컨텐츠라면...? 웹 서버가 건드릴 수 없어요T.T 곧바로 WAS에게 패스합니다. WAS가 동적인 처리까지 하고 다시 클라이언트에게 돌려주면 그제서야 우린 티스토리 페이지를 볼 수 있는것이죠!

 

이쯤에서 제가 한 가지 비밀을 알려드릴게요. 사실.......WAS는 웹 서버의 기능도 가지고 있답니다(소근)

WAS는 웹 서버와 웹 컨테이너의 결합이에요. 그림으로는 위와 같이 되어있는 거죠. 앞에서 WAS가 동적인 내용을 처리하는 일은 사실 웹 컨테이너가 다 하는 거예요.

 

  • 패스해도 되지만, 알아두면 좋은, 하지만 복잡한 웹 컨테이너 안에서 벌어지는 일들
1. 웹서버의 요청을 컨테이너가 받는다.
2. 컨테이너는 web.xml을 참고해 해당 서블릿의 쓰레드를 생성한다.
3. httpServeltRequest와 httpServletResponse 객체를 생성한다.
4. 해당 서블릿을 호출한다.
5. 2번에서 생성한 해당 서블릿의 쓰레드가 doPost(), doGet()을 호출한다.
6. 전달받은 Response를 HTTP Response 형태로 바꿔 웹 서버에 전달한다.
7. 쓰레드를 종료하고 httpServeltRequest와 httpServletResponse 객체를 소멸시킨다.

3. 아니, 그럼 왜 Apache(웹 서버)를 같이 쓰는 거죠?

어떤 사람들은 목적에 따라 즉, 정적/동적 데이터에 따라 분리하는 것이 더 효율적이기 때문이라고 주장합니다. WAS가 뭐든 다 할 줄 안다고 해서 정말 다 맡겨버리면 과부하가 걸려서 좋지 않다고요.

 

하지만! 이것은 오래된 미신일 뿐이라고 하네요. 이미 성능은 Tomcat 5.5 버전부터 전혀 문제될 게 없다고 해요. 오히려 정적인 데이터 처리를 위해서 굳이 Tomcat 앞에 또 아파치 웹 서버를 두는 게 관리 부담과 불필요한 과부하만 생긴다고 합니다.

 

유명한 개발자 토비님은 '다른 기능이나 모듈을 사용해야할 필요가 있을 경우 즉, 하나의 서버에서 PHP 애플리케이션과 자바 애플리케이션을 함께 사용하거나, 간단한 로드 밸런싱이 필요한 경우' 에 함께 사용할 수 있다고 합니다.

 

정리하자면,

1. 하나의 웹 서버에서 다른 언어의 어플리케이션을 함께 사용할 경우
2. 로드밸런싱이 필요한 경우 - 특정 서버에서 에러/과부하가 발생할 경우 다른 서버가 정상 작동
3. 보안을 강화할 경우 - 아파치에서 해킹 당해도 WAS는 정상 작동

 

이러한 이유로 Apache와 Tomcat을 함께 사용한다는 것을 알 수 있네요 :)