본문 바로가기

Server Programming/BackEnd Project

[패스트캠퍼스 백엔드 개발자 부트캠프] 2. 그룹 스터디 워크샵

반응형

목차

  1. 그룹 스터디 워크샵 개요
  2. 발표 내용
  3. 그룹별 발표 요약

워크샵 개요와 준비 과정

  • 워크샵 개요
    • 학습을 통해 필요하거나 중요하다고 느낀 인사이트를 공유한다.
    • 그룹 스터디를 통해 학습한 내용을 발표를 준비하며 정리한다.
  • 준비 과정
    • 워크샵 주제를 선정하기 위해 논의
    • 발표를 통해 전달하고자 하는 방향 설정
    • 멘토링을 통해 주제와 방향에 대해서 피드백
    • 발표 PPT와 스크립트 작성
    • 실제 발표 전 리허설 진행
  • 선정 주제
    • DispatcherServlet과 스프링부트의 동작 원리 그리고 스프링과의 차이점
  • 주제 선정 이유
    • 백엔드 개발을 위해 선택한 스프링 프레임워크를 그룹 스터디를 통해 익히면서 얻은 인사이트를 함께 공유하기 위해서

발표 내용

6조 : DispatcherServlet & SpringBoot

 

DispatcherServlet

DispatcherServlet

 

  • Servlet
    • 기존의 자바 웹 애플리케이션을 개발하기 위한 기술로 입력, 처리, 출력을 담당한다.
    • HttpServlet 클래스를 상속해 일반적으로 service 메서드를 재정의해 작성한다.
    • @WebServlet 어노테이션의 속성에 매핑하고자 하는 주소를 명시한다.
    • 단점으로는 일반적으로 하나의 기능을 작성하기 위해서 하나의 클래스를 작성해야하므로, 개발 시간이 오래 걸린다.
      • 즉, 하나의 클래스에서 2개의 GET요청을 받기 위해서는 조건분기를 수행해야하기 때문에 개발에 어려움이 따른다.
    • 따라서, 공통 로직을 처리하는 서블릿의 경우에도 각각의 서블릿에서 중복코드를 작성할 수 밖에 없다.
    • 이러한 단점을 해결하기 위해서 스프링에서는
      공통로직을 처리하는 Front Controller 패턴을 적용한 DispatcherServlet을 만들어서 해결한다.

요청이 들어오면 입력, 처리, 출력 처리를 수행하는 서블릿

 

  • DispatcherServlet
    • Front Controller 패턴
      • 웹 애플리케이션에서 공통적인 처리를 하기 위한 디자인 패턴으로, 클라이언트의 모든 요청을 처리하는 서블릿을 만들어 해당 서블릿에서 전처리한다. 이후, 각 요청에 대한 처리를 라우터인 컨트롤러에게 위임해 처리하는 패턴이다.
      • 중복코드를 제거하고, 애플리케이션의 유지보수성과 확장성을 높일 수 있다.
      • 스프링의 Front Controller로 클라이언트 요청을 받아 HandlerMapping, HandlerAdapter, ViewResolver 등의 컴포넌트를 사용하여 적절한 컨트롤러를 선택한다.
      • 선택한 컨트롤러가 요청을 처리한 후에 뷰(View)를 선택하여 응답하므로, 스프링에서는 DispatcherServlet을 통해 각 컨트롤러마다 공통적인 작업을 처리할 수 있다.

Front Controller역할을 수행하는 DispatcherServlet

 

DispatcherServlet의 역할

  • 맵핑
    • DispatcherServlet은 URL과 핸들러 객체 사이의 매핑 정보를 관리하는 역할을 하는 HandlerMapping이라는 인터페이스를 구현하는 여러 클래스들을 활용한다.
    • DispatcherServlet은 해당 클래스를 이용해 클라이언트의 요청 URL을 분석하여, 이를 참조하여 DispatcherServlet은 적절한 핸들러 객체를 찾아내는 역할을 수행한다.
  • 바인딩
    • DispatcherServlet은 핸들러 객체를 찾아낸 후, 이를 실행시키기 위해 필요한 파라미터 정보를 수집하고, 핸들러 객체의 메서드를 호출한다.
    • 이때, DispatcherServlet은 HandlerAdapter라는 인터페이스를 구현하는 여러 클래스들을 활용한다.
    • HandlerAdapter는 핸들러 객체가 사용할 수 있는 메서드를 선택하고, 필요한 파라미터 정보를 수집하여 핸들러 객체의 메서드를 호출한다.
    • 이를 통해 핸들러 객체가 클라이언트의 요청을 처리하고, 그 결과를 반환할 수 있도록 바인딩하는 역할을 한다.

 

HandlerMapping 인터페이스를 구현하는 클래스

더보기
  • BeanNameUrlHandlerMapping 
    • Bean 이름을 URL 경로로 사용 
    • Handler 인터페이스 또는 Controller 인터페이스 구현체를 사용할 수 있음
    •  빈 이름은 URL 경로에서 지정된 변수를 가질 수 있음 
    • 대부분의 경우 스프링의 BeanNameUrlHandlerMapping 전략을 사용하여 핸들러를 찾음 
  • SimpleUrlHandlerMapping
    • URL 경로와 핸들러 클래스 또는 빈 이름을 직접 매핑
    • Ant 스타일 경로 패턴 지원 ("/path/*", "/path/**", "/path/{variable}")
    • 핸들러는 HTTP 요청 경로가 패턴과 일치하는 경우 호출됨
  • ControllerClassNameHandlerMapping
    • Controller 클래스 이름에서 URL 패턴 생성
    • URL 패턴은 클래스 이름에서 제거된 "Controller" 단어
    • Controller 클래스 이름을 "UserController"로 지정하면 "/user" 패턴으로 매핑됨
  • RequestMappingHandlerMapping
    • Spring 3.1 이후에서 사용하는 기본 전략
    • @RequestMapping 어노테이션을 사용하여 요청 핸들러 매핑
    • 클래스 수준 또는 메서드 수준에서 사용 가능
  • RouterFunctionMapping
    • Spring 5부터 도입된 새로운 RouterFunction 기반의 매핑 전략
    • 함수형 엔드포인트에 사용 가능
    • RouterFunction을 사용하여 요청 경로와 핸들러를 직접 매핑
  • DefaultAnnotationHandlerMapping
    • Controller, @RequestMapping 어노테이션 등을 이용하여 요청을 처리할 컨트롤러를 매핑한다.
    • 이 클래스는 RequestMappingHandlerMapping 도입되기전 Spring MVC 3.0 이전 버전에서 사용

 

HandlerAdapter 인터페이스를 구현하는 클래스

더보기
  •  HttpRequestHandlerAdapter
    • HttpRequestHandler 인터페이스를 구현한 핸들러 객체를 실행시키기 위한 어댑터이다.
    • HttpRequestHandler는 HttpServletRequest와 HttpServletResponse를 파라미터로 받는 단일 메서드를 가지며, 주로 정적인 리소스 처리에 사용된다.
  • SimpleControllerHandlerAdapter
    • Controller 인터페이스를 구현한 핸들러 객체를 실행시키기 위한 어댑터이다.
    • Controller는 ModelAndView 객체를 반환하는 단일 메서드를 가지며, 주로 동적인 뷰 처리에 사용된다.
  • RequestMappingHandlerAdapter
    • @RequestMapping 애노테이션을 사용한 핸들러 객체를 실행시키기 위한 어댑터이다.
    • @RequestMapping 애노테이션을 사용하여 URL 매핑 정보를 정의하고, 여러 종류의 파라미터를 지원하는 메서드를 사용할 수 있다.
    • 스프링 3.1 버전부터는 이 어댑터가 기본적으로 사용되며, 대부분의 컨트롤러에서 사용된다.
  • AnnotationMethodHandlerAdapter
    • @RequestMapping 애노테이션을 사용한 컨트롤러 메서드의 매핑 정보를 파악하고 해당 메서드를 호출하는 어댑터
    • @Controller 애노테이션과 같은 현재 사용되는 애노테이션들이 나오기 이전인 스프링 버전 2.5 이전에 사용했다.
  • SimpleServletHandlerAdapter
    • Servlet 인터페이스를 구현한 핸들러 객체를 실행시키기 위한 어댑터입니다.
    • Servlet은 HttpServletRequest와 HttpServletResponse를 파라미터로 받는 service() 메서드를 가지며, 주로 외부 라이브러리와의 통합을 위해 사용된다.

  • HandlerAdapter에 적용된 어댑터 패턴
    • 기존의 인터페이스를 새로운 인터페이스에 맞추어 재활용하는 패턴
    • 기존의 인터페이스를 사용하는 외부 라이브러리나 프레임워크와의 통합 작업에 자주 사용한다.
    • 다양한 기능을 제공하는 인터페이스를 구현할 때도 어댑터 패턴을 적용한다.

DispatcherServlet의 역할: 맵핑, 바인딩

  • DispatcherServlet 동작 원리
    (일반적으로 사용하는  RequestMappingHandlerMapping과 RequestMappingHandlerAdapter을 이용하는 경우)
    1. 클라이언트가 브라우저를 통해 서버에 URL 요청
    2. DispatcherServlet이 HandlerMapping을 구현한 클래스 중 요청에 해당하는 Handler를 다양한 전략을 통해 적절한 핸들러를 찾는다.
    3. RequestMappingHandlerMapping 전략을 사용할 경우
      RequestMappingHandlerMapping에게 해당 요청 URL과 HTTP 메소드 정보를 전달한다.
    4. RequestMappingHandlerMapping은 요청 URL과 애플리케이션에서 RequestMapping 애노테이션이 부착된 컨트롤러 클래스에서 메소드를 조회해서 얻은 HTTP 메소드 정보를 이용하여 핸들러 메소드를 찾는다.
    5. DispatcherServlet은 찾아낸 핸들러 메서드에 HandlerAdapter를 구현한 클래스 중 다양한 전략을 통해서 바인딩한다.
    6. RequestMappingHandlerAdapter 전략을 사용할 경우
      RequestMappingHandlerAdapter는 @RequestParam, @PathVariable, @RequestBody 등의 어노테이션을 이용하여 파라미터를 찾아 바인딩한 후 핸들러 메소드를 호출한다.
    7. 핸들러 메소드가 반환한 결과를 RequestMappingHandlerAdapter가 적절한 형태로 변환하여 DispatcherServlet에게 결과를 ModelAndView에 담아 전달한다.
    8. DispatcherServlet은 반환된 ModelAndView 객체를 적절한 ViewResolver에게 전달한다.
    9. ViewResolver는 ModelAndView 객체에 담긴 View 이름을 이용하여 실제 뷰를 결정하고, View 객체를 생성하여 반환한다.
      이때, JSTL View를 사용할 경우 JstlView 클래스 반환된다.
    10. 스프링에서는 기본적으로 InternalResourceViewResolver가 등록되어있어서 JSP를 사용하는 뷰를 반환한다.
      하지만 JSP가 아닌 다른 템플릿 엔진을 사용할 경우, 해당 템플릿 엔진을 지원하는 ViewResolver를 직접 등록해야한다.
      (스프링 부트에서는 기본적으로 starter-web 의존성을 추가할 경우 타임리프를 포함하므로, ThymeleafViewResolver가 등록되고, ThymeleafViewResolver는 뷰 이름을 이용하여 Thymeleaf 템플릿 파일의 경로를 결정하고, 뷰를 렌더링한다.)
    11. ViewResolver 구현체 중 하나인 InternalResourceViewResolver가 JSP 파일의 경로를 결정하고 
      JSTL을 사용하는 경우 JstlView를 반환한다.
    12. 반환된 JstlView 클래스는 JSP 파일을 렌더링하는데, JSTL 태그들은 자바코드로 변환되어 실행된다.
      (JSTL은 서블릿 컨테이너에서 실행되는 자바 코드로 구현되어 있으며, JSTL 태그는 자바 코드로 변환되어 실행된다.
      이때 JSP 컨테이너는 JSTL 태그를 자바 코드로 변환하는 작업을 담당한다.)
    13. JstlView를 통해 렌더링 처리된 JSP를 DispatcherServlet에게 반환한다.
    14. DispatcherServlet가 클라이언트에게 뷰를 응답한다.
  • +) 핸들러 메소드
    • 요청을 처리하기 위해 컨트롤러에 선언된 어노테이션이 붙은 메서드
    • 일반적으로 @GetMapping, @PostMapping, @PutMapping 등의 어노테이션이 붙은 메서드를 칭한다.
    • 이 핸들러 메서드는 해당 요청을 처리하고, 필요한 작업을 수행한 후에는 ModelAndView나 ResponseEntity와 같은 결과를 반환한다.
    • 주로 @PathVariable 어노테이션을 사용해 URL에서 추출한 변수 값을 파라미터로 받아와서 해당하는 서비스를 호출하고, 결과를 리턴한다.  

DispatcherServlet 동작 원리

스프링에서 요청을 필터링하거나 전처리/후처리하는 기술

  1. 필터(Filter) : DispatcherServlet까지 요청이 가기 이전에 처리
    • 클라이언트의 요청이 서블릿에 도달하기 전에 요청과 응답을 가로채어 처리할 수 있는 기능을 제공하는 서블릿 API의 일부이다.
    • 스프링 MVC에서 필터는 Filter 인터페이스를 구현하여 만들 수 있다.
    • Filter 인터페이스의 doFilter() 메소드를 오버라이드하여 요청과 응답을 가로채어 필터링 작업을 수행할 수 있다.
  2. 인터셉터(Interceptor) : DispatcherServlet이 컨트롤러에게 요청을 전달하기 전과 요청을 처리한 후에 처리
    • 핸들러(Controller)의 실행 전, 후에 요청과 응답을 가로채어 처리할 수 있는 기능을 제공하는 스프링 MVC의 기능이다.
    • DispatcherServlet이 핸들러(Controller)를 호출하기 전, 후에 등록된 인터셉터를 실행시킨다.
    • 스프링 MVC에서 인터셉터는 HandlerInterceptor 인터페이스를 구현하여 만들 수 있다.
    • HandlerInterceptor 인터페이스의 preHandle(), postHandle(), afterCompletion() 메소드를 오버라이드하여 요청과 응답을 가로채어 처리할 수 있다.
    • preHandle() 메소드는 핸들러(Controller) 실행 전에 호출되며, true를 반환하면 핸들러(Controller)를 실행하고, false를 반환하면 핸들러(Controller)를 실행하지 않는다.
    • postHandle() 메소드는 핸들러(Controller) 실행 후, 뷰(View)가 렌더링되기 전에 호출된다.
    • afterCompletion() 메소드는 뷰(View)가 렌더링된 후에 호출된다.

EX)

  • 인터셉터
    •  인증이 필요한 페이지에 접근하려는 경우, 인증 여부를 검사하는 인터셉터를 등록하여 핸들러(Controller) 실행 전에 인증 여부를 확인하고, 인증되지 않은 사용자는 로그인 페이지로 이동시킬 수 있다.
  • 필터
    • 로깅, 인코딩 등과 같은 공통적인 작업을 처리하는 필터를 등록하여 요청과 응답을 필터링할 수 있다.

 

 

위의 클라이언트의 요청을 처리하는 과정에 필터와 인터셉터가 포함되는 경우

  1. 클라이언트가 브라우저를 통해 서버에 URL 요청
  2. 클라이언트의 요청은 서블릿 컨테이너로 전달되고, 이때 요청에 대한 필터 체인이 실행
  3. 필터 체인은 요청을 받아 다양한 처리를 수행한 후, 다음 필터 또는 서블릿으로 요청을 전달
  4. 이때 DispatcherServlet이 매핑된 URL과 일치하는 경우, 해당 요청은 DispatcherServlet으로 전달
  5. DispatcherServlet은 HandlerMapping을 구현한 클래스 중 요청에 해당하는 Handler를 찾기 위해 다양한 전략을 사용
  6. 요청 URL과 HTTP 메소드 정보를 전달하여 RequestMappingHandlerMapping을 이용해 핸들러 메소드를 찾는다.
  7. 이때, HandlerInterceptor 체인이 실행된다.
    HandlerInterceptor는 핸들러 실행 전/후에 수행할 작업을 정의할 수 있다.
  8. RequestMappingHandlerAdapter는 요청 파라미터를 찾아 바인딩하고, 핸들러 메소드를 호출한다.
  9. 핸들러 메소드가 반환한 결과를 RequestMappingHandlerAdapter는 적절한 형태로 변환하여 ModelAndView에 담아 반환한다.
  10. 다시 HandlerInterceptor 체인이 실행된다.
    이때는 핸들러 실행 후에 수행할 작업을 정의할 수 있다.
  11. DispatcherServlet은 반환된 ModelAndView 객체를 적절한 ViewResolver에게 전달한다.
  12. ViewResolver는 ModelAndView 객체에 담긴 View 이름을 이용하여 실제 뷰를 결정하고, View 객체를 생성하여 반환한다.
  13. 이때, ViewInterceptor 체인이 실행된다.
    ViewInterceptor는 뷰 렌더링 전/후에 수행할 작업을 정의할 수 있다.
  14. ViewResolver 구현체 중 하나인 InternalResourceViewResolver는 JSP 파일의 경로를 결정하고, JSTL을 사용하는 경우 JstlView를 반환한다.
  15. JstlView 클래스를 통해 렌더링 처리된 JSP를 DispatcherServlet에게 반환한다.
  16. DispatcherServlet은 클라이언트에게 뷰를 응답한다.
  17. 응답이 완료되면, 다시 필터 체인이 실행되어 응답에 대한 후처리를 수행한다.
    이때, ViewInterceptor 체인이 실행될 수 있다.

SpringBoot

SpringBoot
Spring과 SpringBoot

 

SpringBoot 특징 (1) Containerless (그림 출처 : 토비의 스프링부트 이해와 원리)
SpringBoot 특징 (2) Opinionated
SpringBoot 동작 원리 (1) DI와 IoC 패턴

 

SpringBoot의 동작 원리 (2) 서버 자동구성을 이용한 SpringBootApplication.run()


그룹별 발표 요약

  • 그룹 스터디 워크샵 그룹별 주제
    • 1조 : DFS 알고리즘 (Deepest First Search)
    • 2조 : MVC 패턴
    • 3조 : 스레드
    • 4조 : 정렬 알고리즘
    • 5조 : 이분탐색과 트리
    • 7조 : JWT (JSON Web Token)

 

 

 

반응형

'Server Programming > BackEnd Project' 카테고리의 다른 글

108일자 - TIL  (0) 2023.03.31
101일차 -TIL  (0) 2023.03.23
88일차 - TIL  (0) 2023.03.10
77일차 - TIL  (0) 2023.02.27
[패스트캠퍼스 백엔드 개발자 부트캠프] 1. 2개월 회고와 앞으로의 계획  (0) 2023.02.26