웹서버 : 클라이언트가 요청하는 정적 컨텐츠를 전달하는 서버
웹 컨테이너 : Servlet, jsp를 실행할 수 있는 소프트웨어, 서블릿 컨테이너라고도 한다. 톰캣은 서블릿 컨테이너중 하나이다.
요청을 받을시 서블릿 컨테이너(톰캣)가 request, response 객체를 생성한다. (톰캣에서 BufferedWriter, BufferedReader를 통해 요청으로부터 가변길이의 문자를 받고 request, response 객체를 생성)
이후 요청에 매핑된 서블릿이나 프론트 컨트롤러로 전달
JSP 파일을 요청했을 때 동작.
클라이언트가 어떤 동작을 함으로써 hello.jsp 를 요청.
클라이언트가 JSP 파일을 요청할 경우 제어권이 서블릿컨테이너(톰캣)로 넘어감
JSP 컨테이너가 JSP 파일을 읽는다.
JSP 컨테이너가 Generete (변환) 작업을 통해 Servlet ( .java ) 파일을 생성한다.
.java 파일은 다시 .class 파일로 컴파일된다.
Execute (실행) 을통해 HTML 파일을 생성하여 웹서버에게 전달한다.
HTTP 프로토콜을 통해 HTML 페이지를 클라이언트 에게 전달한다.
URI 식별자 접근을 통한 서블릿 실행
스프링에서는 URL을 통한 자원 접근 X, URI를 통한 식별자 접근 → 특정한 파일 요청을 할 수 없고 요청시에는 무조건 자바를 거친다
URL (자원 접근) : http://www.naver.com/a.png
URI (식별자 접근) : http://www.naver.com/picture/a
최초 요청시 첫번째 쓰레드에서 서블릿 객체 실행 (new) → 힙 메모리에 인스턴스 정보 올라감(메소드)
생성된 스레드는 응답 후에도 종료되지 않고 (힙 메모리 유지) 똑같은 요청이 들어올 시 독립된 스택공간에서 메소드 실행 후 응답
여러 사용자가 동시에 요청시 쓰레드의 갯수가 늘어남(최대 20이라 가정)
최대 쓰레드 이상의 사용자가 요청 시 대기하다가 응답이 종료된 쓰레드부터 재사용 (pooling)
참고로 알아 둘 지식 : 동시 최대 쓰레드의 설정은 컴퓨터 성능에 의존함,
이 때 두가지 방식으로 동시 최대쓰레드의 갯수를 늘릴 수 있음
Scale Up : 컴퓨터의 성능 자체를 상향시키는 방법
Scalue Out : 배치방식으로 분산처리로 여러대의 컴퓨터가 처리하도록 함
참고로 Servlet/JSP Mapping시(web.xml에 직접 매핑 or
@WebServlet
어노테이션 사용)에 모든 클래스에 Mapping을 적용시키기에는 코드가 너무 복잡해지기 때문에 FrontController 패턴을 이용함.
모든 클래스에 Mapping을 적용시키기에는 코드가 너무 복잡해짐 → 최초 앞단에서 request 요청을 받아서 컨트롤러를 통해 필요한 클래스에 넘겨준다
RequestDispatcher란?
RequestDispatcher는 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나, 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스, 페이지간 데이터 이동이 가능하게 해줌
스프링에서는 FrontController 패텅을 직접 짜거나 RequestDispatcher를 직접 구현할 필요가 없다. 스프링 프레임워크에는 DispatcherServlet이 있기 때문,
DispatcherServlet에 의해 생성되는 수많은 객체들은 어디에서 관리될까?
Application Context
BeanFactory
@Bean
어노테이션을 붙혀 사용특정 주소 요청이 오면 (HTTP Method에 따라) 적절한 컨트롤러의 함수를 찾아서 실행한다
@ResponseBody
)