본문 바로가기
[개발] 프레임워크/Spring

Spring MVC

by Devsong26 2024. 6. 23.

 

Spring MVC의 전체적인 흐름은 다음과 같습니다.

  • 클라이언트 요청
    • 사용자가 브라우저에서 URL을 입력하거나 링크를 클릭하면 HTTP 요청이 서버로 전송
  • Filter 처리
    • 요청이 DispatcherServlet에 도달하기 전에 하나 이상의 필터가 수행
    • 필터는 서블릿 컨테이너 레벨에서 동작하며 요청과 응답을 가로채고, 수정하거나 로깅 등의 작업을 수행
  • DispatcherServlet
    • 모든 요청은 Spring의 DispatcherServlet으로 전달
    • DispatcherServlet은 프론트 컨트롤러로써 요청을 적절한 처리기로 라우팅하는 역할
  • HandlerMapping
    • DispatcherServlet은 요청 URL을 기반으로 어떤 컨트롤러가 이 요청을 처리할지 결정
  • Interceptor의 preHandle
    • 요청이 컨트롤러에 도달하기 전에 인터셉터의 preHandle 메서드가 실행
    • 인터셉터는 스프링 MVC의 처리 흐름에 포함되며 특정 요청 전후에 추가적인 작업을 수행
  • 컨트롤러
    • 핸들러 매핑에 의해 선택된 컨트롤러가 실제 요청을 처리
    • 컨트롤러는 비즈니스 로직을 실행 후 모델(Model)을 생성하여 뷰(View)로 전달
  • Interceptor의 PostHandle
    • 컨트롤러가 요청을 처리한 후 인터셉터의 postHandle 메서드가 실행
    • 이 단계에서 모델과 뷰 객체에 대한 추가 처리가 가능
  • 모델과 뷰 이름 반환
    • 컨트롤러는 뷰(View)의 이름과 함께 모델(Model) 객체를 반환
    • 모델은 뷰에서 사용할 데이터
  • View Resolver
    • DispatcherServlet은 View Resolver를 사용하여 논리적인 뷰 이름을 실제 뷰(View)로 변환
  • 뷰 렌더링
    • 뷰(View)는 모델(Model) 데이터를 사용하여 최종 HTML 페이지를 생성
    • 이 때 템플릿 엔진이 모델 데이터를 템플릿에 삽입하여 동적인 컨텐츠를 생성
  • Interceptor의 AfterCompletion
    • 뷰가 렌더링된 후 인터셉터의 afterCompletion 메서드가 실행
    • 이 단계에서는 리소스 정리나 로깅 같은 작업이 가능
  • Filter의 응답 처리
    • 뷰 렌더링이 완료된 후 응답이 클라이언트로 반환되기 전에 하나 이상의 필터(Filter)가 다시 실행
    • 필터는 응답을 수정하거나 로깅 등의 작업이 가능
  • 응답
    • 렌더링된 HTML 페이지가 클라이언트로 전송

 


 

자세히 알아보기

Filter 처리

  • 웹 애플리케이션의 요청과 응답을 가로채고, 변형하거나 로깅, 보안 검사 등을 수행
  • Filter는 서블릿 스펙에 정의된 기능으로 Spring MVC와 독립적으로 동작하지만 사용하면 유용
  • 작동 흐름
    • 1. 클라이언트 요청
      • 클라이언트가 웹 애플리케이션에 HTTP 요청을 보냄
    • 2. Filter Chain
      • 요청이 여러 필터로 구성된 체인(Chain)을 통과
      • 각 필터는 요청을 처리 후 다음 필터로 전달
    • 3. DispatcherServlet
      • 모든 필터를 통과한 요청은 Spring MVC의 DispatcherServlet 으로 전달
    • 4. 응답 처리
      • 컨트롤러에서 처리된 응답은 다시 필터 체인을 거쳐 클라이언트로 반환
  • 필터의 주요 사용 사례
    • 인증 및 권한 부여: 사용자 인증 및 권한 검사
    • 로깅 및 감사: 요청 및 응답 로깅, 감사 기록
    • 데이터 압축: 응답 데이터를 압축하여 전송
    • CORS 설정: Cross-Origin Resource Sharing 설정
    • 캐싱: 응답 데이터를 캐싱하여 성능 향상
    • 인코딩 설정: 요청 및 응답의 인코딩 설정 

 

DispatcherServlet

  • 모든 HTTP 요청을 처리하는 프론트 컨트롤러(Front Controller) 역할
  • 이 서블릿은 웹 애플리케이션 내의 모든 요청을 중앙에서 처리하며 적절한 핸들러로 라우팅
  • 역할
    • 요청 라우팅
      • 클라이언트로부터 받은 요청을 적절한 핸들러로 라우팅
    • 핸들러 매핑
      • 요청 URL에 따라 어떤 핸들러가 요청을 처리할지 결정
    • 핸들러 어댑터
      • 핸들러를 실행하고 결과를 처리
    • 뷰 리졸버
      • 핸들러가 반환한 논리적인 뷰 이름을 실제 뷰로 변환
    • 모델 데이터 전달
      • 모델 데이터를 뷰에 전달하여 응답을 생성
  • 작동 흐름
    • 클라이언트 요청
      • 클라이언트가 HTTP 요청을 전송
    • DispatcherServlet 수신
      • 요청이 DispatcherServlet에 도달
    • 핸들러 매핑 조회
      • DispatcherServlet은 핸들러 매핑을 통해 요청을 처리할 핸들러를 찾음
    • 핸들러 결과 처리
      • 핸들러가 반환한 모델과 뷰 이름을 처리
    • 뷰 리졸버 조회
      • DispatcherServlet은 뷰 리졸버를 사용하여 논리적인 뷰 이름을 실제 뷰로 변환
    • 뷰 렌더링
      • 변환된 뷰가 모델 데이터를 사용하여 최종 HTML 페이지를 생성
    • 응답 전송
      • 생성된 HTML 페이지가 클라이언트로 전송
  • 내부 구성 요소
    • HandlerMapping
      • 요청 URL을 기반으로 어떤 핸들러가 요청을 처리할지 결정하는 인터페이스
    • HandlerAdapter
      • 핸들러를 실행하는 인터페이스
    • ViewResolver
      • 논리적인 뷰 이름을 실제 뷰로 변환하는 인터페이스
    • ExceptionResolver
      • 요청 처리 중 발생한 예외를 처리하는 인터페이스

 

Interceptor

  • 요청 처리 흐름에서 특정 시점에 실행되는 코드 조각을 제공
  • 인터셉터는 요청이 컨트롤러에 도달하기 전과 후, 그리고 뷰가 렌더링된 후에 추가 작업을 수행
  • 횡단 관심사를 처리하는 데 유용
  • 주요 사용 사례
    • 인증 및 권한 부여
      • 요청이 컨트롤러에 도달하기 전에 사용자의 인증 상태나 권한을 검사
    • 로깅 및 감사
      • 요청 및 응답 정보를 로깅하여 감사 추적이 가능
    • 성능 모니터링
      • 요청 처리 시간을 측정하여 성능을 모니터링
    • 공통 데이터 처리
      • 모든 요청에 대해 공통적으로 필요한 데이터를 모델에 추가
    • 에러 핸들링
      • 요청 처리 중 발생한 예외를 공통적으로 처리
  • Filter와 차이점
    • 위치
      • 필터: 서블릿 컨테이너 레벨에서 동작
      • 인터셉터: Spring MVC 내부에서 동작
    • 적용 범위
      • Filter: 모든 서블릿 요청에 적용
      • 인터셉터: Spring MVC의 특정 핸들러 매핑에만 적용
    • 구현 방식
      • Filter는 javax.servlet.Filter 인터페이스를 구현
      • Interceptor는 HandlerInterceptor 인터페이스를 구현

 

HandlerMapping

  • 클라이언트의 요청을 적절한 핸들러(Controller)로 라우팅하는 역할
  • 핸들러 매핑은 요청 URL, HTTP 메서드, 요청 매개변수 등을 기반으로 요청을 처리할 핸들러를 결정
  • 핸들러 매핑의 동작 흐름
    • 클라이언트 요청: 클라이언트가 HTTP 요청을 전송
    • DispatcherServlet 수신: 요청이 DispatcherServlet에 도달
    • 핸들러 매핑 조회
      • DispatcherServlet은 구성된 여러 핸들러 매핑을 차례로 조회하여 요청을 처리할 적절한 핸들러를 찾음
    • 핸들러 결정
      • 요청 URL, HTTP 메서드, 요청 매개변수 등을 기준으로 가장 적합한 핸들러를 결정
    • 핸들러 실행
      • 결정된 핸들러를 실행하고 요청을 처리
  • 핸들러 매핑의 예외 처리
    • 핸들러 매핑 과정에서 예외가 발생하면 Spring MVC는 HandlerExceptionResolver를 통해 예외를 처리
    • 예외 처리 로직을 추가하여 특정 예외 발생 시 적절한 응답을 제공 가능

 

컨트롤러

  • 사용자의 요청을 처리하고, 비즈니스 로직을 실행하며 결과를 뷰(View)로 전달하는 역할
  • 웹 애플리케이션의 핵심 구성 요소 중 하나로 사용자의 입력을 받아서 처리 후 적절한 응답을 반환
  • 컨트롤러의 주요 역할
    • 요청 처리: HTTP 요청을 받아서 처리하고 필요한 데이터를 서비스 레이어에서 가져옴
    • 비즈니스 로직 실행: 요청에 따라 필요한 비즈니스 로직을 실행
    • 모델 데이터 준비: 비즈니스 로직의 결과를 모델에 추가하여 뷰에 전달
    • 뷰 선택: 처리 결과를 기반으로 적절한 뷰를 선택
  • 동작 흐름
    • 요청 수신: 클라이언트가 HTTP 요청을 전송
    • DispatcherServlet: 요청이 DispatcherServlet에 도달
    • 핸들러 매핑: DispatcherServlet은 요청 URL과
      매핑된 적절한 컨트롤러 메서드를 찾기 위해 HandlerMapping을 사용
    • 핸들러 어댑터: 매핑된 컨트롤러 메서드를 실행하기 위해 'HandlerAdapter'를 사용
    • 컨트롤러 실행: 컨트롤러가 메서드가 호출되어 요청을 처리 후 결과를 반환
    • 뷰 리졸버: 반환된 뷰 이름을 실제 뷰로 변환하기 위해 ViewResolver를 사용
    • 뷰 렌더링: 변환된 뷰가 모델 데이터를 사용하여 최종 응답을 생성
    • 응답 전송: 생성된 응답이 클라이언트에게 전송

 

View Resolver

  • 컨트롤러가 반환하는 논리적인 뷰 이름을 실제 물리적인 뷰로 변환하는 역할
  • View Resolver는 모델 데이터를 뷰에 전달하고 최종적으로 클라이언트에게 HTML, JSON, XML 등의 
    형식으로 응답을 생성
  • View Resolver 동작 원리
    • 컨트롤러가 반환한 뷰 이름: 컨트롤러는 논리적 뷰 이름을 반환
    • View Resolver 작동: View Resolver는 논리적 뷰 이름을 실제 물리적 뷰로 변환
    • 모델 데이터 전달: 변환된 뷰에 모델 데이터를 전달
    • 뷰 렌더링: 뷰가 클라이언트에게 전송할 최종 응답을 생성

 

View Rendering

  • 클라이언트의 요청을 처리한 후 그 결과를 적절한 형식으로 클라이언트에게 반환하는 과정
  • 모델 데이터를 사용하여 HTML, JSON, XML 형식으로 응답을 생성하는 과정
  • 주로 컨트롤러, 모델, 뷰 리졸버, 그리고 뷰의 상호작용을 통해 이뤄짐
  • 뷰 렌더링 과정
    • 클라이언트 요청: 클라이언트가 HTTP 요청을 전송
    • DispatcherServlet 수신: 요청이 DispatcherServlet에 도달
    • 핸들러 매핑: DispatcherServlet 은 요청 URL에 매핑된 컨트롤러를 찾음
    • 컨트롤러 실행: 매핑된 컨트롤러가 요청을 처리하고, 모델 데이터를 준비한 후 논리적 뷰 이름을 반환
    • 뷰 리졸버: 논리적 뷰 이름을 물리적 뷰로 변환하여 적절한 뷰 객체를 찾음
    • 뷰 렌더링: 뷰 객체가 모델 데이터를 사용하여 클라이언트에게 전송할 최종 응답을 생성

'[개발] 프레임워크 > Spring' 카테고리의 다른 글

[JPA] java 8과 hibernate의 java.time 패키지 처리  (0) 2024.07.03
Spring AOP  (1) 2024.06.26
트랜잭션 동일성 비교하기  (0) 2024.02.08
Actuator  (0) 2023.12.26
Swagger  (0) 2023.12.26