이번 시간에는 간단하게 SpringBoot / JPA / 웹서버 / 톰캣 등등 항상 내가 사용하고 있지만 정확한 flow를 파악하지 못해 전체적인 흐름 정리 및 복습시간을 가졌다.
서블릿이 없다면 이러한 http요청 하나하나 해석하고 만들어야 되므로 시간이 많이 소모된다.
서블릿을 통해 웹 요청을 다루면 개발자는 집중해야되는 서비스 로직에 더 집중 가능
백단에서 톰켓이란녀석이 request에 해당하는 자바웹페이지를 골라서 준다라고만 간단히 알고 있엇다. 이번시간에는 더 자세히 알아보자
Spring은 URL(자원접근) 방식 불가
그래서 URI(식별자 접근) 방식으로 접근을하고(톰켓을 거친다) 응답은 URL방식으로 나감
첫번째 호출시 request가 오면 톰켓 내부에서는 서블릿 객체가 생성된다. 그리고 init() 메서드로 초기화를 시켜주고 Service()에서 reques(httpMethod) 에 해당하는 부분 실행, 이 부분에서 DB에 연결하고, 데이터를 가져온뒤, 응답을 해준다.
두번쨰 호출부터는 서블릿객체생성 x , init() 초기화 x, 다음 과정은 똑같다.
이 과정은 스레드 하나에 할당되며 request가 몰려서 최대 스레드를 넘어가면 대기상태로 들어간다. 그러고 난뒤에 스레드가 작업을끝내면 작업을 끝낸 스레드에게 다음 request를 준다.이러한 재사용 하는 기법을 pooling기법이라 한다
처음에 요청이오면 바로 자원접근이 불가능하니(Spring특징) 톰켓을 한번 거친다. 그떄 톰켓에서는 request/response 객체를 만들어준다.
Request ->톰켓문지기(web.xml) 하는일 요청이 많아 frontController에서 request를 좀 받는다 ->request.do(특정주소) - >frontController에서 낚아챈다. -> 자원을 찾아갈수있도록 request해줌 -> 그럼 기존에 톰켓이 만들었던 request/response 객체가 바뀐다. 그럼 최초요청 request A에대한 데이터도 바뀜 ->
=> 이걸 방지하고자 나온게 requestDispatcher (톰켓이 만들었던 기존의 request/response 를 유지한다)
requestDispatcher = 기존의 request/response 데이터를 유지시켜준다. 데이터를 들고 다음페이지 이동
frontcontroller + requestDispatcher = DispatchServlet(스프링에서 제공)
DispathcServlet이 자동생성되어 질때 수많은 객체가 생성(ioc) 된다 . 보통은 필터들이다.
JSP에서는 front , requestDispatcher 다 직접 짜야하지만 스프링은 제공해줌
컴포넌트 스캔
주소 분배를 하려면 그 클래스들(자바파일들) 을 메모리에 띄어줘야하는데 src에 있는 모든 파일들을 생성해준다. (그래서 우리가 new로 생성안해도 됌)
생성된 객체들은 IOC컨테이너에서 관리한다.
DispatchServlet이 자동으로 우리가 필요한 자바 파일들을 src에서 찾아 만들어주는데 무슨 기준으로 만들까?
-> 애노테이션
handlerMapping = 해당 컨트룰러를 찾아줌
handlerAdapter = 컨트룰러 안 메서드 찾아줌
4.modleAndView 로 데이터를 받고 -> 뷰리졸버
위 세가지 모두가 DIspatchServlet이 스프링컨테이너로부터 주입받아서 사용하고 동작함
결론적으로 우리가 코드를 작성하고 (자바객체) 그것을 스프링이 컨테이너(IOC)에서 관리를 하고 DispatchServlety이 그 스프링 컨테이너를 주입받아 사용하고 동작한다!!!!
DispatcherServlet 에서 ->쓰레드 만들고 -> src 에서 자바피일들 띄우고 새로운요청이오면 반복, 반복된 작업
그래서 그전에 web.xml 이 ContextLoaderListner 녀석을 띄워주고 -> root-ApplicationContext라는 파일을 읽어 쓰레드들이 공통적을 사용하는 것들을 미리 띄워준다.(EX =DB)
request -> web.xml -> ContextLoaderListner -> DispathcerServlet
DIspachServelt 이 클래스들을 띄우고 handlerMapping에게 요청에 해당하는 클래스 파일을 찾으라한다(주소분배)
페이지 반환시 viewResolver 에서 그 파일이름 앞뒤로 web-INF.views/파일이름/.jsp 이런식으로 붙여 리턴해준다
data반환시 @ResponseBody 붙이면 리턴값을 파일이아닌 데이터로 반환.
엔티티나 dto반환시에는 클라이언트쪽에서 객체를 이해못하니
messageConverter(Jakson)라는 녀석이 이것을 JSON형식으로 바꿔준다