서블릿(Servlet)
서블릿(Servlet)이란
- 자바 진영에서 동적인 웹 페이지를 구현하기 위한 표준
- Servlet 표준을 정한 후 interface를 제공
-
각 Servlet에 대한 구현체는 Tomcat, Jetty등이 있다.
- HTTP의 응답과 요청을 parsing할 수 있는 것들을 정의해놓은 것
- 서블릿은 인터페이스로 표준을 제공하고 이를 구현한 tomcat, jetty등이 있음
- 인터페이스 기반으로 만들었을 때는 다른 것으로 옮겼을 때도 내부 로직에 대한 수정의 거의 없다.
서블릿의 단점(?)
- 표준을 지키다 보니 변화에 대응하는 것이 느림 -> 자바가 하위 호완성을 잘 보장하는데 안정적인 변화 발전이 있음, 엔터프라이즈 급 회사들이 자바를 택하는 이유
- 빠르게 변화하는 자바스크립트 등은 안정성이 자바에 비해 상대적으로 떨어질 수 있음.
자바의 리플렉션
- 자바의 동적 처리를 위해 사용
프로세스 vs 쓰레드
- 하나의 프로세스 위에서 여러개의 쓰레드가 일정 부분 데이터를 공유한다.
웹 서버 vs WAS vs 서블릿 컨테이너
static content(WS) vs dynamic content(WAS, 서블릿 컨테이너)
사용되는 위치
-
웹 서버 : 정적 웹페이지를 제공하는 경우
-
WAS : 그 외의 동적 컨텐츠를 사용하는 경우
spring mvc framework
- 서블릿의 역할을 mvc가 각각의 역할에 맞게 분배하여 실행한다고 이해할 수 있다.
- 실질적인 서블릿은 front controller(Dispatcher Servlet)이라고 볼 수 있다.
- was(tomcat, jetty 등)의 서블릿 컨테이너에 Dispatcher Servlet이 올라가있고, 이 서블릿이 모든 요청을 받아 그에 맞는 컨트롤러에 전달하여 결과를 받아 다시 클라이언트에게 전달한다.
Q. 서블릿 컨테이너에서 서블릿 인스턴스는 몇 개인가
A. 각 서블릿 인스턴스는 하나이다. 모든 사용자 요청에 대해 하나의 서블릿 인스턴스
가 재사용 된다.
Q. 멀티쓰레드에서 인스턴스를 재사용할 때 발생할 수 있는 문제점? A. 메소드 내의 local 변수들의 경우에는 스택 영역에 저장되어 따로 관리되게 되지만, 인스턴스(필드)를 가지게 된다면 Heap 영역에 저장되어 해당 Servlet을 사용하는 모든 스레드에서 인스턴스들을 공유하게 된다. 이런 상황을 피하기 위해 내부에 인스턴스(필드)를 가지지 않게 하거나, 피치 못하게 사용해야 하는 경우는 Collections.synchronizedList같은 함수를 사용하거나 해서 동기화 처리르 해주어야 함.
Q. 서블릿에서 IOC(제어의 역전) A. 서블릿의 생명 주기를 프로그래머가 관리하지 않고 컨테이너가 대신 관리해 주는 것을 이야기 한다.
참고 : https://xmfpes.github.io/java/servlet-end/
멀티쓰레드에서 인스턴스를 재사용할 때 발생할 수 있는 문제점
서블릿 컨테이너의 쓰레드 톰캣 서버는 멀티쓰레드다 서블릿 컨테이너는 모든 사용자 요청에 대해 쓰레드를 생성해야 하나 -> 기본은 200개
jpa는 ????????????????????????????????????????????????????? 스프링 mvc는 서블릿을 밑에 깔고있다?