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를 사용해서 개발할 수 있다는 이야기
✔ 최종적인 목적은 개발자에게 핸들러,
즉 우리가 개발할 때 집중해야하는 요청처리 로직들에만 신경을 쓸 수 있도록 하기 위함
'개발자노트 > 우아한 테코톡 감상' 카테고리의 다른 글
[10분 테코톡] 🎨 신세한탄의 CSR&SSR (0) | 2022.07.25 |
---|---|
[10분 테코톡] 🌳 나봄의 CORS (0) | 2022.07.25 |
[10분 테코톡] 🕶 곤이의 DOM&BOM (0) | 2022.07.24 |
[10분 테코톡] 🦄 콜린의 Flex Layout (0) | 2022.07.23 |
[10분 테코톡] 🎉 동동의 CSS 방법론 (0) | 2022.07.23 |