스프링 동작 원리

leekun·2022년 10월 20일
0

스프링(Spring)

목록 보기
3/4

스프링 전체적인 동작 구성도

1. Dispatcher Servlet

Servlet Container에서 Http 프로토콜을 통해 들어오는 모든 요청을
프레젠테이션 계층의 제일 앞에 둬서 중앙 집중식으로 처리해주는 프론트 컨트롤러(Front Controller)

  • 들어오는 모든 Request를 우선적으로 받아 처리해주는 서블릿이다.
  • HandlerMapping에게 Request에 대해 매핑할 Controller 검색을 요청한다.
  • HandlerMapping으로부터 Controller 정보를 반환받아 해당 Controller와 매핑시킨다.
  • Dispatcher라는 단어가 '배치 담당자'라는 뜻이 있듯이, 말 그대로 Request에 대해 어느 컨트롤러로 매핑시킬것인지 배치하는 역할을 한다
  • 클라이언트로부터 어떤 요청(Request)을 받으면, 모든 요청을 한 곳에서 받아서 필요한 처리를 한 후, 요청에 맞는 Handler로 요청을 보내고(Dispatch)
    해당 Handler의 실행 결과를 Http Response 형태로 만드는 역할을 한다.

2. Handler Mapping

사용자가 요청한 URL을 분석하여 이것을 처리할 Handler를 찾아주는 인터페이스

  • DispatcherServlet으로부터 검색을 요청받은 Controller를 찾아 Dispatcher Servlet으로 정보를 리턴해준다.
  • DispatcherServlet에서는 Contoller 정보를 받아 해당 Controller와 매핑시킨다.

3. Handler Adapter

Handler Mapping이 찾아낸 Handler를 호출하고 처리하는 인터페이스

  • HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행한다.

4. Handler Interceptor

Dispatcher Servlet이 컨트롤러를 호출하기 전과 후에 요청, 응답을 가공할 수 있는 일종의 필터

  • Request가 Controller에 매핑되기전 앞단에서 부가적인 로직을 끼워넣는다.
  • 주로 세션, 쿠키, 권한 인증 로직에 많이 사용된다.

5. Controller

  • Request와 매핑되는 곳이다
  • Request에 대해 어떤 로직(Service)으로 처리할 것인지를 결정하고, 그에 맞는 Service를 호출한다
  • Service Bean을 스프링 컨테이너로부터 주입받아야 한다.(Service Bean의 메소드를 호출해야 하기 때문)

6. Repository

  • DB에 접근하는 객체이다. DAO(Data Access Object)라고 부른다.
  • Service에서 DB에 접근할 수 있게 하여 데이터의 CRUD를 할 수 있게 해준다.

7. ViewResolver

Handler에서 반환하는 View 이름에 해당하는 View를 찾아내는 인터페이스

  • Controller에서 리턴한 View의 이름을 DispatcherServlet으로부터 넘겨받고, 해당 View를 렌더링한다.
  • 렌더링한 View는 DispatcherServlet으로 리턴하고, DispatcherServlet에서는 해당 View 화면을 Response 한다.(View 이름으로부터 View 객체를 맵핑하는 역할)

최종

  • 컨트롤러는 최종적으로 결과를 출력할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.
  • DispatcherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성한다.
  • 컨트롤러는 뷰의 논리적인 이름만을 return 한 후 역할을 종료한다.
  • 이를 Dispatcher Servlet의 View Resolver가 받아서 사용할 View Object를 찾고 생성하는 작업을 진행한다.

간단한 DispatcherServlet 흐름도

  1. 클라이언트의 요청을 DispatcherServlet에 전달
  2. 요청한 URL에 맞는 Controller 검색하여 HandlerMapping에 전달
  3. HandlerMapping에서 해당 Controller에 처리 요청
  4. Controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달
  5. DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색
  6. ViewResolver에서 처리 결과를 View에 전달
  7. 처리결과가 포함된 view를 DispatcherServlet에 전달
  8. DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력

Reference :
https://ee-22-joo.tistory.com/20
https://jckim-dev.tistory.com/12

profile
백엔드 개발자 지망

0개의 댓글