스프링 구조 보충설명
프론트 컨트롤러 패턴 (Front Controller Pattern)
1. 프론트 컨트롤러 패턴이란?
프론트 컨트롤러 패턴은 웹 애플리케이션에서 모든 클라이언트 요청을 단일 진입점(프론트 컨트롤러)을 통해 처리하는 디자인 패턴입니다. 프론트 컨트롤러는 클라이언트 요청을 받아서 적절한 컨트롤러로 요청을 전달하고, 응답을 생성하여 반환하는 역할을 합니다.
2. 프론트 컨트롤러 패턴의 특징
2.1 단일 진입점 (Single Entry Point)
모든 클라이언트 요청은 프론트 컨트롤러를 통해서만 처리됩니다.
단일 서블릿(프론트 컨트롤러 서블릿)이 모든 요청을 받아 적절한 컨트롤러로 요청을 전달합니다.
2.2 요청에 따른 컨트롤러 호출
프론트 컨트롤러는 요청 정보를 기반으로 요청에 맞는 컨트롤러를 찾아 호출합니다.
클라이언트가 요청한 URL이나 HTTP 메서드 정보를 분석하여 컨트롤러를 매핑.
2.3 공통 처리 가능
모든 요청이 프론트 컨트롤러를 거치므로 공통 기능(로깅, 인증, 인가, 예외 처리 등)을 중앙에서 처리할 수 있습니다.
요청과 응답에 대한 공통 로직을 하나의 진입점에서 관리할 수 있어 중복 코드가 줄어듭니다.
2.4 서블릿의 역할 분리
프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 직접 구현할 필요가 없습니다.
프론트 컨트롤러가 서블릿 역할을 대신 수행하고, 각 컨트롤러는 요청 처리 로직에만 집중할 수 있습니다.
3. 프론트 컨트롤러 패턴의 동작 흐름
프론트 컨트롤러 패턴의 동작은 다음과 같은 흐름을 따릅니다:
클라이언트 요청
사용자가 웹 애플리케이션에 요청을 보냅니다. (예:
/user/login
)
프론트 컨트롤러 서블릿 요청 처리
프론트 컨트롤러(서블릿)가 모든 요청을 받아 처리합니다.
컨트롤러 선택 및 호출
프론트 컨트롤러는 요청 URL이나 요청 데이터를 분석하여, 요청에 적합한 컨트롤러를 찾아 호출합니다.
비즈니스 로직 처리
호출된 컨트롤러는 요청 데이터를 기반으로 비즈니스 로직을 처리하고, 결과를 반환합니다.
뷰로 이동
프론트 컨트롤러는 컨트롤러의 결과를 기반으로 적절한 뷰(View)를 선택하고 렌더링하여 클라이언트에게 응답을 보냅니다.
4. 프론트 컨트롤러 패턴의 장점
4.1 공통 처리 중앙화
모든 요청이 프론트 컨트롤러를 통해 처리되므로, 로깅, 인증, 인가, 예외 처리 등의 공통 로직을 중앙에서 관리할 수 있습니다.
4.2 코드 중복 감소
공통 로직이 프론트 컨트롤러에 집중되므로, 각 컨트롤러에서 중복 코드가 줄어듭니다.
4.3 확장성 및 유지보수성
컨트롤러 추가 및 변경 시 프론트 컨트롤러만 수정하면 되므로, 애플리케이션의 확장성과 유지보수성이 향상됩니다.
4.4 서블릿 코드 분리
서블릿 코드는 프론트 컨트롤러에만 집중되고, 나머지 컨트롤러는 순수한 비즈니스 로직 처리에만 집중할 수 있습니다.
5. 스프링 웹 MVC와 프론트 컨트롤러 패턴
5.1 스프링의 DispatcherServlet
스프링 웹 MVC는 프론트 컨트롤러 패턴을 기반으로 설계되었습니다.
스프링에서 프론트 컨트롤러 역할을 하는 클래스는
DispatcherServlet
입니다.
5.2 DispatcherServlet의 동작 흐름
클라이언트의 모든 요청은
DispatcherServlet
이 처리합니다.DispatcherServlet
은 요청 정보를 기반으로, 요청에 알맞은 **Handler(Controller)**를 찾아 호출합니다.컨트롤러가 비즈니스 로직을 처리한 결과를 반환합니다.
DispatcherServlet
은 결과를 기반으로 적절한 View를 선택하고 렌더링합니다.최종적으로 클라이언트에게 응답을 반환합니다.
5.3 DispatcherServlet 설정 예시
스프링에서 DispatcherServlet
은 일반적으로 다음과 같이 설정됩니다:
5.4 스프링에서 공통 처리 예시
스프링에서는 **인터셉터(HandlerInterceptor)**를 사용하여 공통 로직을 처리할 수 있습니다.
6. 프론트 컨트롤러 패턴의 예제 코드
6.1 간단한 프론트 컨트롤러 구현
6.2 컨트롤러 구현
DispatcherServlet - 스프링 MVC의 핵심
1. DispatcherServlet이란?
DispatcherServlet은 스프링 웹 MVC에서 모든 요청과 응답의 중심 역할을 하는 **프론트 컨트롤러(Front Controller)**입니다.
클라이언트의 모든 요청은 DispatcherServlet을 통해 처리되며, 적절한 핸들러(Controller)를 찾아 실행하고, 처리 결과를 View로 전달하여 응답합니다.
2. DispatcherServlet의 특징
2.1 단일 진입점
모든 클라이언트 요청이 DispatcherServlet을 통해 전달되므로 단일 진입점을 제공합니다.
이로 인해 공통 처리 로직(예: 로깅, 인증, 예외 처리 등)을 중앙 집중적으로 관리할 수 있습니다.
2.2 프론트 컨트롤러 패턴 기반
DispatcherServlet은 프론트 컨트롤러 패턴을 구현한 대표적인 예입니다.
요청을 받아서, 적절한 컨트롤러(Handler)를 찾아 호출하고, 처리 결과를 적절한 뷰(View)로 매핑하여 클라이언트에게 응답을 반환합니다.
3. DispatcherServlet의 동작 순서
3.1 요청 처리 흐름
클라이언트 요청 수신
클라이언트가 요청을 보내면, 요청은 먼저 DispatcherServlet으로 전달됩니다.
핸들러 매핑 조회
DispatcherServlet은 HandlerMapping을 통해 요청 URL에 매핑된 핸들러(Controller)를 조회합니다.
등록된 핸들러가 없으면 404 에러를 반환합니다.
핸들러 실행
적합한 핸들러(Controller)를 찾아서 호출합니다.
컨트롤러는 비즈니스 로직을 처리한 결과를
ModelAndView
객체로 반환합니다.
뷰 리졸버를 통해 뷰 찾기
DispatcherServlet은 ViewResolver를 사용하여
ModelAndView
에 담긴 뷰 이름에 해당하는 뷰 객체를 찾습니다.
뷰 렌더링
찾은 뷰 객체를 사용하여 클라이언트에게 렌더링된 결과를 반환합니다.
3.2 DispatcherServlet 동작 단계의 상세 설명
1) 클라이언트 요청 수신
모든 요청은
web.xml
에 설정된 DispatcherServlet으로 전달됩니다.URL 패턴이 DispatcherServlet에 매핑된 경우 요청은 반드시 DispatcherServlet을 거쳐 처리됩니다.
2) 핸들러 매핑
DispatcherServlet은 요청 URL에 해당하는 핸들러를 찾기 위해 HandlerMapping을 사용합니다.
예:
/user/login
요청 →UserController
의 메서드 호출
3) 핸들러 실행
요청을 처리할 컨트롤러(핸들러)를 실행하여 비즈니스 로직을 수행합니다.
핸들러는 처리 결과를 ModelAndView 객체로 반환합니다.
4) 뷰 리졸버 처리
ModelAndView
에서 반환된 뷰 이름을 기반으로 ViewResolver가 실제 뷰 파일(예: JSP)을 찾습니다.예:
login
뷰 이름 →/WEB-INF/views/login.jsp
5) 뷰 렌더링 및 응답 반환
뷰 객체가 클라이언트에게 렌더링된 결과를 반환합니다.
예: HTML, JSON, XML 등의 형식으로 응답.
4. DispatcherServlet 설정
web.xml에 설정
DispatcherServlet은 일반적으로 web.xml
에 다음과 같이 등록됩니다:
url-pattern: 모든 요청을 DispatcherServlet이 처리하도록
/
로 매핑.
5. DispatcherServlet의 구성 요소
5.1 주요 구성 요소
HandlerMapping
URL 요청과 컨트롤러(핸들러)를 매핑하는 역할.
스프링은 기본적으로 다양한 HandlerMapping 구현체를 제공합니다.
HandlerAdapter
핸들러(Controller)와 DispatcherServlet 간의 호환성을 처리.
요청을 적절히 변환하여 컨트롤러를 호출하고 결과를 반환.
ViewResolver
뷰 이름을 실제 뷰 파일로 변환하는 역할.
예:
login
→/WEB-INF/views/login.jsp
ModelAndView
컨트롤러에서 반환하는 데이터 모델과 뷰 정보를 담는 객체.
6. DispatcherServlet 예제 코드
간단한 컨트롤러와 매핑 예제
ViewResolver 설정
7. DispatcherServlet의 장점
7.1 요청 처리 단일화
모든 요청을 단일 진입점으로 처리하여 요청 관리가 효율적.
7.2 공통 처리 용이
인증, 권한 확인, 로깅 등의 공통 로직을 DispatcherServlet에서 처리 가능.
7.3 확장성 및 유지보수성
컨트롤러 추가 및 변경 시 DispatcherServlet 설정만 변경하면 됨.
1. HandlerMapping
1.1 HandlerMapping이란?
HandlerMapping은 클라이언트 요청(예: URL 패턴)과 이를 처리할 컨트롤러(Handler)를 매핑하는 역할을 합니다.
클라이언트의 요청이 들어오면, DispatcherServlet이 HandlerMapping을 통해 요청 URL에 매핑된 컨트롤러를 찾아서 반환합니다.
1.2 HandlerMapping의 주요 동작
요청 URL과 컨트롤러 매핑 조회
클라이언트가 보낸 요청의 URL을 기반으로 어떤 컨트롤러(Handler)가 요청을 처리할지 결정합니다.
예를 들어,
/user/login
요청이 들어오면 HandlerMapping은 해당 요청을 처리할UserController
의 특정 메서드로 매핑합니다.
핸들러 반환
매핑된 컨트롤러(핸들러)를 DispatcherServlet에 반환합니다.
만약 요청 URL과 매핑된 컨트롤러가 없으면 404 에러를 반환합니다.
1.3 HandlerMapping의 우선순위
HandlerMapping은 요청을 매핑할 때 설정된 우선순위를 따릅니다. 스프링에서는 기본적으로 다음과 같은 방식으로 요청을 매핑합니다:
애노테이션 기반 매핑
@RequestMapping
또는@GetMapping
,@PostMapping
등으로 등록된 컨트롤러.예:
스프링 빈 이름 기반 매핑
@Component("/mvc/pattern")
처럼 직접 URL을 매핑하는 방식.사용 빈도가 낮음.
1.4 HandlerMapping의 역할
DispatcherServlet과 Controller 간의 연결 역할을 합니다.
클라이언트 요청 →
HandlerMapping
→ 매핑된 컨트롤러 반환 → DispatcherServlet이 핸들러 실행.
2. HandlerAdapter
2.1 HandlerAdapter란?
HandlerAdapter는 DispatcherServlet이 반환받은 컨트롤러(Handler)를 실행하는 데 필요한 추가 작업을 처리합니다.
반환된 핸들러가 어떤 방식으로 요청을 처리해야 하는지 결정하고, 적절한 메서드를 호출합니다.
2.2 HandlerAdapter의 주요 동작
컨트롤러 실행
HandlerMapping에서 반환된 컨트롤러의 메서드를 호출하여 요청을 처리합니다.
예를 들어,
@RequestMapping
에 매핑된 메서드를 실행합니다.
결과 반환
컨트롤러 메서드의 실행 결과(
ModelAndView
또는ResponseEntity
)를 DispatcherServlet에 반환합니다.반환된 결과는 이후 ViewResolver를 통해 클라이언트로 전달됩니다.
2.3 HandlerAdapter의 역할
DispatcherServlet과 Handler의 호환성 처리:
다양한 종류의 컨트롤러를 처리할 수 있도록 중간 역할을 수행합니다.
예:
@RequestMapping
,SimpleControllerHandler
,HttpRequestHandler
등 여러 컨트롤러 유형을 지원.
3. HandlerMapping과 HandlerAdapter의 연관 관계
3.1 동작 흐름
DispatcherServlet → HandlerMapping
DispatcherServlet은 요청 URL에 매핑된 컨트롤러를 찾기 위해 HandlerMapping을 호출.
HandlerMapping은 요청 URL과 매핑된 컨트롤러를 반환.
DispatcherServlet → HandlerAdapter
DispatcherServlet은 HandlerMapping에서 반환된 컨트롤러를 실행하기 위해 HandlerAdapter를 호출.
HandlerAdapter는 컨트롤러의 메서드를 호출하여 요청을 처리.
HandlerAdapter → DispatcherServlet
HandlerAdapter는 처리 결과(
ModelAndView
또는ResponseEntity
)를 DispatcherServlet에 반환.
DispatcherServlet → ViewResolver
처리 결과를 바탕으로 ViewResolver를 통해 적절한 뷰를 렌더링.
3.2 관계를 통한 동작 구조
HandlerMapping: "누가 이 요청을 처리해야 하는가?"에 대한 답을 제공.
HandlerAdapter: "요청을 처리하는 방법은 무엇인가?"를 실행.
4. 예제 코드
4.1 DispatcherServlet 설정
4.2 HandlerMapping 예제
4.3 HandlerAdapter 처리 예제
HandlerAdapter는 자동으로 @RequestMapping
에 매핑된 메서드를 호출합니다:
5. 주요 장점
유연성: 다양한 방식으로 요청을 매핑할 수 있고, 다양한 컨트롤러를 처리할 수 있음.
확장성: 새로운 매핑 방식 또는 컨트롤러 유형 추가 시 DispatcherServlet의 변경 없이 HandlerMapping 또는 HandlerAdapter만 확장하면 됨.
결합도 감소: DispatcherServlet과 컨트롤러 간의 강한 결합을 줄이고, HandlerMapping과 HandlerAdapter를 통해 느슨한 결합 유지.
Last updated