웹 서버 vs 웹 애플리케이션 서버(WAS)
웹 서버
![](https://blog.kakaocdn.net/dn/cBoVvh/btskTFVD8sH/MBJNT0YiNzJJdDPZaX7jKk/img.png)
HTTP 기반 동작
- 정적 리소스 기능 + 기타 부가 기능
- 정적 HTML, CSS, JS, 이미지, 영상 등 제공
- 예) NGINX, APACHE
웹 애플리케이션 서버(WAS)
![](https://blog.kakaocdn.net/dn/bc3Faq/btskQjNCcuE/nyb5i9Eg05eQR8P6BkhOf1/img.png)
- HTTP 기반 동작
- 웹 서버 기능 + 프로그램 코드 실행 해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC
- 예) 톰캣, Jetty, Undertow
차이
- 웹 서버는 정적, WAS는 애플리케이션 로직을 제공한다.
- 근데… 사실은 경계가 모호하다. 웹 서버도 프래그램을 실행할 수 있고, 웹 애플리케이션 서버도 웹 서버의 기능을 제공한다.
- Java에서는 서블릿 컨테이너 기능을 제공하면 WAS로 분류한다.
웹 시스템 구성 종류
WAS + DB
![](https://blog.kakaocdn.net/dn/vbB8b/btskS2XKQEF/x6gcjc0RcVe69MZHimh4n1/img.png)
- WAS가 정적 리소스, 애플리케이션 로직 모두 수행한다.
- WAS가 너무 많은 역할을 담당하기 때문에 서버 과부화가 발생할 수 있다.
- 정적 리소스보다 더 중요한 애플리케이션 로직이 실행되지 못 하는 문제가 발생할 수 있다.
- 결정적으로, WAS 장애 시 오류 화면조차 노출되지 않고 무한 로딩이 걸릴 수 있다.
WEB + WAS + DB
![](https://blog.kakaocdn.net/dn/bJw9ZJ/btskRbnRaDz/o2DKteRfBURS3qc4qAomU1/img.png)
- 정적 리소스는 웹 서버가 처리하고, 애플리케이션 로직 처리는 WAS가 처리하도록 위임할 수 있도록 한다.
- 정적 리소스가 많이 필요하면 Web Server를 증설하고, 반대로 애플리케이션 로직 처리에 많은 시간이 걸리면 WAS를 증설할 수도 있다.
- 특히, 애플리케이션 로직이 포함된 WAS는 잘 죽는 반면에, 정적 리소스를 제공하는 Web Server는 잘 죽지 않기 때문에 WAS나 DB장애 시 오류 화면을 제공할 수 있다.
서블릿
기능
![](https://blog.kakaocdn.net/dn/lBwtd/btskQiA9E0Y/Gztz5AoiSKKk7scytXy5GK/img.png)
- 서블릿이 없다면, 복잡한 HTTP 바디 파싱과 HTTP 응답 메시지생성을 직접 우리가 다 구현해야한다.
- 즉, 서블릿은 개발자가 HTTP 스펙을 편리하게 사용할 수 있도록 파싱/생성 해주는 기능을 해준다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse reponse) {
// 애플리케이션 로직
}
}
- HTTP 요청 정보는 HttpServletRequest에, HTTP 응답 정보는 HttpServletResponse에 담아서 사용할 수 있다.
서블릿 컨테이너?
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 마치 스프링 컨테이너처럼 서블릿 객체를 싱글톤으로 관리하여 생명주기를 직접 제어한다.
- 뿐만 아니라, 동시 요청을 처리하기 위해서 멀티 쓰레드 처리도 지원한다.
동시 요청 - 멀티 쓰레드(쓰레드 풀)
쓰레드 풀
![](https://blog.kakaocdn.net/dn/bZQqyX/btskSqxNK6V/rlpVylJmNpRaTqbXDKxDmK/img.png)
- 쓰레드 생성, 종료는 리소스가 굉장히 많이 드는 작업이므로, WAS서버가 시작할 때 설정 개수의 쓰레드를 미리 생성해두고, 꺼내쓰는 방식으로 멀티 쓰레드를 지원한다.
- 만약, 미리 생성해둔 쓰레드를 모두 사용하게 된다면 요청이 지연된다.
- 당연하게도, 쓰레드풀 개수를 세팅하는 것이 서버 성능에 많은 영향을 미치게 된다.
- 지연 장애 발생 시, 클라우드일 경우 일단 서버 개수를 늘리고 이후에 튜닝
- 지연 장애 발생 시, 클라우드가 아니면 열심히 튜닝
WAS의 핵심 기능
- WAS의 핵심 기능이 바로 멀티 쓰레드를 WAS가 처리하는 것이다.
- 이전에 모던 자바 인 액션 스터디를 해봐서 알지만, Java에서 멀티 쓰레드 관리가 굉장히 까다롭다.
- 이런 까다로움을 WAS가 앞단에서 처리해주기 때문에 개발자들은 마치 싱글 쓰레드 프로그래밍을 하듯이 개발하면 된다.
HTML, HTTP API, SSR, CSR,
HTML
- 정적, 동적 페이지로 나뉘며, 동적 페이지는 WAS가 요청에 따라 HTML파일을 생성하여 전달하게 된다.
HTTP API
- HTML이 아닌 데이터를 전달하게 되며, 최근엔 모두 JSON을 사용하는 추세이다.
- 웹 브라우저 뿐만 아니라, 앱 클라이언트와의 통신, 그리고 서버끼리와의 통신에 주로 사용된다.
SSR
![](https://blog.kakaocdn.net/dn/cuLqiI/btskQinDZ6a/1DOwjoSYYQ5BI7j4WtpdH1/img.png)
- 서버 사이드 렌더링(Server Side Rendering)으로, HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달한다.
- 주로 정적인 화면에 사용되며, JSP, 타임리프 등의 기술이 있다.
CSR
![](https://blog.kakaocdn.net/dn/yWGqY/btskSqq1P5C/CmnhVbFwkOTL7g6IyhVuQ1/img.png)
- 클라이언트 사이드 렌더링(Client Side Rendering)으로, HTML 최종 결과를 자바스크립트를 사용하여 웹 브라우저에서 동적으로 생성하여 해석한다.
- 주로 동적인 화면에 사용되며, 앱 처럼 필요한 부분만 수정할 수 있다.
- React, Vue.js등의 기술이 있다.
서버 개발자가 SSR에 필요한 기술을 배워야할까?
- 결론은 배워야한다. 타임리프 학습에 2~3일 정도 밖에 안 걸리고, 배워두면 디자인 없는 간단한 UI 정도는 짤 수 있기 때문에 여러모로 도움이 많이 된다.
Uploaded by N2T
(23.06.21 22:15)에 작성된 글 입니다.