[Spring] Servlet & ServletContainer

leehyunjon·2022년 6월 12일
0

Spring MVC

목록 보기
1/4

Servlet

Web Server & WAS

Servlet에 대해 배우기 전에 Web Server와 WAS를 먼저 집고 넘어가야한다.

Web Server

출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR

Web Server는 Http 기반으로 동작하며 Http요청이 들어왔을시 정적 리소스(정적 HTML, CSS, 이미지, 영상)를 제공한다.

NGINX와 APACHE 등이 있다.

WAS(웹 애플리케이션 서버)

출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR

WAS는 Web Application Server의 줄임 말로써 web server와 마찬가지로 Http 기반으로 동작하며 web server의 기능을 포함하여 동적 리소스(동적 HTML, HTTP API(json), Servlet, JSP, Spring MVC)를 제공한다.
즉, 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다.

Tomcat, Jetty 등이 있다.


Servlet

Servlet이란 자바를 사용해서 클라이언트 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술.

자바를 이용해서 웹 개발을 하기 위해서는 가장 필요한 기술이 Servlet이다.

Servlet 동작

출저 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR
  1. 클라이언트 Http요청이 들어온다.
  2. WAS는 HttpServletRequest와 HttpServletResponse 객체를 생성한다.
  3. WAS는 요청 URL에 맞는 Servlet객체를 Servlet Container에서 찾아 호출한다.
  4. (개발자는 HttpServletRequest를 통해 비즈니스 로직을 개발.)
  5. 비즈니스 로직 실행
  6. (개발자는 HttpServletResponse를 통해 응답 정보 작성.)
  7. WAS는 작성된 HttpServletResponse를 통해 Http Response Message 생성 후 Client에게 전달한다.

생명주기

생성 & 초기화

  • 클라이언트 요청이 들어오면 서블릿 컨테이너는 서블릿이 메모리에 등록되어있는지 확인한다.
    메모리에 서블릿이 없다면 동적으로 서블릿을 검색해서 객체를 생성하고 init() 메서드를 통해 서블릿 컨테이너에 서블릿을 초기화한다.

호출

  • 서블릿 컨테이너가 클라이언트 요청에 따른 서블릿의 service() 메서드 호출시, Http 요청의 Http Method에 따라 doGet(), doPost()등의 메서드라 호출된다.
  • 서블릿의 service()메서드가 호출되면 내부적으로 DispatcherServlet이라는 서블릿에 의해 개발자가 작성한 비즈니스 로직이 수행되고 결과가 반환된다.

종료

  • 컨테이너가 서블릿에 종료 요청시 서블릿의 destory() 메서드가 호출되며 종료시 처리해야 할 작업은 destory()를 오버라이드하여 구현하면 된다.
  • destory()가 끝난 서블릿은 GC에 의해 제거된다.

일반 객체와 Serverlet 객체의 차이점

JVM에서 호출 방식은 서블릿과 일반 클래스 모두 동일하지만, main()메서드로 직접 호출되는 일반 클래스와는 달리 서블릿은 main()에서 직접 호출되지 않고 서블릿 컨테이너에 의해 호출된다.

서블릿 컨테이너가 web.xml을 읽고 서블릿 클래스를 클래스 로더에 로드한다.

Servlet 종류

Servlet

  • Servlet은 서블릿 프로그램의 필수 메서드를 선언하고 있는 인터페이스이다.
  • 이 표준을 구현해야 서블릿 컨테이너가 해당 서블릿을 실행할수 있다.

GenericServlet

  • GenericServlet은 Servlet인터페이스를 상속하여 클라이언트 - 서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상 클래스이다.

HttpServlet

  • 일반적인 서블릿은 HttpServlet을 상속받은 서블릿을 의미한다.
  • HttpServlet의 service() 메서드를 Http 프로토콜 요청 메서드에 적합하게 오버라이드 했다.

Servlet Container

Servlet Container

서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿 객체를 초기화, 호출, 종료 하는 생명주기를 관리하고 클라이언트와 요청을 주고 받을 수 있도록 웹 서버와 소켓으로 통신한다.

서블릿 컨테이너에서 관리하는 서블릿 객체는 싱글톤으로 관리된다.
싱글톤 패턴이기 때문에 thread-safe하지 않음으로 읽기 전용이나 동기화 처리된 구조로 설계해야한다.

톰캣과 같이 서블릿 컨테이너 기능을 제공해주는 WAS를 서블릿 컨테이너라고 편하게 많이 부르는것 같다.

특징

통신지원

출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR

우리가 클라이언트의 요청을 받아 비즈니스 로직을 처리하고 결과를 반환하는데는

  • TCP/IP 연결 & 소켓 연결
  • Http Request 메시지 파싱
  • 비즈니스 로직
  • Http Response 응답 메시지 생성
  • TCP/IP , 소켓 종료

많은 작업이 필요하다.

하지만 비즈니스 로직을 제외한 부분을 WAS에서 처리해주어 우리 개발자는 단지 HttpRequest를 받아서 비즈니스 로직을 만들고 결과를 HttpResponse에 실어 보내기만 하면 된다.

멀티 스레딩 관리

서블릿 컨테이너는 자바 스레드(Thread)를 이용해 서블릿을 호출한다.
클라이언트 요청이 들어왔을 때 스레드를 생성하여 사용하는데, 다중 스레드를 사용함으로써 다중 요청을 효율적으로 처리할수 있다.

하지만 요청때마다 스레드를 생성하게 되면 CPU와 메모리 과부하로 인해 문제가 생길수 있다.

이러한 문제를 해결하기 위해 Thread Pool이라는 방법을 사용한다.

Thread Pool

필요한 스레드의 개수를 정해놓고 요청시 thread pool에서 미리 생성해둔 스레드를 사용하고 반납하여 비용을 줄이는 방식이다.

최대 스레드 개수를 넘어가게 되면 대기 혹은 거절하는 방식이다.
(톰캣은 기본 최대 스레드 개수는 200개 이다.)

Thread Poll의 장점

  • 스레드 생성에 대한 비용을 줄일수 있다.
  • 생성가능한 최대 개수가 있어 요청을 안전하게 처리할수 있다.

서블릿의 생명주기 관리

위에서 설명했듯이 서블릿 컨테이너는 서블릿의 생명주기를 관리함으로써 클라이언트의 요청에 맞는 서블릿을 생성, 호출할수 있으며 서블릿을 종료하거나 서블릿 컨테이너가 종료될때 서블릿을 종료시킬수 있다.

선언적 보완 관리

보안관련 설정을 배포 서술자라는 xml문서를 사용함으로써 개발자가 보안 설정을 바꾸어도 자바 코드에는 영향을 미치지 않는다.

JSP

JSP 코드를 자바 코드로 변환해준다.


Servlet Container와 Spring Container

출처 : https://steady-coding.tistory.com/599

Spring MVC도 서블릿 컨테이너가 관리하는 서블릿이고 서블릿 컨테이너가 Bean에 접근하기 위해서는 Spring Container를 거쳐야 한다.


적절한 스레드 찾기

WAS의 설정은 최적화로 되어있기 때문에 웬만하면 수정을 하지 않는다.
하지만 WAS에서 수정을 한다면 아마 스레드 설정을 많이 건드리지 않을까 싶다.
특히 쓰레드의 최대 스레드(max Thread)가 서버의 효율성에 많은 영향을 끼치기 때문에 최적의 스레드를 찾아 서버를 돌려야한다.

  • 최대 스레드 수에 따르는 영향
    • 너무 낮게 설정
      서버 리소스는 여유롭지만, 클라이언트의 응답 지연
    • 너무 높게 설정
      CPU / 메모리 과부하로 서버 다운

그렇다면 적절한 스레드 개수는 어떻게 되는 것일까?

애플리케이션 로직의 복잡도 / CPU / 메모리 / IO 리소스, 네트워크 속도 등 여러가지 요소가 복합적으로 작용하기 때문에 일반화 할 수는 없다.

JVM에 PC레지스터가 있는데 거기서 스레드를 생성하고 스레드 컨텍스트가 저장이된다.
이 스레드를 가지고 메모리 크기, 네트워크 속도, 컨텍스트 스위칭 비용 등 모든걸 따져야 하기 때문에 성능 테스트 툴을 이용해 물리적으로 적절한 값을 찾아야한다.
naver에서 만든 nGrinder가 있다고 한다.

적정 스레드 : https://junshock5.tistory.com/147

Reference

https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR

https://steady-coding.tistory.com/599

https://12bme.tistory.com/555

profile
내 꿈은 좋은 개발자

0개의 댓글