이번 포스팅에서는 Spring에서 사용하는 서블릿이 무엇인가, 그리고 이와 관련하여 Spring은 어떤 동작을 하는지에 대해서 정리하려고 합니다.
서블릿
1. 서블릿의 개념
서블릿은 request, response을 통해 동작하는 프로그래밍 모델에서 웹 서버의 역할을 **확장**할 수 있도록 하는 자바 클래스입니다. 서블릿은 request를 받고 동적인 웹 페이지를 만들어 client에 응답합니다.
*확장의 의미
정적인 리소스를 응답하는 웹 서버에 동적인 웹 페이지 응답을 전달하는 WAS의 역할을 하는 것입니다.
WAS = 웹 서버 + 서블릿 Container
2. 서블릿의 동작 과정
순서
- WAS의 서블릿 컨테이너가 Servlet 객체를 생성
- Client가 해당 Servlet을 사용하는 http 요청을 하면, Servlet Container에서 request, response 객체 생성
- 쓰레드가 Servlet 객체를 호출하고 Request, response 객체를 Servlet에 넘김
(ThreadPool에서 가용할 수 있는 Thread를 가져오고 이 것이 Servlet을 관리) - request 객체를 활용해 Servlet의 비즈니스 로직 실행
- 응답 결과를 response 객체에 담은 후, Servlet Container에 전달
- Sevlet Container가 http response 메시지를 생성 후 client에 전달
3. 서블릿의 특징
- 서블릿은 재사용되므로, 새로운 요청마다 서블릿을 생성하지 않아 CGI보다 빠릅니다.
- 서블릿끼리 data를 공유할 수 있습니다.
- Web server와 direct하게 communicate할 수 있습니다.
- 가격이 CGI보다 저렴합니다.
- java의 다양한 API를 사용할 수 있습니다. ex) JDBC 등
- 자바로 작성되어 있기 때문에 platform에 독립적으로 사용할 수 있습니다.
Q) servlet의 생명주기에는 destroy가 있다. 재사용된다고 했는데 그럼 구체적으로 언제 destroy 되는가
- life cycle은 서블릿을 배포한 Servlet container에 의해 control됩니다. Servlet Container에 의해 관리되는 것이지 Spring Container에 의해 관리되는 것이 아닙니다.
4. 서블릿의 Sharing
- 자바빈 component와 같은 private helper objects를 서블릿끼리 공유할 수 있습니다.
- public scope의 속성을 가진 objects를 공유할 수 있습니다.
- DB 사용을 공유할 수 있습니다.
- 다른 web resources를 공유할 수 있습니다.
주의점
multiThread server에서는 자원이 동시에 접근될 수 있습니다. shared resource에는 위에 제시한 것에 더해 instance, class의 변수, network connetion 등이 존재할 수 있습니다. Web Container는 하나의 요청을 다루기 위해 하나의 Thread를 생성하여 Servlet이 한 번에 하나의 요청을 다루게 합니다.(SingleThreadModel로 구현됨) 하지만 이 interface는 동시성 이슈를 해결하지 못합니다. 따라서 이를 해결하기 위해 synchronization 기술들을 사용해야 합니다.
스프링 MVC
1. spring container VS servlet container
Spring Container
IOC 컨테이너로 빈을 생성하고 의존성을 주입하여 스프링 어플리케이션의 생명주기를 관리합니다.
Servlet Container
java Servlet, JSP 등을 구현한 웹 컨테이너로 자바 웹 어플리케이션이 존재할 수 있는 환경입니다. Web Container라고도 합니다.
Spring은 웹 어플리케이션이므로 Spring Container는 Web Container 안에 존재할 수 있는 것입니다.
2. spring에서의 Servlet
스프링에서도 또한 이 Servlet을 사용하여 Client와 응답을 주고 받습니다. 하지만 Servlet에서 응답을 받고 비지니스 로직, 뷰 렌더링까지 모두 처리하면 여러 기능이 한번에 들어가버립니다. 결과적으로는 유지 보수가 어려워지고 이에 따라 Spring은 이를 위해 MVC 패턴을 사용합니다. 스프링은 MVC 패턴에서 Front Controller라는 단 하나의 Servlet을 사용합니다. 이 Servlet이 익숙한 DispatcherServlet입니다.
참고
https://docs.oracle.com/javaee/6/tutorial/doc/bnafi.html
https://docs.oracle.com/javaee/6/tutorial/doc/bnafo.html
https://stackoverflow.com/questions/28040529/what-is-the-difference-between-servlet-container-and-spring-container
https://docs.spring.io/spring-framework/reference/core/beans/introduction.html
'백엔드 > Spring' 카테고리의 다른 글
jwt refresh token 을 Redis로 리팩토링하기 (0) | 2024.03.04 |
---|---|
Service 계층 단위 테스트를 위한 Mockito 사용하기 (0) | 2023.10.17 |
[Spring] 디렉터리 패키지 구조 구성하는 방법 (0) | 2023.03.13 |
[Spring] JSP 대신 Thymeleaf를 사용하는 이유 (0) | 2022.08.22 |
[Spring] 상품 상세, 등록폼, 등록 처리, 상품 수정 (0) | 2022.07.28 |