🔎 WAS와 서블릿 컨테이너의 역할에 대한 간단한 개요
안녕하세요? 저번엔 서블릿과 jsp로 서버를 구현해보았는데요.. 이제 어느정도 흐름이 눈에 익었으니 다시 한 번 WAS와 백엔드 서버의 흐름에 대해 간단하게 정리를 해보도록 하겠습니다.
WAS ? Web Server?
사실 진짜 헷갈렸습니다.. 웹 서버와 WAS의 역할 구분이 말이죠! 근데 간단하게 말해서 Web server는 정적 리소스를 처리해서 주는 반면 WAS는 동적으로 application logic 코드를 실행하고 처리해줍니다.
여기서 이해 안되는게 있습니다. 그냥.. WAS에서 다 처리하면 안되나? 귀찮게 뭘 나눠서 해서 사람을 헷갈리게 하나... 싶은데요! 우리 정적 리소스들있죠 HTML 이 친구. 이 친구는 오류가 잘 안납니다. 게다가 에러가 발생하면? 화면을 통해 '오류 났어요!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 하고 경고창을 띄워줄 수 있습니다.
그런데 application logic..? 이거 단순히 화면에 띄워주는 정적인 리소스들과 다르게 꽤 복잡한 로직과 코드가 요구됩니다. 따라서 상대적으로 에러가 많이 나겠죠.. 이때 WAS랑 Web Server랑 한 몸이라면? 에러가 나면 그냥 전체적으로 다 죽어버리는 겁니다. 유저 입장에서는 영문도 모르고 얼마나 짜증납니까
또 정적 리소르를 관리하는 파일들은 상대적으로 비용이 저렴합니다. 그러나 동적 리소스를 다루는 것은 비용이 더 필요한데요.. 동적 리소스 처리를 위해 서버를 증설하거나 정적 리소스 처리를 위해 서버를 증설하는건 서로 비대칭할 수가 있습니다. 이때 서로 나눠서 서버를 관리해주면 필요에 따라 증설이 가능해집니다.
Servlet Container?
자바에서는 일반적으로 서블릿 컨테이너를 가진 서버를 WAS라고 칭하는데요! 그래서 서블릿 컨테이너에 대해 알아보..기 전에 서블릿이란 무엇일까요?
Servlet?
이런 요청과 응답.. 개발하다보면 개발자도구에서 한번쯤은 보셨을 겁니다. 그런데 이런 HTTP의 요청에서 필요한 정보들을 파싱해 오고 또 응답을 해주기 위해 응답 객체를 만들어서 필요한 정보들을 담아서 전달을 해주어야 할 것입니다. 이러한 것을 편리하게 해주기 위해 등장한 것이 서블릿입니다.
Servlet Container?
그리고 이러한 서블릿들은 개발자가 직접 관리하지 않아도 되로고 도와주는 것이 바로 서블릿 컨테이너입니다. 서블릿 컨테이너의 역할은 다음과 같습니다.
- 웹 서버와의 통신 지원
- 서블릿 생명주기 관리 (생성, 초기화, 호출, 종료)
- 서블릿을 싱글톤으로 관리
- 멀티쓰레드 지원 및 관리
여기서 가장 주목해야 할 것은 서블릿이 싱글톤으로 관리된다는 것과 멀티스레드인데요! 서블릿이 싱글톤으로 관리되는 것에 대한 것은 다음에 다뤄보고 오늘은 멀티스레드 환경에 대해 이야기해보겠습니다.
Multi Thread supported?
서블릿 객체는 스레드가 호출을 합니다. 그런데 스레드는 순차 실행을 합니다. 즉, 하나의 서블릿이 동작하는 중이면 다른 서블릿을 사용하지 못하게 되는 겁니다.
이런씩으로 동작을 하게 됩니다. 상당히 비효율적이고.. 하나에서 오류가 나면 전체가 다 다운 될 위험도 존재합니다. 이를 해결하기 위해서는 멀티 스레드 환경이 필요해지는데요!
자바를 공부하다보면 멀티 스레드에 대해 공부를 해봤을 것입니다. 그냥 방구석에서 혼자 할 때도 꽤나 복잡하고 생각해야 할 것들이 많은데 그걸 실제 상용화되는 서비스에서 하려면 꽤나 골치가 아파질겁니다. 그걸 서블릿 컨테이너가 대신 해주는 겁니다!
Thread Pool
그렇다고 해서 요청이 들어올 때마다 스레드를 만들어주냐? 하면 아닙니다. 그렇게 하면 갑작스럽게 요청이 많이 들어오면 서버가 다운 될 위험이 있고, 스레드 생성을 반복해서 함에 따라 OS 자원이 빨리 소진되게 됩니다. 따라서 WAS는 쓰레드 풀이라는 것을 이용을 하는데요!
이런씩으로 요청이 들어오면 매번 새로 생성을 하는 것이 아니라 스레드 풀에서 미리 생성되어 있는 스레드를 하나 빌려서 서블릿을 호출 하고 사용이 끝나면 풀에 다시 스레드를 반납합니다.
이때 스레드 풀에 관한 튜닝을 여러개 할 수 있는데 가장 대표적으로는 Max Thread 수를 정할 수 있다는 것입니다. 이렇게 하면 무한 회오리 맹키로 무한 스레드 생성이 방지되겠죠! 또 서버가 감당할 수 없는 수의 요청이 와도 따로 거절을 하거나 대기를 걸어두어 서버가 완전히 다운되는 것을 방지합니다. 이미 자원을 사용중인 사용자들의 불편이 방지되는 것입니다.
이렇게.. 간단한 개념만 익혀봤는데요! 하나하나씩 직접 사용해보며 연습해보면 좋을 것 같습니다!
참고 링크
- https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
- https://aws.amazon.com/compare/the-difference-between-web-server-and-application-server/
- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1
- https://velog.io/@yoho98/%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EA%B3%BC-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-y88kny7g
- https://www.geeksforgeeks.org/introduction-java-servlets/
- https://docs.oracle.com/cd/A97688_16/generic.903/a97680/overview.htm