CS

[Spring]Front Controller, Dispatcher Servlet

KJihun 2023. 11. 16. 15:58
728x90

 

 

Front Controller

 

MVC 구조에서 함께 사용되는 디자인 패턴 중 하나로, 애플리케이션의 진입점(entry point) 역할을 수행하는 컨트롤러.

클라이언트가 보내는 모든 요청을 자신이 먼저 받게 되고, 이러한 요청들을 세부 컨트롤러에게 전달하는 역할을 수행한다.

Dispatcher Servlet은 spring에서 Front Controller 패턴을 구현한 것이다.

 

 

 

Dispatcher Servlet의 동작 과정

 

1. 요청 수신

클라이언트로부터 HTTP 요청이 들어오면, Dispatcher Servlet이 가장 먼저 받는다

2. Handler Mapping(핸들러 매핑)

Dispatcher Servlet은 Handler Mapping을 사용하여 해당 요청을 처리할 컨트롤러(Controller)를 결정한다.

Handler Mapping은 URL과 컨트롤러를 매핑하고, 어떤 컨트롤러가 이 요청을 처리할지 결정하는 역할을 한다.

3. Controller 호출

선택된 컨트롤러에 요청 전달.

컨트롤러는 비즈니스 로직을 실행하고 필요한 데이터를 준비한다. 서비스(Service) 등을 활용하여 작업을 수행한다.

4. Model 및 View 결정(핸들러 어댑터)

한가지 타입의 컨트롤러만 호출할 수 있는 단점을 해결하기 위한 방법으로 어댑터 패턴이 추가가 됨.

핸들러 어댑터가 있기 때문에 다양한 Handler를 처리할 수 있다.

컨트롤러는 처리한 결과를 Model 객체에 담아서 Dispatcher Servlet에 반환한다.

Dispatcher Servlet은 이 결과를 바탕으로 적절한 View를 선택한다.

5. View Resolver

View Resolver를 사용하여 선택된 View의 물리적 경로를 찾는다.

View Resolver는 뷰 이름을 통해 실제 View 파일의 위치를 결정하는 역할을 한다.

6. View Rendering

선택된 View에 모델 데이터를 전달하고, 이를 이용하여 최종적인 응답 컨텐츠(HTML, JSON 등)를 생성한다.

7. 응답 반환

Dispatcher Servlet은 최종적으로 생성된 응답을 클라이언트에게 반환하여 요청에 대한 처리를 완료한다

 

 

장점

1. 중앙 집중화된 요청 처리

모든 클라이언트 요청을 하나의 진입점에서 받아들이므로 애플리케이션의 흐름을 통제하고 각 요청을 적절한 핸들러(컨트롤러)로 라우팅할 수 있다.

2. 공통 기능의 중앙 집중화

인증, 로깅, 보안 등과 같은 공통적인 기능을 Front Controller에서 처리할 수 있어 코드 중복을 방지하고 유지보수성을 향상시킬 수 있다.

3. 비즈니스 로직과 UI 분리

필요한 비즈니스 로직과 UI(뷰)를 분리시킴으로써 애플리케이션의 관심사를 분리할 수 있다.

4. 중앙 집중화된 예외 처리

애플리케이션 전체에서 발생하는 예외를 Front Controller에서 처리하여 일관된 방식으로 오류를 관리할 수 있다.

 

 

단점

1. Single Point of Failure

중앙 집중형 방식이기에 Fan-in이 높아지며, 결합도가 상승하게 되어 모든 controller는 Front Controller에 의존하게 된다.

즉, Front Controller가 실패하면 전체 애플리케이션의 동작에 영향을 미치게 된다.

2. 성능 저하 가능성

모든 요청이 Front Controller를 통과하기 때문에, 처리할 요청의 양이 많은 경우 이를 처리하기 위해 추가적인 리소스가 필요할 수 있고, 성능 저하가 발생할 수 있다.

3. 오버헤드와 불필요한 처리

Front Controller를 통과하는 모든 요청은 추가적인 오버헤드가 발생할 수 있다. 또한, 모든 요청이 Front Controller를 통과하기 때문에 일부 요청에 대해 불필요한 처리가 발생할 수 있다.

4. 유연성 감소

모든 요청이 하나의 컨트롤러로 집중되기 때문에, 각 요청에 따라 다른 처리 방식이 필요한 경우 유연성이 감소할 수 있다.

'CS' 카테고리의 다른 글

[Spring] POJO  (0) 2023.11.20
[Spring] Filter와 Interceptor  (0) 2023.11.20
[mySQL] 면접 예상 질문  (0) 2023.11.07
[Network] websocket & stomp, 실시간 통신  (0) 2023.11.07
[JPA] N+1  (0) 2023.10.30