Spring/spring 공부

[Springboot] 3. 스프링부트 동작원리

개발자하소서 2022. 3. 7. 13:54
728x90
반응형
SMALL

📌 스프링부트 동작원리

 

1. 내장 톰켓을 가진다.

 - 톰켓을 따로 설치할 필요가 없다.

 - Socket : 운영체제가 가지고 있는 것 

 

 

2. 서블릿 컨테이너

 - URL : 자원 접근 (X)

 - URI  : 식별자 접근

 - 특정한 파일 요청을 할수없다. 요청시에는 무조건 자바를 거친다

 

클라이언트 ----> request(요청-자바) -----> 스레드 생성 - 서블릿 객체 -----> 서블릿 컨테이너(톰켓)

 

 

3. web.xml

 - ServletContext의 초기 파라미터

 - Session의 유효시간 설정

 - Servlet/JSP에 대한 정의

 - Servlet/JSP 매핑

 - Mime Type 매핑

 - Welcome File list

 - Error Pages 처리

 - 리스너/필터 설정

 - 보안

 

 - 여기에서 Servlet/JSP 매핑시(web.xml에 직접 매핑 or @WebServlet 어노테이션을 사용)에 모든 클래스에

   매핑을 적용시키에는 코드가 너무 복잡해지기에 FrontController 패턴을 이용한다. 

 

4. FrontController 패턴

 

 - 최초 앞단에서 request요청을 받아서 필요한 클래스에 넘겨준다. 왜냐면 web.xml에 다 정의하기 힘들기때문이다.

 - 이때 새로운 요청이 생기기 때문에 request와 response가 새롭게 new될 수 있다. 그래서 아래의 

   RequestDispatcher가 필요하다.

 

5. RequestDispatcher

 

  - 필요한 클래스 요청이 도달시 FrontController에 도착한 request와 response를 그대로 유지시켜준다.

 

6. DispatchServlet

 

 - FrontController 패턴을 직접 짜거나 RequestDispatcher를 직접구현할 필요가 없다.

   왜냐면 스프링에서는 DispatchServlet이 있기 때문이다.

 -  DispatchServlet = FrontController 패턴 + RequestDispatcher이다.

 -  DispatchServlet이 자동생성될때 수 많은 객체가 생성(IOC)된다. 보통 필터들이다. 해당 필터들은 내가 직접

    등록할수도 있고, 기본적으로 필요한 필터들은 자동 등록 된다.

 

7. 스프링 컨테이너

 

-  DispatchServlet에 의해 생성되어지는 수많은 객체들은 어디에서 관리될까?

 

 (1) ApplicationContext

  수 많은 객체들이 ApplicationContext에 등록된다. 이것을 IOC라고 한다. IoC란 제어의 역전을 의미한다.

  개발자가 직접 new를 통해 객체를 생성하게 된다면, 해당 객체를 가르키는 레퍼런스 변수를 관리하기 어렵다. 

  그래서 스프링이 직접 해당 객체를 관리한다. 이때 우리는 주소를 몰라도 된다. 왜냐하면 필요할 때 DI하면 되기 때문    이다. DI를 의존성 주입이라고 한다. 필요한 곳에서 ApplicationContext에 접근하여 필요한 객체를 가져올 수 있다.

  ApplicationContext는 싱글톤으로 관리되기 때문에 어디에서 접근하든 동일한 객체하는 것을 보장해 준다.

 

- ApplicationContext 의 종류에는 두가지가 있는데, 

  root-applicationContext와

  servlet-applicationContext이다.

 

-  servlet-applicationContext는 ViewResolver, Interceptor, MultipartResolver 객체를 생성하고 웹과 관련된 어노테이션

   Controller, RestController를 스캔한다. =====> 해당 파일은 DispatchServlet에 의해 실행된다.

 

- root-applicationContext는 해당 어노테이션을 제외한 어노테이션 Service, Repository등을 스캔하고 DB관련 객체를 생성한다.(스캔이란 메모리에 로딩한다는 뜻이다)

 ======> 해당 파일은 ContextLoaderListener에 의해 실행된다. ContextLoaderLister를 실행해주는 녀석은 

 web.xml이기 때문에 root-applicationContext는 servlet-applicationContext보다 먼저 로드 된다.

당연히 servlet-applicationContext에서는  root-applicationContext가 로드한 객체를 참조할 수 있지만, 그 반대는 

불가능하다. 생성 시점이 다르기 때문이다.

 

 (2) Bean Factory

 

  필요한 객체를 Bean Factory에 등록할수 있ㄷ. 여기에 등록하면 초기에 메모리에 로드 되지않고 필요할때

  getBean()이라는 메소드를 호출하여 메모리에 로드할 수 있다. 이것 또한 IoC이다. 그리고 필요할때 DI하여

  사용할 수 있다. ApplicationContext와 다른 점은 BeanFacotry에 로드되는 객체들은 미리 로드되지 않고 

  필요할 때 호출하여 로드하기에 lazy-loading이 된다는 점이다.

 

 

8. 요청 주소에 따른 적절한 컨트롤 요청(Handler Mapping)

 

 - GET요청 --> http://localhost:8080/post/1

 - 해당 주소 요청이 오면 적절한 컨트롤러 함수를 찾아 실행한다.

 

9. 응답

 

- html파일을 응답할지 Data를 응답할지 결정해야 하는데 html파일을 응답하게 되면 ViewResolver가 관여하게 된다.

- 하지만 Data를 응답하게 되면 MessageConverter가 작동하게 되는데, 메세지를 컨버팅할때 기본적인 전략은json이다. 

 

728x90
반응형
LIST