스프링을 공부한다고 이런저런 강의를 구매해서 듣고있는데, 막상 기본적인 내용을 잘 모르고있어 간단히 정리해보는 시간을 갖게 되었다 🙌
Servlet ➰
- 동적 웹 페이지를 만들기 위해 사용되는 자바의 웹 애플리케이션 프로그래밍 기술
- 웹 클라이언트의 요청을 처리하고 응답하는 클래스(HttpServlet을 확장한 클래스)
- 웹 요청의 저수준 처리를 담당함
생명주기
- init(): servlet을 초기화하고 servlet이 이용하는 자원을 할당하는 동작을 수행
- service(): 사용자의 요청이 올때마다 해당 메소드를 호출하여 요청을 처리
- destroy(): servlet이 삭제될 때 호출
HTTP 요청, 응답 흐름
- 웹 브라우저에서 특정 url으로 요청
- WAS에서 HTTP 요청 메세지를 기반으로 request, response 생성
- WAS에서 서블릿 객체 호출
- 서블릿에서 실행이 끝나고 리턴
- WAS가 response객체에 담겨있는 내용으로 HTTP 응답 정보 생성 후 리턴
서블릿과 스프링 mvc의 controller와의 관계
Servlet Container ➰
- Servlet의 생명주기를 관리하고, 매번 요청이 들어올 때마다 새로운 스레드를 요청 별로 부여한다
- 서블릿 객체는 싱글톤으로 관리하고 동시 요청을 위한 멀티 쓰레드 처리를 지원한다
- 쓰레드를 요청마다 생성하게 되면 생기는 문제
- 쓰레드의 생성비용은 매우 높고, 컨텍스트 스위칭 비용이 발생하게 된다.
- 이런 단점을 보완하고자 나온 것이 쓰레드 풀이다
- 일정 갯수의 쓰레드를 미리 생성해두고, 요청이 올 때마다 해당 쓰레드 풀에서 쓰레드를 꺼내서 사용한다.
- 이 쓰레드 사용이 끝나면 없애는것이 아닌 다시 쓰레드 풀에 반납하게 된다
- 쓰레드 생성/소멸에 필요한 비용을 줄일 수 있고, 매번 요청마다 쓰레드를 생성함으로써 생기는 단점도 해결할 수 있다
- 요청이 올 때마다 웹 서버에서 반복적으로 처리해야하는 작업을 대신 수행해 개발자가 비즈니스 로직에만 전념할 수 있도록 한다
- 대표적으로 톰캣이 해당된다
Spring container와 Servlet container의 관계
- 스프링 컨테이너는 자바 객체(빈)의 생명 주기를 관리하며, 객체 간의 의존 관계를 관리한다 이 과정에서 Ioc, DI와 같은 원칙을 사용한다
- Bean Factory
- 스프링 컨테이너의 최상위 인터페이스
- 빈을 등록, 생성, 조회 등의 빈을 관리
- ApplicationContext
- Bean Factory를 포함한 여러 인터페이스들을 상송받은 인터페이스
- 메시지 국제화 처리, 이벤트 발행, 애플리케이션 구동 정보 관리 등 확장된 기능 제공
[참고자료]
https://velog.io/@youns/%EC%84%9C%EB%B8%94%EB%A6%BF1-%EC%84%9C%EB%B8%94%EB%A6%BFServlet-%EC%9D%B4%EB%9E%80
https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5
https://coding-factory.tistory.com/742