본문 바로가기

개발자노트/우아한 테코톡 감상

[10분 테코톡] 🐶 코기의 Servlet vs Spring ( Spring으로 Servlet을 다룬다는 것 )

1. 서블릿이란? 

처음 웹 서버는 클라이언트의 요청에 따라 정적인 페이지로만 응답할 수 있었음

그래서 웹 서버에 프로그램을 붙여서 동적인 페이지를 생성하기 시작함

✔ 서블릿도 동적인 페이지를 만들기 위해 웹 서버에 붙이는 프로그램 중 하나인 것!

 

그렇다면 서블릿을 사용하면 어떠한 실질적인 이득이 있는가?

복잡한 http 요청을 개발자들이 직접 처리,분석해서 모든 규약과 제약에 맞춰 텍스트 형식의 응답을 보내야 한다면

    굉장히 어렵고 복잡함

  이 때, 서블릿이 요구하는 구현 규칙을 지켜주면서 서블릿을 정의해주면 http 요청 정보를 쉽게 사용할 수 있고, 

     처리결과를 쉽게 응답으로 변환할 수 있음

✔ 서블릿을 이용하여 웹 요청을 다루게 되면 개발자들이 진짜 집중해야하는 비즈니스 로직 (처리 로직) 에 집중할 수 있음

 

 

서블릿의 내부구조

각 요청에 따른 수행을 정의해줌

 

 

 

 

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

1. Servlet Request / Servlet Response 객체 생성

2. 설정 파일을 참고하여 매핑할 Servlet을 확인

3. 해당 서블릿 인스턴스 존재 유무를 확인하여 없으면 생성 (init())

4. Servlet Container에 스레드를 생성하고, res , req를 인자로 service 실행

5. 응답을 처리한 res, req 객체를 소멸시킴

 

✔ res, req 객체는 생성하고 소멸시켰는데 서블릿은 생성만 하고 소멸시키는 동작을 하지 않음

    → 서블릿은 싱글톤으로 관리가 됨

    → 서블릿 객체는 소멸되고 있지 않다가, 다음번 같은 요청이 들어왔을 때 서블릿 컨테이너에 의해 또 호출돼서 사용됨

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

 

 

만약 여러 요청이 들어온다면 ?

  멀티스레드로 요청을 처리하게 됨

✔ 하지만 멀티 스레드를 사용하는 것은 굉장히 조심해야함.

   → 스레드의 생성 자체가 큰 비용을 만듦 

    다른 스레드로 전환하는 Context Switch가 많은 오버헤드를 야기함

     스레드 생성에 제한을 두지 않는다면 많은 요청을 처리하기 위해 그만큼 많은 스레드를 생성하다가

        서버의 하드웨어 한계를 넘어버리면 서버가 터질 수도 있음

 

 

 

 

 

3. 프론트 컨트롤러 패턴

 

 

스프링 MVC

 

✔ Spring에서도 Dispatcher Servlet을 하나만 두고, 모든 요청을 다 받을 수 있도록 함! 

 

 

Dispatcher Servlet이 Web 요청을 처리하는 과정

 

Dispatcher Servlet은 모든 요청을 다 받음

✔ Handler Mapping이 내 요청을 처리할 때 컨트롤러를 찾아서 반환함

✔ Handler Adapter는 그 컨트롤러의 메서드를 호출하여서 처리 로직을 수행하는 역할을 함

✔ 그 처리 결과를 Model / View 객체로 변환해서 Dispatcher Servlet에 넘기고

✔ 다시 Dispatcher Servlet은 View 리졸버를 이용해서 뷰를 찾거나 생성을 하게 됨

✔ 그렇게 얻은 View 에 아까 Model로 들어왔던 데이터를 넣어서 응답결과 생성을 요청해서

✔ 우리가 볼 수 있는 JSP나 Thtmeleaf같은 데이터를 담은 출력 파일로 응답을 하게 됨

 

일이 많아졌다고 생각하지만,

→ 결국 개발자들이 신경써야 할 부분은 컨트롤러 또는 핸들러 이것 뿐이다.

그렇다면 나머지 Handler Mapping, 뷰리졸브, Handler Adapter 같은것들은 누가 수행하나 ?

→ Dispatcher Servlet이 스프링 컨테이너로부터 주입을 받아서 사용하고 동작을 하게 됨!!

 

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

✔ 루트 웹 어플리케이션 컨텍스트 안에는 웹 요청처리 관련된 빈 외의 컴포넌트들

   서비스, 레포지토리 관련 객체들이 관리가 됨

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

✔ 즉, 서블릿 설정파일만 잘 작성해주면 설정대로 생성 된 객체가 스프링 컨테이너에서 관리되고

   필요한 부분에서 주입 받아서 디스패쳐서블릿이 알아서 사용할 수 있게 됨

 

 

 

 

스프링으로 웹 요청을 처리한다는 것은 

✔ 스프링 mvc에서 제공하는 디스패쳐서블릿과 웹 요청 처리 관련 구현체를 사용할 수 있다는 이야기

✔ 동시에 스프링컨테이너, 즉 스프링 IoC를 사용해서 개발할 수 있다는 이야기

✔ 최종적인 목적은 개발자에게 핸들러,

   즉 우리가 개발할 때 집중해야하는 요청처리 로직들에만 신경을 쓸 수 있도록 하기 위함