728x90

스프링 MVC강의를 듣고 배운 내용을 정리해 볼려고 한다.

 

웹 서버(Web Server)와 웹 애플리케이션 서버(WAS - Web Application Server) 

 

웹 서버(Web Server)란?

  • HTTP 기반으로 동작 , 정적 리소스 제공
  • 예) NGINX, APACHE

웹 애플리케이션 서버(WAS - Web Application Server)란?

  • HTTP 기반으로 동작
  • 웹 서버 기능 포함 + 정적 리소스 제공
  • 서블릿, HTTP API , JSP , Spring MVC ->프로그램 코드를 실행해서 애플리케이션 로직 수행
  • 예) 톰캣(Tomcat) Jetty, Undertow

웹 서버와 웹 애플리케이션 서버의 차이

웹 서버는 정적 리소스 파일 제공, WAS는 애플리케이션 로직 제공한다.

사실 이 두개의 용어와 경계도 모호하다.

웹 서버도 프로그램을 실행하는 기능을 포함하기도 하고 웹 애플리케이션 서버도 웹 서버의 기능을 제공한다.

그 중 WAS는 애플리케이션 코드를 실행하는데 더 특화 되어 있다.

 

그럼 WAS만 사용하면 되지 왜 굳이 웹 서버까지 사용할까?

-실제 웹 시스템 구성은 WAS와 DB만으로도 구성이 가능하다.

 

하지만 이렇게 WAS에 애플리케이션 로직, 정적 리소스를 모두 제공하면 너무 많이 역할을 담당하기에 서버 과부하의 우려가 있다. 또한 WAS 장애시 오류 화면도 노출이 불가능하다. 또한 애플리케이션 로직은 매우 비싼편인데 정적 리소스 때문에 수행하기에 어려움도 있다.

 

>> 그렇기 때문에 Web Server 에서 정적 리소스를 담당하고, 만약 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 한다. 이렇게 되면 효율적으로 리소스 관리를 할 수 있고 만약 정적 리소스가 많이 사용되면 Web Server를 증설하고 애플리케이션 리소스가 많이 사용되면 WAS를 증설하면 된다! WAS가 장애가 발생하면 Web Server에서 오류화면 HTML을 제공할 수도 있다.


서블릿

-만약 클라이언트에서 username, age를 post 방식으로 서버에 보낸다고 가정해보자. 그러면 서버에서 처리해야 하는 업무가 정말 많다.

HTTP 요청 메시지 파싱하기 , HTTP 메시지 바디 파싱,비즈니스 로직 실행(데이터베이스에 저장요청), HTTP 응답 메시지 생성 .... 이외에도 많다.

근데 여기서 의미 있는 비즈니스 로직은 데이터베이스에 저장요청 하는것 하나 뿐이다. 서블릿이 비즈니스 로직 이외에 다른 업무를 다 처리해준다.

 

서블릿은 http 요청 정보를 편리하게 사용 할 수 있는 httpservletRequest , http 응답 정보를 편리하게 제공하는 httpservletResponse 들이 있어서 개발자가 http 스펙을 매우 편리하게 사용한다.

 

HTTP 요청시

• WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출

• 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용

• 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력

• WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

 

 

서블릿 컨테이너

-톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

-서블릿 컨테이너는 서블릿 객체를 생성,초기화 등등 생명주기를 관리한다.

-서블릿 객체는 싱글톤으로 관리한다.

-동시 요청을 위한 멀티 쓰레드 처리를 지원한다.

 

그러면 서블릿 객체는 누가 호출할까?

 

>>쓰레드가 호출 해준다.

쓰레드

-애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 한다.

-자바 메인 메서드를 실행하면 main함수를 실행하는데 main이라는 이름의 쓰레드가 실행되는 것

-쓰레드가 없다면 자바 애플리케이션 실행이 불가능

-동시 처리가 필요하다면 쓰레드를 추가로 생성하면 된다.

 

만약 쓰레드가 하나인데 요청이 동시에 들어오게 되면 두 개의 요청이 다 죽어버릴 수 있다.

 

그렇다면 요청 마다 쓰레드를 생성하면 되지 않을까?

>> 쓰레드는 생성 비용이 매우 비싸며 쓰레드 생성에 제한이 없다. (CPU,메로리 임계점이 넘어버리면 서버가 죽는다)

그래서 쓰레드 풀이라는게 있다.

 

쓰레드 풀

쓰레드 풀이라는 곳에 쓰레드를 담아 놓는다. 필요할 때마다 쓰레드 풀에서 꺼내서 쓰면 되는 것 , 사용이 끝나면 쓰레드 풀에 해당 쓰레드를 반납한다.

최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없으면 기다리는 요청을 거절하거나 대기하도록 할 수 있다.

 

>> 쓰레드를 생성하는 비용이 절약되고 응답도 빠르다. 이미 최대치가 정해져있으므로 너무 많은 요청이 들어와도 서버는 안전하다.

그렇다면 쓰레드 풀에 쓰레드 수를 어떻게 설정하면 될까?

값이 너무 낮으면 동시 요청이 많으면 지연이 되고, 값이 너무 높으면 CPU,메모리 임계점이 초과로 서버가 죽음.

 

>>적절한 값을 설정해야 한다. 정해진 갯수는 없고 성능 테스트 (네이버에서 만든 nGrinder 툴) 꼭 해야한다 (최대한 실제 서비스와 유사하게 성능 테스트)

하지만, 이러한 멀티 쓰레드는 WAS에서 지원해준다. 그렇기 때문에 개발자는 개발할 때 싱글 쓰레드를 생각하고 소스 코드를 개발하면 된다!

 

*멀티 쓰레드 이기 때문에 싱글톤 객체(서블릿,스프링 빈)는 주의해서 사용*


HTML , HTTP API

정적 리소스

-고정된 HTML 파일, CSS, JS, 이미지 등을 제공

-주로 웹 브라우저

HTML 페이지(동적)

-동적으로 필요한 HTML 파일 생성해서 전달

>> 주문 내역을 요청하면 WAS가 DB에서 주문 정보를 조회하고 이 정보를 기반으로 동적으로 HTML을 생성해서(JSP,타임리프) 클라이언트에게 보내준다.

HTTP API

-HTML이 아닌 데이터를 전달한다 (주로 JSON 형식 사용)

-앱 클라이언트나 웹 클라이언트와 HTTP API로 통신하면 WAS에서는 데이터만 전달해주고 그 데이터를 기반으로 클라이언트에서 별도로 처리한다.

-WAS 서버 끼리 통신할때도 굳이 HTML이 필요 없으므로 HTTP API를 사용한다.

-React, Vue.js 같은 웹 클라이언트


서버사이드 렌더링, 클라이언트 사이드 렌더링

 

SSR(서버 사이드 렌더링) 

-서버에서 최종 HTML을 생성해서 클라이언트에 전달

CSR(클라이언트 사이드 렌더링)

-HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성 ex)구글 지도, Gmail 등등


자바 웹 기술 역사

1. 서블릿 : HTML 생성이 어려움

2. JSP

-HTML 생성은 편리하지만, 비즈니스 로직 까지는 너무 많은 역할을 담당

3. 서블릿, JSP 조합 MVC 패턴 사용

4. MVC 프레임 워크가 많이 나옴

5. 애노테이션 기반의 스프링 MVC (이 방법으로 거의 통일)

-@Controller

6. 스프링 부트의 등장

-스프링 부트는 서버를 내장


자바 뷰 템블릿 역사

 

뷰 템플릿

-HTML을 편리하게 생성하는 뷰 기능이다.

 

1. JSP - 속도가 느림, 기능 부족

2. 프리마커 - 속도 문제 해결, 다양한 기능

3. 타임리프 - 최선의 선택

728x90

+ Recent posts