Spring으로 Servlet을 다룬다는 것

pastaCoder·2022년 10월 27일
0

Servlet

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

원래 웹서버는 클라이언트 요청에 대해서 정적인 페이지로만 응답할 수 있었음.
그래서 웹서버에 프로그램을 붙여서 동적인 페이지를 생성하기 시작함
서블릿도 웹서버에 붙이는 프로그램중 하나

서블릿 컨테이너 - 서블릿들의 생성, 실행, 파괴를 담당한다. 서블릿들을 위한 상자(Container).

근데 궁금한점이 서블릿이 어떻게 만들어지는가였다.

spring 코드를 다 읽고 만들어지나? 아니면 요청에 필요한 부분만 읽고 만들어지나?

원본 서블릿은 스프링을 읽어 만들어지는것 하나고, 서블릿을 상속받은 클래스에 서블릿 기능을 정의한 뒤 url 요청에따라 servlet을 매핑해주는 형태로 작동하고있었다.

서블릿은 생성후 소멸되지않는데 싱글톤 객체로 생성이 되었다가, 같은 요청이 들어오면 재 사용된다. 해당 작업을 서블릿 컨테이너가 결정함.


위의 그림처럼 요청이 들어오면 요청에 매핑된 서블릿을 서블릿 컨테이너에서 인스턴스 존재 유무를 확인하고, 없으면 생성한 뒤 service실행을 해줌

Servlet에 여러 요청이 들어온다면?

Q: 요청을 처리하는 도중 다른 요청을 처리할 일이 생기면 어떻게 하나?
A: 멀티스레드로 요청을 처리하게 됨

여러 스레드가 생성이 되고 요청 처리도중 다른 요청이 날아온다면 다른 스레드랑 다른서블릿이 처리할 수도 있고, 여러 스레드에서 한 서블릿의 여러 요청을 처리하는 상황이 생길수도 있음
멀티스레딩은 굉장히 조심해서 사용해야함. 스레드 생성에 많은 자원이 사용되고, 다른 스레드로 전환하는 컨텍스트 스위치가 많은 오버헤드를 일으킴
또한 스레드 생성에 제한을 두지 않는다면 많은 요청을 처리하기위해 그만큼 많은 스레드를 생성하다가 서버의 한계를 넘어버리게되면 서버가 터질수도 있음

멀티스레드방식의 문제점과 Dispatcher Servlet

멀티스레드를 사용할때 문제점중 하나는 핸들러의 공통 로직 중복이있음
요청을 받고 포장해서 결과를 보내고 하는부분, 즉 모든 요청을 받는 전면 컨트롤러를 Dispatcher Servlet이라고 부름

그래서 이전의 개발방식은 요청마다 서블릿을 정의하고 요청을 수행할때마다 매번 스레드를 생성했다면 이제는 하나의 서블릿만 정의하고 해당 서블릿이 모든 요청에 대응할 수 있도록하는 전략을 사용함.

결국 스프링을 쓴다는건 위 그림에서 빨간부분에 대한 부분들은 스프링이 처리해주고 개발자들은 노락색 부분, 즉 핵심 로직만 신경쓰면 된다는 뜻이다.

출처 - [10분 테코톡] 🐶 코기의 Servlet vs Spring

0개의 댓글