본문 바로가기
개발 관련 강의 정리/10분 테코톡

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

by 코딩개발 2023. 4. 28.
728x90
반응형

Spring으로 Servlet을 다룬다는 것

 

1. 서블릿이란

서블릿 : 동적 페이지는 만드는데 사용되는 웹서버의 프로그램

개발자들이 서블릿을 사용하면 어떤 실질적인 이익이 있는가?

 

HTTP 형태의 요청을 직접 파싱 vs HttpServletRequest의 메서드 호출

서블릿을 사용하면 비즈니스 로직에 더 집중할 수 있다.

서블릿을 사용하면 서비스 메서드만 재정의해서 처리방법을 지정하면 된다.

 

 

2. 서블릿 컨테이너와 서블릿 동작 방식

사용자 요청이 들어오면 서블릿 컨테이너는 해당 요청과 매핑된 서블릿을 찾는다.

서블릿 컨테이너가 어떤 서블릿 어떤 요청과 매핑되어 있는지 어떻게 알 수 있을까?

설정 파일에 정의되어 있다.

 

/hello라는 요청이 들어오면

HelloServlet이란 서블릿으로 처리할 것 이다.

HelloServlet은 servlet패키지 아래 HelloServlet이라는 클래스 파일로 정의되어 있다.

 

서블릿 컨테이너가 이 설정을 읽고 이 요청이 어떤 서블릿이 필요한지 알게되면 서블릿 인스턴스가 컨테이너에 있는지 확인한다. 인스턴스가 존재한다면 그 인스턴스를 그대로 사용, 없다면 생성해서 가져가 사용하게 된다.

그 후에 서블릿 컨테이너에 스레드를 생성하고 미리 만든 HttpServletRespose와 HttpServletRequest 객체를 인자로 서비스를 호출한다. 서비스 메서드를 재정의한 로직이 수행된다. 마지막으로 respose, request 객체를 소멸 시키고 끝난다.

서블릿은 싱글톤으로 관리되어 소멸시키지 않는다.

서블릿 컨테이너는 결국 서블릿의 생명주기를 관리하는 객체이다.

 

만약 여러 요청이 들어온다면?? 멀티스레드로 요청을 처리한다.

스레드 생성은 큰 비용을 만들고 다른 스레드로 전환하는 Context Switch가 많은 오버헤드를 일으킨다.

요청당 서블릿을 정해주는 곳에는 비효율적인 부분이 있다.

관리 측면 : 스레드를 다뤄야한다.

개발 측면 : 핸들러의 공통 로직이 매번 중복된다.

 

예시)

아메리카노만, 콜드브루만, 카페모카만 만들수 있는 직원이 있다고 가정

1, 3번 중복된 부분을 한사람이 하면 효율적일 것이다.

 

 

3. 프론트 컨트롤러 패턴

손님의 요청을 앞단에서 처리할 수 있는 일을 전담하는 매니저를 두는게 프론트 컨트롤러 패턴이다.

 

스프링 MVC프론트 컨트롤러 패턴을 따르고

모든 요청을 받는 전면 컨트롤러 서블릿Dispatcher Servlet이라고 부른다.

 

이전에는 요청을 수행할 때마다 매번 스레드를 생성했다면

이제는 하나의 서블릿만 정의하고 그 서블릿을 모든 요청을 수행할 수 있도록 하는 전략을 따른다.

 

 

4. Dispatcher Servlet의 요청 처리 과정

손님이 너무 많아 전면 매니저도 일이 너무 밀리면 어떡하죠?

아래와 같이 분리한다.

 

Dispatcher Servlet도 비슷하다.

 

 

개발자들이 신경써야 할 부분은 노란색으로 표시된 컨트롤러 또는 핸들러 이다.

스프링 없이 개발했다면 빨간색들도 다 직접 처리했어야 할 부분이였다.

빨간색 부분들은 Dispatcher Servlet이 스프링 컨테이너로부터 주입을 받아서 사용하고 동작하게 되어있다.

 

 

5. 스프링 컨테이너 맛보기

스프링 컨테이너는 프로그램이 동작하는 동안 사용되는 자바 객체들을 프레임워크가 대신 관리하고 보관하기 위해서 사용되는 바구니이다.

서블릿 웹 어플리케이션 컨텍스트웹 요청 처리 관련 객체들이 담겨있고

루트 웹 어플리케이션 컨텍스트 안에는 웹 요청처리 관련된 빈 외의 컴포넌트들 그러니까 서비스, 레포지토리 관련 객체들이 관리가 되는 것이다.

 

이 컨테이너가 개발에 필요한 부분이나 디스패처서블릿이 요청을 처리할 때 필요한 부분은 알아서 주입하게 된다.

 

한마디로 서블릿 설정파일만 잘 작성해주면 설정대로 생성된 객체가 스프링 컨테이너에서 관리되고 필요한 부분에서 주입 받아서 디스패처서블릿이 알아서 사용할 수 있게 된다.

 

스프링으로 웹 요청을 처리한다는 것은 스프링 mvc에서 제공하는 디스패처서블릿과 웹 요청 처리 관련 구현체들을 사용할 수 있다는 이야기와 동시에 스프링 컨테이너, 즉 스프링 IoC를 사용해서 개발할 수 있다는 이야기이다.

그래서 최종적인 목적은 개발자에게 핸들러, 그러니까 우리가 개발할 때 집중해야하는 요청처리 로직들에만 신경을 쓸 수 있도록 하기 위함이다.


참고

https://www.youtube.com/watch?v=calGCwG_B4Y&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC 

728x90
반응형

댓글