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);
라우터 역할


ㄴ 핸들러 매핑 : 요청이 들어오면 해당 컨트롤러랑 메서드를 찾아줌

ㄴ 핸들러 매핑=널(해당 컨트롤러를 못찾음) -> 웹스테틱 올 업로드 경로쪽으로 라우팅 -> 그래도 없다 -> 낫파운드(404)

ㄴ 웹스테틱 올 업로드 경로

ㄴ 낫파운드(404)

ㄴ 핸들러 어댑터 : 찾았으면 찾은 컨트롤러와 메서드 기능을 실행해주는 역할

ㄴ 우리가 정의한 예외? -> 우리가 정의한 페이지 및 응답코드 보여줌
ㄴ 서블릿 기본예외는 응답코드 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(자바파일로 하면 안됨)



ㄴ 모든 파일

ㄴ 동적객체생성?

ㄴ 관리객체

ㄴ 생성자가 한개만 있어야 함
ㄴ 생성자가 2개이면 뭘 써야 할 지 알수 없기 때문에 생성자 1개만 정의하고 호출

ㄴ 의존성을 재귀적으로 해결(의존성의 의존성도 객체 생성) / 의존성 : 생성자 매개변수

ㄴ 의존성의 의존성 객체생성해주는 역할

ㄴ 이미해결된 의존성이 있으면 이미생성된걸 추가?

ㄴ 생성자 매개변수 자료형 쳌
ㄴ if : 매개변수가 없으면 바로 객체 생성
ㄴ else : 매개변수가 있는 경우

ㄴ 의존성에 의존성이 있는경우 매퍼 객체도 생성하게끔

ㄴ 빈에 객체가 없으면 객체로 생성
ㄴ 빈에 이미 객체가 있으면 가져오기?

ㄴ 재귀적으로 매개변수를 체크해보면서 객체생성
ㄴ 함수에 함수를 호출해서 의존성에 의존성을 체크하는 구조
4. HandlerMapping - HandlerMappingImpl : 요청에 맞는 컨트롤러 객체 및 메서드 조회
@Controller, @RestController 에 정의된 하기 애노테이션
- @RequestMapping : 모든 요청메서드에 매칭
- @GetMapping : GET 요청 메서드에 매칭
- @PostMapping : POST 요청 메서드에 매칭
- @PatchMapping : PATCH 요청 메서드에 매칭
- @PutMapping : PUT...
- @DeleteMapping : Delete



반환값 : 템플리 찾기

ㄴ 반환값 : item - 컨트롤러객체 / m- 메서드 객체

ㄴ 컨트롤러패턴타입인지 메서드패턴타입인지 구분하는 역할

5. HandlerAdapter - HandlerAdapterImpl
1) 찾은 컨트롤러의 메서드 실행하여 유입된 요청을 처리
2) 각 컨트롤러의 반환값
- @Controller인 경우 : 템플릿(/WEB-INF/templates/ + 반환값 + ".jsp")로 경로 찾아 출력 버퍼 교체
- @RestController인 경우 : 반환값은 자바 객체가 되며 JSON 형태({"이름": "값", "이름" : "값" .. })으로 출력
- 요청데이터 메서드 매개변수 주입
- @PathVariable : 경로변수
- @RequestParam("이름") : 요청 데이터
- void setEmail(String nail)

3) 컨트롤러를 찾지 못한 경우
- StaticResourceMapping - StaticResourceMappingImpl - 웹 정적 경로인 /webapp/static/에서 파일이 있는지 체크 하고 출력
- 웹 정적 경로에서도 못찾는다면 설정한 파일 업로드 경로에서 찾음

ㄴ 리플렉션api를 활용해 동적 객체 생성 및 메서드 실행

ㄴ 겟 포스트.. 거기에 따른 에노테이션을 찾음



ㄴ 요청데이터가 많은경우

ㄴ 데이터클래스에 정의하면 알아서 setter호출?