1. 요청
2. DispatcherServlet(모든 요청과 응답의 창구)
- service() : 모든
- BeanContainer bc = BeanContainer.getInstance(); : 객체 컨테이너
bc.addBean(HttpServletRequest.class.getName(), request);
bc.addBean(HttpServletResponse.class.getName(), response);
bc.addBean(HttpSession.class.getName(), request.getSession());
서블릿 기본 객체 : 매 요청시마다 바뀌어야 하기 때문에 매번 객체 생성해줘야 하는객체라 직접 생성
- bc.loadBeans(); : 모든 객체를 불러옴
RouterService service = bc.getBean(RouterService.class);
service.route(request, response);
라우터 역할
![](https://velog.velcdn.com/images/psh666777/post/6a28cac1-65e8-419b-81a1-32635b9e2a59/image.png)
![](https://velog.velcdn.com/images/psh666777/post/67e47996-b888-4440-960f-46537a112152/image.png)
ㄴ 핸들러 매핑 : 요청이 들어오면 해당 컨트롤러랑 메서드를 찾아줌
![](https://velog.velcdn.com/images/psh666777/post/b8d72e61-44b3-42d9-b1d8-8784b4435f05/image.png)
ㄴ 핸들러 매핑=널(해당 컨트롤러를 못찾음) -> 웹스테틱 올 업로드 경로쪽으로 라우팅 -> 그래도 없다 -> 낫파운드(404)
![](https://velog.velcdn.com/images/psh666777/post/2cb20add-8c75-4c66-a630-7d82d1efd822/image.png)
ㄴ 웹스테틱 올 업로드 경로
![](https://velog.velcdn.com/images/psh666777/post/d06e3836-e94e-444d-9191-04c2ae6551ef/image.png)
ㄴ 낫파운드(404)
![](https://velog.velcdn.com/images/psh666777/post/8110dc7d-e514-4e6e-9ed0-dc1e9a464d35/image.png)
ㄴ 핸들러 어댑터 : 찾았으면 찾은 컨트롤러와 메서드 기능을 실행해주는 역할
![](https://velog.velcdn.com/images/psh666777/post/d6513e81-65e3-411c-8bad-50e8214affc3/image.png)
ㄴ 우리가 정의한 예외? -> 우리가 정의한 페이지 및 응답코드 보여줌
ㄴ 서블릿 기본예외는 응답코드 500
3. BeanContainer::loadBeans() : 모든 관리 객체 로드(객체 생성 및 의존성 주입)
- 특정 애노테이션이 있는 객체를 자동 생성, 의존하는 객체 주입
- @Controller : 컨트롤러 역할 객체
- @RestController : 컨트롤러 역할 객체 - 응답시 JSON 형태로 응답
- @Service :
- @Component :
- @ControllerAdvice : @Controller의 공통처리
- @RestControllerAdvice : @RestController의 공통처리
- private Map<String, Object> beans; : 관리 객체를 map형태로 (싱글톤)
- 키값 : 전체클래스명
- object : 객체 공간?
- private MapperProvider mapperProvider; : 마이바티스 객체를 싱글톤으로 하면 db업데이트가 안되니까 매번 객체 생성하도록 따로 뺌
- 싱글톤❌ : HttpServlet resp, req, 마이바티스 매버객체
- public void loadBeans()
- getResource("../../../").getPath()) : 컴파일된 클래스 파일 기준
- getClass().getResource(...) : 현재 클래스파일(BeanContainer) 물리적 경로
build/.../BeanContainer.class(자바파일로 하면 안됨)
![](https://velog.velcdn.com/images/psh666777/post/77286489-1873-4f53-98aa-ac8e07711204/image.png)
![](https://velog.velcdn.com/images/psh666777/post/550f812b-49e7-4fd7-8f1d-4d61aa1119c1/image.png)
![](https://velog.velcdn.com/images/psh666777/post/bac951a9-f107-4ee3-9309-aaa463ab7860/image.png)
ㄴ 모든 파일
![](https://velog.velcdn.com/images/psh666777/post/6d74ed15-63e0-4eaa-8625-a0d56bc36c14/image.png)
ㄴ 동적객체생성?
![](https://velog.velcdn.com/images/psh666777/post/0353e8a5-dbb3-4ac7-aad0-117a6f92b9e9/image.png)
ㄴ 관리객체
![](https://velog.velcdn.com/images/psh666777/post/2417e0b7-f912-42a9-9d26-45826f09edc5/image.png)
ㄴ 생성자가 한개만 있어야 함
ㄴ 생성자가 2개이면 뭘 써야 할 지 알수 없기 때문에 생성자 1개만 정의하고 호출
![](https://velog.velcdn.com/images/psh666777/post/74605b8e-2e34-413d-98b6-83359f9b1108/image.png)
ㄴ 의존성을 재귀적으로 해결(의존성의 의존성도 객체 생성) / 의존성 : 생성자 매개변수
![](https://velog.velcdn.com/images/psh666777/post/2c9a376c-cf6d-4885-a004-6443ad4c70bb/image.png)
ㄴ 의존성의 의존성 객체생성해주는 역할
![](https://velog.velcdn.com/images/psh666777/post/e601b861-f979-41f9-af4c-03ddf3ab5a87/image.png)
ㄴ 이미해결된 의존성이 있으면 이미생성된걸 추가?
![](https://velog.velcdn.com/images/psh666777/post/d426ba27-536d-433e-88fd-868f3b160423/image.png)
ㄴ 생성자 매개변수 자료형 쳌
ㄴ if : 매개변수가 없으면 바로 객체 생성
ㄴ else : 매개변수가 있는 경우
![](https://velog.velcdn.com/images/psh666777/post/01c0d703-c89c-4a13-adb2-9104f3c5adcb/image.png)
ㄴ 의존성에 의존성이 있는경우 매퍼 객체도 생성하게끔
![](https://velog.velcdn.com/images/psh666777/post/f461e16e-9fb7-49a4-8f37-4461c24f5df8/image.png)
ㄴ 빈에 객체가 없으면 객체로 생성
ㄴ 빈에 이미 객체가 있으면 가져오기?
![](https://velog.velcdn.com/images/psh666777/post/64cdd046-118d-4ee0-bddd-539574168128/image.png)
ㄴ 재귀적으로 매개변수를 체크해보면서 객체생성
ㄴ 함수에 함수를 호출해서 의존성에 의존성을 체크하는 구조
4. HandlerMapping - HandlerMappingImpl : 요청에 맞는 컨트롤러 객체 및 메서드 조회
@Controller, @RestController 에 정의된 하기 애노테이션
- @RequestMapping : 모든 요청메서드에 매칭
- @GetMapping : GET 요청 메서드에 매칭
- @PostMapping : POST 요청 메서드에 매칭
- @PatchMapping : PATCH 요청 메서드에 매칭
- @PutMapping : PUT...
- @DeleteMapping : Delete
![](https://velog.velcdn.com/images/psh666777/post/fa236687-d4f8-415e-bb9d-676295c0d1e8/image.png)
![](https://velog.velcdn.com/images/psh666777/post/88923f0b-b07e-4b27-8a70-6b3d76f807bb/image.png)
![](https://velog.velcdn.com/images/psh666777/post/945d8b86-742e-4a01-b4fd-6ae8afa41ba4/image.png)
반환값 : 템플리 찾기
![](https://velog.velcdn.com/images/psh666777/post/be36976f-acf5-48db-95bd-f6b3c180c9cb/image.png)
ㄴ 반환값 : item - 컨트롤러객체 / m- 메서드 객체
![](https://velog.velcdn.com/images/psh666777/post/762c45a9-ef06-4962-ba8c-154d3a99c2fc/image.png)
ㄴ 컨트롤러패턴타입인지 메서드패턴타입인지 구분하는 역할
![](https://velog.velcdn.com/images/psh666777/post/94387c87-dad9-4b46-a6b2-73d1fbe72c37/image.png)
5. HandlerAdapter - HandlerAdapterImpl
1) 찾은 컨트롤러의 메서드 실행하여 유입된 요청을 처리
2) 각 컨트롤러의 반환값
- @Controller인 경우 : 템플릿(/WEB-INF/templates/ + 반환값 + ".jsp")로 경로 찾아 출력 버퍼 교체
- @RestController인 경우 : 반환값은 자바 객체가 되며 JSON 형태({"이름": "값", "이름" : "값" .. })으로 출력
- 요청데이터 메서드 매개변수 주입
- @PathVariable : 경로변수
- @RequestParam("이름") : 요청 데이터
- void setEmail(String nail)
![](https://velog.velcdn.com/images/psh666777/post/df535836-081e-4387-a536-25a55799f14a/image.png)
3) 컨트롤러를 찾지 못한 경우
- StaticResourceMapping - StaticResourceMappingImpl - 웹 정적 경로인 /webapp/static/에서 파일이 있는지 체크 하고 출력
- 웹 정적 경로에서도 못찾는다면 설정한 파일 업로드 경로에서 찾음
![](https://velog.velcdn.com/images/psh666777/post/8b7db17c-13cf-4f5c-9339-38162b2d5137/image.png)
ㄴ 리플렉션api를 활용해 동적 객체 생성 및 메서드 실행
![](https://velog.velcdn.com/images/psh666777/post/30711f2f-94d7-4ef7-aa0f-1c6ec2b834ac/image.png)
ㄴ 겟 포스트.. 거기에 따른 에노테이션을 찾음
![](https://velog.velcdn.com/images/psh666777/post/4254f3f0-9ddd-463a-8d8b-16f715f0117f/image.png)
![](https://velog.velcdn.com/images/psh666777/post/113bdb3b-b2e0-4ee2-b0b0-b8fa3488e06d/image.png)
![](https://velog.velcdn.com/images/psh666777/post/8896ba8c-65ba-42c0-9111-4442d454a3f7/image.png)
ㄴ 요청데이터가 많은경우
![](https://velog.velcdn.com/images/psh666777/post/bb12a379-5411-4b0c-9ac3-65b218dc80f4/image.png)
ㄴ 데이터클래스에 정의하면 알아서 setter호출?