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. 응답 처리
- 컨트롤러에서 처리된 응답은 다시 필터 체인을 거쳐 클라이언트로 반환
- 1. 클라이언트 요청
- 필터의 주요 사용 사례
- 인증 및 권한 부여: 사용자 인증 및 권한 검사
- 로깅 및 감사: 요청 및 응답 로깅, 감사 기록
- 데이터 압축: 응답 데이터를 압축하여 전송
- CORS 설정: Cross-Origin Resource Sharing 설정
- 캐싱: 응답 데이터를 캐싱하여 성능 향상
- 인코딩 설정: 요청 및 응답의 인코딩 설정
DispatcherServlet
- 모든 HTTP 요청을 처리하는 프론트 컨트롤러(Front Controller) 역할
- 이 서블릿은 웹 애플리케이션 내의 모든 요청을 중앙에서 처리하며 적절한 핸들러로 라우팅
- 역할
- 요청 라우팅
- 클라이언트로부터 받은 요청을 적절한 핸들러로 라우팅
- 핸들러 매핑
- 요청 URL에 따라 어떤 핸들러가 요청을 처리할지 결정
- 핸들러 어댑터
- 핸들러를 실행하고 결과를 처리
- 뷰 리졸버
- 핸들러가 반환한 논리적인 뷰 이름을 실제 뷰로 변환
- 모델 데이터 전달
- 모델 데이터를 뷰에 전달하여 응답을 생성
- 요청 라우팅
- 작동 흐름
- 클라이언트 요청
- 클라이언트가 HTTP 요청을 전송
- DispatcherServlet 수신
- 요청이 DispatcherServlet에 도달
- 핸들러 매핑 조회
- DispatcherServlet은 핸들러 매핑을 통해 요청을 처리할 핸들러를 찾음
- 핸들러 결과 처리
- 핸들러가 반환한 모델과 뷰 이름을 처리
- 뷰 리졸버 조회
- DispatcherServlet은 뷰 리졸버를 사용하여 논리적인 뷰 이름을 실제 뷰로 변환
- 뷰 렌더링
- 변환된 뷰가 모델 데이터를 사용하여 최종 HTML 페이지를 생성
- 응답 전송
- 생성된 HTML 페이지가 클라이언트로 전송
- 클라이언트 요청
- 내부 구성 요소
- HandlerMapping
- 요청 URL을 기반으로 어떤 핸들러가 요청을 처리할지 결정하는 인터페이스
- HandlerAdapter
- 핸들러를 실행하는 인터페이스
- ViewResolver
- 논리적인 뷰 이름을 실제 뷰로 변환하는 인터페이스
- ExceptionResolver
- 요청 처리 중 발생한 예외를 처리하는 인터페이스
- HandlerMapping
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 |