- 디스패처 서블릿
이때, 새로운 요청이 생기기 때문에, request와 response가 새롭게 new 될 수 있다. 그래서 아래의 requestDispather가 필요.
bufferedwriter bufferedreader 의 가변 길이의 문자를 받아서 톰캣이 알아서 객체로 만들어준다!
.do 의 특정주소가 들어오면 frontcontroller 가 낚아챈다.
ex) a.do 가 들어오면 자원1에 접근할 수 있도록 reqeust, 다시 요청한다.
톰캣에는 a에 대한 request, response 정보가 있는데, frontcontroller 에서 a.do -> 자원 1로 보내는 요청으로 내용이 덮어씌워지기때문에 기존 내용도 유지하고, 자원1로 보내는 요청내용도 있어야한다.
이 내용을 유지하기 위한 기술 -> requestDispather !
RequestDispather : 필요한 클래스 요청이 도달했을때, FrontController에 도착한 request와 response를 그대로 유지시켜준다.
dispatherServlet : frontcontroller 패턴을 직접 짜거나 requestDispather를 직접 구현할 필요가 없다. 왜냐하면 스프링에 dispatherServlet이 있기 때문. DispatherServlet은 FrontController패턴 + RequestDispather이다.
DispatherSerlvet이 자동생성되어질 때 수많은 객체가 생성(Ioc)된다. 보통 필터들이다. 해당 필터들은 내가 직접 등록할 수도 있고, 기본적으로 필요한 필터들은 자동 등록 되어진다.
- 애플리케이션 컨텍스트
request -> web.xml -> dispatherServlet
dispatherServlet : 컴포넌트 스캔 / 주소 분배를 해준다.
static : main 메소드가 실행되기 전부터 떠있다!
자바파일 : 객체! 생성과 소멸 시점이 있는 애다.
ApplicationContext의 종류 : root-applicationContext / servlet-applicationContext
context는 변태라고 했잖아! 다 알고있는거야. root는
servlet-applicationContext 는 ViewResolver, Interceptor, MultipartResolver 객체를 생성하고 웹과 관련된 어노테이션 Controller, RestController 를 스캔한다.
해당 파일은 DispatherServlet에 의해 실행된다.
root-applicationContext는 해당 어노테이션을 제외한 어노테이션 Service, Repository 등을 스캔하고 DB관련 객체를 생성한다.(스캔이란 메모리에 로딩한다는 뜻)
해당 파일은 ContextLoaderListener에 의해 실행된다. ContextLoaderListener를 실행해주는 녀석은 web.xml이기 때문에 root-applicationContext는 servlet-applicationContext보다 먼저 로드된다.
당연히 servlet-applicationContext에서는 root-applicationContext가 로드한 객체를 참조할 수 있지만, 그 반대는 불가능하다. 생성시점이 다르기 때문이다.
Bean Factory
- 스프링부트가 응답하는 방법!
요청 주소에 따른 적절한 컨트롤러 요청(Handler Mapping)
html 파일을 응답할지 data를 응답할지 결정해야하는데, html 파일을 응답하게되면 ViewResolver가 관여하게 된다.
하지만, data를 응답하게 되면 messageConverter가 작동하게 되는데, 메세지를 컨버팅할때 기본전략은 json이다.
viewResolver가 WEB-INF/views/hello.jsp
suffix, frefix를 통해 앞 뒤에 경로를 붙여준다!
@ResponseBody return 값을 데이터로 본다!
요청한 사람한테 데이터를 전달해준다.
객체를 전달해주면 json으로 변환해서 전달해준다. (이 역할은 messageConvertor가 해준다.)
ex) return user; 이면 messageConverter가 {"id":1, "name" : "홍길동"으로 변환해서 전달해준다.}
data로 응답을 하게 되면 jackson이 동작을 한다. jackson 이라는 것보다 더 좋은 게 나오면 전부 수정해야하기때문에, messageConverter 라고 부른다. (messageConverter를 추상화로 놓고 jackson 구현 객체)
** 추가
1.클라이언트의 요청을 디스패처 서블릿에 전달
2. 요청한 url에 맞는 controller검색하여 handler mapping 에 전달
3. handler mapping에서 해당 controller 에 처리 요청
4. controller에서 처리 결과를 handler adapter에서 modelandview객체로 변환하여 dispatherservlet에 전달
5. dispatherServlet에서 전달받은 modelAndView 객체를 이용하여 매핑되는 view 를 검색
6. viewResolver에서 처리 결과를 view에 전달
7. 처리결과가 포함된 view를 dispather Servlet에 전달
8. Dispather Serlvet에서 최종 응답결과를 클라이언트에게 반환