Web Server (웹 서버)
- http 기반으로 동작
- 정적 리소스와 was에서 제공하지 않는 부가 기능들 제공
- HTML, CSS, JS, 이미지, 영상 등 정적 파일 로딩
- Apache, Nginx
Web Application Server (웹 어플리케이션 서버)
- http 기반으로 동작
- 정적 리소스 제공 가능
- 프로그램 코드를 실행해서 어플리케이션 로직 수행
- tomcat, jetty, undertow
웹 서버(web server)와 웹 어플리케이션 서버(was)의 차이
- 웹 서버는 주로 정적 리소스 제공을 담당하고 was는 어플리케이션 로직 수행을 담당한다.
- 현대에는 둘의 경계가 애매해짐. 그 이유는 was가 혼자서 web server의 기능을 커버할 만큼 컴퓨터의 성능이 향상되었기 때문
- 그럼에도 web server를 사용하는 이유는 web server에서만 제공하는 기능과 보안적인 이유
- java는 서블릿 컨테이너 기능을 제공하면 was로 사용함
- was는 어플리케이션 코드를 실행하는데 더 주력함
웹 시스템의 구성 (was + DB)
- was가 web server의 기능까지 모두 커버하는 현대에 was와 DB만으로 시스템 구성을 하는 경우가 많아짐
- 하지만 시스템이 커질수록 was가 너무 많은 역할을 담당하여 과부하 우려가 생김
- was 장애시 오류가 사용자에게 그대로 노출됨
- 서버에 부하를 줄수 있는 서비스 로직을 실행하는데 정적 리소스때문에 수행에 장애가 생기는 경우도 있음
웹 시스템의 구성 (web server + was + DB)
- 정적 리소스는 web server 처리
- web server는 was가 처리해야할 로직은 was에게 요청
- was는 중요 서비스 로직만 처리
- 정적 리소스 부하가 많으면 web server를 증설, 동적 리소스는 was를 증설하는 식으로 운영 가능
- 서비스 로직을 실행하다가 was가 죽어도 web server가 살아있기 때문에 오류 화면을 사용자에게 개발자가 만든 화면으로 제공할 수 있음
servlet (서블릿)
HTTP를 통해 전달되는 HTTP 메세지를 개발자가 직접 파싱하고 값들을 확인하여 화면에 노출해줘야 해야하는데 이러한 로직은 의미가 없는 단순 반복 작업이기 때문에 servlet을 통해 해당 로직들을 처리하고 개발자는 의미 있는 서비스 로직 구현에만 집중 할수 있도록 해주는 기능
- 요청과 응답
- HttpServletRequest와 HttpServletResponse
- 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내 사용
- Response 객체에 HTTP 응답 정보를 편리하게 입력
- Sevlet Container
- tomcat과 같이 서블릿을 지원하는 was를 서블릿 컨테이너라고 함
- 서블릿 컨테이너는 서블릿 객체를 생성하고 초기화, 호출, 종료까지 생명 주기를 관리
- 서블릿 객체는 싱글톤으로 관리됨
- 동시 요청을 위한 멀티 쓰레드 처리 기능 지원
Multi Thread
java에서는 thread라는 것을 활용하여 하나의 처리를 실행한다. 동시에 처리가 필요하면 쓰레드를 추가로 생성하여 처리하는 것을 Multi Thread라고 한다.
- 장점
- 동시 요청을 처리할 수 있다.
- 리소스가 허용할 때까지 처리 가능
- 하나의 쓰레드의 처리가 늦어도 나머지 쓰레드에서 처리 가능
- 단점
- 쓰레드 생성 비용은 비싸다.
- client의 요청마다 쓰레드가 생성된다면 프로그램의 성능에 많은 영향을 준다.
- 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
- 쓰레드 생성에 제한이 없다.
- 너무 많은 쓰레드가 생성되어 서버가 죽는 상황 발생
- Thread Pool (쓰레드 풀)
- 쓰레드를 쓰레드 풀에 보관하고 관리해주는 기능
- 서버가 실행될때 개발자가 설정해놓은 쓰레드 풀에서 관리할 쓰레드 갯수만큼 쓰레드를 미리 생성하고 요청이 들어왔을 때 미리 생성된 쓰레드를 사용한 뒤 반납하는 방식으로 사용된다.
- 쓰레드가 미리 생성되어 있으므로 쓰레드를 생성하고 종료하는 비용이 절감된다.
- 생성 가능한 쓰레드의 갯수의 최대치를 정해놨으므로 너무 많은 쓰레드로 서버가 죽는 상황은 발생하지 않는다.
- 쓰레드 풀에 설정할 적정 쓰레드의 갯수는 적절하게 잘 설정해야하는데 이는 apache ab, 제이미터, nGrinder 테스트 툴을 통해 테스트해 볼 수 있다.
SSR과 CSR
- SSR (Server Side Rendering)
- 서버 사이드 렌더링은 HTML 최종결과를 서버에서 만들어서 웹 브라우저에 전달하는 방식으로 주로 정적인 화면에서 사용된다. ex) jsp, thymeleaf
- CSR (Client Side Rendering)
- 클라이언트 사이드 렌더링은 HTML 결과를 자바스크립트를 사용해 웹 브라우저에 동적으로 생성하여 화면에 전달하는 방식이다. ex) react, vue
출처https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8